zoukankan      html  css  js  c++  java
  • MHA 的 Binlog Server & VIP 漂移

    Binlog Server

    考虑一个问题,如果主库服务器宕机,为了保证数据不丢失,Binlog 如何保存?

    另外搭建一台 Binlog Server 服务器,实时同步主库的 Binlog,保证主库 Binlog 不丢失,

    此处为了节省资源,将 Binlog Server 与 从库服务器放在一起,

    要注意的是,master_binlog_dir 的位置要重新指定一个目录,否则会与从库的 /usr/local/mysql/data 目录下的 Binlog 搞混

    在 MHA 配置文件中配置 Binlog Server

    [root@dbtest03 mha]# cat app1.conf
    # 配置 Binlog Server 标签,同步主库的 Binlog
    [binlog1]
    hostname=172.16.1.123
    # 不能跟当前服务器的数据库的 Binlog 存放目录一样,需要另外新建一个目录
    master_binlog_dir=/binlog/
    
    [server default]
    manager_log=/etc/mha/app1/manager
    manager_workdir=/etc/mha/app1
    master_binlog_dir=/usr/local/mysql/data
    master_ip_failover_script=/etc/mha/master_ip_failover
    password=mha
    ping_interval=2
    repl_password=123
    repl_user=rep
    ssh_user=root
    user=mha
    
    [server1]
    hostname=172.16.1.121
    port=3306
    
    [server2]
    hostname=172.16.1.122
    port=3306
    
    [server3]
    hostname=172.16.1.123
    port=3306
    

    创建 Binlog 存放目录

    [root@dbtest03 ~]# mkdir /binlog
    

    实时传输主库 Binlog 命令

    # 进入该目录(一定进入该目录,再执行命令)
    [root@dbtest03 ~]# cd /binlog/
    # 备份 binlog(实时传输)
    [root@dbtest03 binlog]# mysqlbinlog  -R --host=172.16.1.121 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
    
    # 或者用如下一条命令解决
    [root@dbtest03 mha]# cd /binlog &&  mysqlbinlog -R --host=172.16.1.121 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
    

    重启 MHA

    [root@dbtest03 binlog]# masterha_stop --conf=/etc/mha/app1.cnf
    Stopped app1 successfully.
    
    [root@dbtest03 binlog]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
    

    检验 MHA Manager 服务器 Binlog 同步

    # 主库
    [root@dbtest02 ~]# mysql -p12345
    mysql> create database mha;
    Query OK, 1 row affected (0.01 sec)
    
    [root@dbtest02 ~]# ll /usr/local/mysql/data/mysql-bin.000008 
    -rw-rw---- 1 mysql mysql 67576 Jul 28 10:33 /usr/local/mysql/data/mysql-bin.000008
    
    # MHA Manager 服务器查看 binlog
    [root@dbtest03 binlog]# ll
    total 96
    -rw-rw---- 1 root root   852 Jul 28 10:30 mysql-bin.000001
    -rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000002
    -rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000003
    -rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000004
    -rw-rw---- 1 root root   465 Jul 28 10:30 mysql-bin.000005
    -rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000006
    -rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000007
    -rw-rw---- 1 root root 67576 Jul 28 10:33 mysql-bin.000008
    

    主库宕机恢复自动化脚本

    主要功能:

    主库宕机,可以自动恢复为从库,重启 MHA 服务,并使 Binlog Server 同步的 binlog,重新指定到新主库的 IP 地址,同步新主库的 binlog

    [root@dbtest01 ~]# cat /tmp/start_mha.sh
    #!/bin/bash
    mysql_pid=`ps -ef | grep [m]ysqld | wc -l`
    
    # 如果挂掉,重启;如果没有挂掉,杀掉重启
    if [ $mysql_pid -eq 0 ];then
        systemctl start mysqld
    else
        pkill mysqld
        systemctl stop mysqld
        systemctl start mysqld
    fi
    
    # 重新配置主从
    change=`ssh 172.16.1.123 "grep 'CHANGE MASTER TO' /etc/mha/app1/manager | tail -1 | sed s#xxx#123#g" |awk -F: '{print $4}'`
    
    mysql -uroot -p12345 -e "$change;start slave;"
    # 将完整的配置文件(包括宕机主库)恢复
    ssh 172.16.1.123 "cp /etc/mha/app1.conf.bak /etc/mha/app1.conf"
    # 获取新的主库的地址(从 MHA 日志中回复)
    master_host=`ssh 172.16.1.123 "grep  'as a new master' /etc/mha/app1/manager  | tail -1"| awk -F '[ ,(]' '{print $2}'`
    # 恢复 Binlog Server,重新同步新主库的 Binlog
    ssh 172.16.1.123 "cd /binlog &&  mysqlbinlog -R --host=${master_host} --user=mha --password=mha --raw --stop-never mysql-bin.000001" &
    # 恢复 MHA 功能
    ssh 172.16.1.123 "nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &"
    

    SSH 报错

    碰到如下报错,无法 SSH 到 Binlog Server,但是 SSH 连接以及健康检查是完全没有问题的,

    SSH 在连接自己服务器时,会有反向解析,所以连接速度很慢,MHA 会误认为无法 SSH 到 Binlog Server 服务器上,所以报错,这个报错会导致 MHA 的进程挂掉 。

    解决方案:

    优化一下 SSH sshd_config 里面 添加 USEDNS = no 以及 修改原 GSSAPIAuthentication yes 为 GSSAPIAuthentication no

    VIP 漂移

    VIP 漂移的两种方式

    1.Keeplaived 的方式

    2.MHA 自带的脚本进行 VIP 漂移

    2.配置 MHA 读取 VIP 自动漂移 脚本

    # 编辑配置文件
    [root@dbtest03 ~]# vim /etc/mha/app1.cnf
    # 在 [server default] 标签下添加
    [server default]
    manager_log=/etc/mha/app1/manager
    manager_workdir=/etc/mha/app1
    master_binlog_dir=/usr/local/mysql/data
    # 使用 MHA 漂移脚本
    master_ip_failover_script=/etc/mha/master_ip_failover
    password=mha
    ping_interval=2
    repl_password=123
    repl_user=rep
    ssh_user=root
    user=mha
    
    [server1]
    hostname=172.16.1.121
    port=3306
    
    [server2]
    hostname=172.16.1.122
    port=3306
    
    [server3]
    hostname=172.16.1.123
    port=3306
    

    编写 VIP 自动漂移脚本

    # 在二进制安装包中,默认脚本存放在下面目录
    [root@dbtest01 ~]# ll mha4mysql-manager-0.56/samples/scripts/
    total 32
    -rwxr-xr-x 1 4984 users  3648 Apr  1  2014 master_ip_failover
    
     
    # 编辑脚本
    [root@dbtest03 mha]# vim master_ip_failover
    #!/usr/bin/env perl
    
    use strict;
    use warnings FATAL => 'all';
    
    use Getopt::Long;
    
    my (
        $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
        $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
    );
    
    my $vip = '172.16.1.55/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
    
    GetOptions(
        'command=s'          => $command,
        'ssh_user=s'         => $ssh_user,
        'orig_master_host=s' => $orig_master_host,
        'orig_master_ip=s'   => $orig_master_ip,
        'orig_master_port=i' => $orig_master_port,
        'new_master_host=s'  => $new_master_host,
        'new_master_ip=s'    => $new_master_ip,
        'new_master_port=i'  => $new_master_port,
    );
    
    exit &main();
    
    sub main {
    
        print "
    
    IN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===
    
    ";
    
        if ( $command eq "stop" || $command eq "stopssh" ) {
    
            my $exit_code = 1;
            eval {
                print "Disabling the VIP on old master: $orig_master_host 
    ";
                &stop_vip();
                $exit_code = 0;
            };
            if ($@) {
                warn "Got Error: $@
    ";
                exit $exit_code;
            }
            exit $exit_code;
        }
        elsif ( $command eq "start" ) {
    
            my $exit_code = 10;
            eval {
                print "Enabling the VIP - $vip on the new master - $new_master_host 
    ";
                &start_vip();
                $exit_code = 0;
            };
            if ($@) {
                warn $@;
                exit $exit_code;
            }
            exit $exit_code;
        }
        elsif ( $command eq "status" ) {
            print "Checking the Status of the script.. OK 
    ";
            exit 0;
        }
        else {
            &usage();
            exit 1;
        }
    }
    
    sub start_vip() {
        `ssh $ssh_user@$new_master_host " $ssh_start_vip "`;
    }
    sub stop_vip() {
         return 0  unless  ($ssh_user);
        `ssh $ssh_user@$orig_master_host " $ssh_stop_vip "`;
    }
    
    sub usage {
        print
        "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port
    ";
    }
    
    
    # 将这个脚本授权为可执行文件
    [root@dbtest03 mha]# chmod 755 master_ip_failover
    
     
    [root@dbtest03 mha]# dos2unix master_ip_failover 
    dos2unix: converting file master_ip_failover to Unix format ...
    

    手动绑定主库 VIP

    [root@dbtest01 ~]# ifconfig eth1:1 172.16.1.55/24
    [root@dbtest01 ~]# ip a s eth1
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:6e:52:99 brd ff:ff:ff:ff:ff:ff
        inet 172.16.1.121/24 brd 172.16.1.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet 172.16.1.55/24 brd 172.16.1.255 scope global secondary eth1:1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe6e:5299/64 scope link
           valid_lft forever preferred_lft forever
    
    
    # 解绑 VIP 命令(不用执行)
    [root@dbtest01 ~]# ifconfig eth1:1 down
    

    重启 MHA

    # 启动 MHA
    [root@dbtest03 ~]# nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
    
    # 启动失败:
    # 1.检查配置文件语法是否正确
    # 2.授权是否正确
    	[root@dbtest03 mha]# chmod 755 master_ip_failover
    # 3.将脚本中的换行符 转为 unix格式(原可能是 windows 格式)
    	[root@dbtest03 mha]# dos2unix master_ip_failover 
    	dos2unix: converting file master_ip_failover to Unix format ...
    

    测试 VIP 漂移

    # 停止主库
    [root@dbtest01 ~]# systemctl stop mysqld.service
    
    # 查看切换成主库的ip地址
    [root@dbtest02 ~]# ip a s eth1
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:6e:52:99 brd ff:ff:ff:ff:ff:ff
        inet 172.16.1.121/24 brd 172.16.1.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet 172.16.1.55/24 brd 172.16.1.255 scope global secondary eth1:1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe6e:5299/64 scope link
           valid_lft forever preferred_lft forever
    
  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13394242.html
Copyright © 2011-2022 走看看