美文网首页
主从复制 & MHA

主从复制 & MHA

作者: 慕知 | 来源:发表于2021-03-17 08:50 被阅读0次
    主从复制原理图

    一,mysql主从复制

    (1)场景一(主从复制 _ 全新环境下)

    主数据库:
    
    
    [root@\ db01~]# vim /etc/my.cnf
    # 在[mysqld]字段增加两行
    ...
    server_id=1
    log_bin=mysql-bin
    ...
    
    
    
    
    #进入mysql,设置权限
    
    mysql> grant replication slave on *.* to slave@'172.16.1.%' identified by 'slavepwd';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> flush privileges;
    
    
    #重启服务
    [root@\ db01~]# systemctl restart mysqld
    
    
    
    
    # 查看主库binlog信息
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |      120 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    
    
    # mysql-bin.000001日志文件
    # 120   从120行开始
    
    
    
    
    
    
    
    
    从数据库:
    [root@\ db02~]# vim /etc/my.cnf
    server_id=2
    
    # 只需要设置server_id,主从id号数字大小没有要求,但是最好不要重复
    
    
    [root@\ db02~]# systemctl restart mysqld
    #修改完配置重启mysqld
    
    
    #执行change master to 语句
    mysql> change mater to
           master_host='172.16.1.51',
           master_user='slave',
           master_port=3306   # 默认可省略
           master_password='slavepwd',
           master_log_file='mysql-bin.000001',
           master_log_pos=120;
    
    
    # 开启同步功能
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    
    # 查看主从复制的相关信息
    mysql> show slave statues\G
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'statues' at line 1
    mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.16.1.51
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 2566
                   Relay_Log_File: mysqld-relay-bin.000002
                    Relay_Log_Pos: 462
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 1146
                       Last_Error: Error 'Table 'discuz.pre_common_member_secwhite' doesn't exist' on query. Default database: 'discuz'. Query: 'DELETE FROM `discuz`.`pre_common_member_secwhite` /* generated by server, implicitly emptying in-memory table */'
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 299
                  Relay_Log_Space: 2903
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File:
               Master_SSL_CA_Path:
                  Master_SSL_Cert:
                Master_SSL_Cipher:
                   Master_SSL_Key:
            Seconds_Behind_Master: NULL
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 1146
                   Last_SQL_Error: Error 'Table 'discuz.pre_common_member_secwhite' doesn't exist' on query. Default database: 'discuz'. Query: 'DELETE FROM `discuz`.`pre_common_member_secwhite` /* generated by server, implicitly emptying in-memory table */'
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1
                      Master_UUID: 4a48ddef-7f01-11eb-a9b3-000c29abb309
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State:
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp: 210315 10:10:47
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set:
                Executed_Gtid_Set:
                    Auto_Position: 0
    1 row in set (0.00 sec)
    
    
    
    主要看这两个线程是否启动:
                 Slave_IO_Running: Yes
                 Slave_SQL_Running: Yes
    
    
    
    
    
    
    
    ===========================
    以上测试,db01的数据已经开始同步给db02
    
    [root@\ db01~]# mysql -uroot -p123456
    
    mysql> create database monday;
    Query OK, 1 row affected (0.00 sec)
    
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | monday             |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    
    
    
    
    #db02查看
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | monday             |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    

    (2)场景二(主从复制 _ mysql已经使用一段时间)

    #导出数据(冷备份执行)
    [root@\ db01~]# mysqldump -uroot -p123456 --all-databases > /tmp/full.sql
    
    [root@\ db01~]# ll /tmp/
    -rw-r--r-- 1 root root 136519603 2021-03-15 10:10 full.sql
    
    
    
    
    # 导出数据并支持热备份(热备份执行)
    [root@\ db01~]# mysqldump -uroot -p123456 --master-data=2 --single-transaction --all-databases > /tmp/mysql.sql
    Warning: Using a password on the command line interface can be insecure.
    
    
    --single-transaction 备份的时候不影响数据更新
    --master-data=2  导出的语句会包含CHANGE MASTER TO语句,包括备份语句同步到的二进制文件和位置点
    
    
    
    
    #文件传到从数据库上
    [root@\ db01~]# scp -r /tmp/mysql.sql root@10.0.0.51:/tmp/
    
    
    
    #查看sql文件中的位置点(热备份)
    [root@\ db01~]# head -30  /tmp/mysql.sql | grep 'MASTER_LOG_FILE'
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=2858;
    
    也可以在主库中执行查看bin日志相关信息
    ysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     2858 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    
    
    
    
    
    
    从数据库:
    mysql> source /tmp/mysql.sql
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | monday             |
    | mysql              |
    | performance_schema |
    | phpmyadmin         |
    | rainday            |
    | tttt               |
    | wordpress          |
    | world              |
    | zh                 |
    +--------------------+
    15 rows in set (0.00 sec)
    
    # 已同步db01上之前的数据
    
    
    
    #重新执行change master to 语句(需要停止slave)
    mysql> change master to
           master_host='172.16.1.51',
           master_user='slave',
           master_password='slavepwd',
           master_log_file='mysql-bin.000001',
           master_log_pos=2858;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    
    注意:
       这里的如果账户密码密码错误,
       执行show slave statues\G时,会显示Slave_IO_Running: Connecting
       mysql> stop slave;
       mysql> reset slave;重启设置change master to语句即可
    
    
    
    
    
    # 查看主从复制的相关信息
    mysql> show slave statues\G
    
    
    
    验证:
    mysql> create database dog;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use dog;
    Database changed
    mysql> create table dog(id int,name varchar(6));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into dog values(1,'huaer');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from dog;
    +------+-------+
    | id   | name  |
    +------+-------+
    |    1 | huaer |
    +------+-------+
    1 row in set (0.00 sec)
    
    
    
    
    
    
    
    
    db02查看:
    mysql> select * from dog.dog;
    +------+-------+
    | id   | name  |
    +------+-------+
    |    1 | huaer |
    +------+-------+
    1 row in set (0.01 sec)
    
    

    补充(mysql日志)

    error_log      记录所有的错误信息
    查询日志        select(一般不使用,查询量过多)
    慢查询日志      select操作时间比较长会被记录下来 =10s
    二进制日志      非select以外的sql会记录到二进制日志中
    

    二,延时同步

    1,MySQL延迟从库的优点

      -数据被误操作,可以在延迟的范围内,在从库中立即备份,一般设置在3-5分钟,并不影响同步
    
    

    **2,延时在哪个步骤?88

        延时从库是在SQL线程做的手脚,IO线程已经把数据放到relay-log里了.
        SQL线程在执行的时候,会延迟你设定的时间长度.
    
    
    
    

    3,延时操作方法:
    1)已经有主从的情况下

    从库:
    
    # 先关闭同步
    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    
    #增加延迟时间
    mysql> change master to master_delay=600;  # 默认单位是秒
    
    #开始同步
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    
    #查看从库状态(会有设定的延迟时间)
    mysql> show slave status\G;
    ...
    SQL_Delay: 600
    ...
    
    

    2)没有主从复制的情况下

    #修改主库,从库配置文件
        server_id
        开启binlog
    
    
    #保证从库和主库的数据一致
    
    
    #执行change语句
        change master to
        master_host='172.16.1.51',
        master_user='slave',
        master_password='slavepwd',
        master_log_file='mysql-bin.000001',
        master_log_pos=2752,
        master_delay=180;
    
    

    4,停止延时备份

    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> change master to master_delay=0;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    

    三,MHA高可用

    ------ (一主两从)

    1,工作原理

    1.保存master主库上所有的binlog事件
    2.找到数据量最新的数据(通过对比relay-log)
    3.将数据最新的从库数据同步至其他从库
    4.提升数据最新的从库为主库(这个时候已经可以恢复业务使用数据库了)
    5.通过主库保存的binlog补全到新的主库上
    6.其他从库开启以数据最新从库为主的主从复制
    

    2,MHA架构

    1.MHA是 C/S 结构的服务,类似于监控
    2.MHA manager可以安装在任意一台机器上
    3.其他所有机器都要装一个node
    4.MHA manager监控主库的node,从库上的node会在切换时发送一些指令,主库保存binlog的工作就是node节点的作用
    5.一个MHA manager可以管理多套mysql主从集群(指定配置文件启动多次就可以,像是多实例)
    6.可以在主从运行中添加 MHA
    7.MHA 尽量避免装在主库上
    8.MHA 通过ssh 去管理的其他节点,先做免密
    

    3,使用MHA注意事项

    1,基于三个节点,一主两从
    2,实现自动故障转移
    3,可以结合脚本实现浮动IP的飘逸
    4,两个从库需要设置  read-only=1   relay_log_purge=0(清理relog日志关闭)
    5,权限(每一台都需要授权)
    6,从库也需要打开日志,并且使用不同的server_id
    7,三台服务器之间实现密登录
    

    4,MHA使用

    (1)三台机器先建立主从

    1,lb02和lb03两个配置从库设置,重启mysqld

    [root@\ db02~]# vim /etc/my.cnf
    server_id=2
    log_bin=mysql-bin
    
    mysql> set global read_only=1;
    Query OK, 0 rows affected (0.00 sec)
    
    
    
    [root@\ db03~]# vim /etc/my.cnf
    server_id=3
    log_bin=mysql-bin
    
    mysql> set global relay_log_purge=0;
    Query OK, 0 rows affected (0.00 sec)
    
    

    2,把主数据库传送给两台从库

    [root@\ db01~]# mysqldump -uroot -p123456 --master-data=2 --single-transaction --all-databases > /tmp/mysql.sql
    
    [root@\ db01~]# scp /tmp/mysql.sql root@10.0.0.51:/tmp/
    [root@\ db01~]# scp /tmp/mysql.sql root@10.0.0.52:/tmp/
    
    

    3,两台从数据库导入数据

    [root@\ db01~]# mysql -uroot -p123456
             mysql> source /tmp/mysql.sql
    
    
    [root@\ db02~]# mysql -uroot -p123456
             mysql> source /tmp/mysql.sql
    
    

    4,设置2台从库权限,只读模式,并注视掉清除relog日志及授权(如果发送vip飘逸,从库成主库需要)

    mysql> set global relay_log_purge=0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set global read_only=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant replication slave on *.* to slave@'172.16.1.%' identified by 'slavepwd';
    Query OK, 0 rows affected (0.01 sec)
    
    
    #修改主从关系账号
    mysql> grant all privileges on *.* to mha@'172.16.1.%' identified by 'mhapwd';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    注意:#修改主从关系账号 三台都需要!!
    
    
    

    5,设置2台从库主从信息

    #先查看主库
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     3460 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    
    
    mysql> change master to
           master_host='172.16.1.51',
           master_user='slave',
           master_password='slavepwd',
           master_log_file='mysql-bin.000001',
           master_log_pos=3460;
    
    
    
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    
    #设置晚上查看一下数据库是否更新两主库的内容过来
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | discuz             |
    | monday             |
    | mysql              |
    | performance_schema |
    | phpmyadmin         |
    | test               |
    +--------------------+
    
    

    6,设置三台ssh免密登陆(三台都要做)

    [root@\ db01~]# ssh-keygen -t rsa
    ...
    一直回车
    
    [root@\ db01~]# ssh-copy-id -i ./.ssh/id_rsa.pub root@10.0.0.51
    [root@\ db01~]# ssh-copy-id -i ./.ssh/id_rsa.pub root@10.0.0.52
    [root@\ db01~]# ssh-copy-id -i ./.ssh/id_rsa.pub root@10.0.0.53
    
    
    注意:
    免密传送也要发给自己!!!不然会报错!!!
    
    
    
    (2)安装MHA

    1,三台服务器都要有node,manger在任何一台(最好不要在主库上)

    root@\ db03/tmp/mha]# ll
    drwxr-xr-x 10 4984 users     196 2014-04-01 11:58 mha4mysql-manager-0.56
    drwxr-xr-x  8 4984 users     168 2014-04-01 11:58 mha4mysql-node-0.56
    
    
    [root@\ db01~]# ll /tmp/
    drwxr-xr-x 8 root root       168 2021-03-15 16:36 mha4mysql-node-0.56
    
    [root@\ db02~]# ll /tmp/
    drwxr-xr-x 8 root root       168 2021-03-15 16:36 mha4mysql-node-0.56
    
    
    
    
    
    
    manager 安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
    
    masterha_check_ssh 检查 MHA 的 SSH 配置状况
    masterha_check_repl 检查 MySQL 复制状况
    masterha_manger 启动 manager的脚本
    masterha_check_status 检测当前 MHA 运行状态
    masterha_master_monitor 检测 master 是否宕机
    masterha_master_switch 控制故障转移(自动或者手动)
    masterha_conf_host 添加或删除配置的 server 信息
    masterha_stop 关闭manager
    
    

    2,所有节点安装MHA node所需的perl模块

    [root@db01 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-devel perl-CPAN
    
    
    

    3,编译安装node(三台都需要,单独的一台manger同样操作)

    [root@\ db01]# cd /tmp/mha4mysql-node-0.56/
    [root@\ db01/tmp/mha4mysql-node-0.56]# perl Makefile.PL
    [root@\ db01/tmp/mha4mysql-node-0.56]# make && make install
    
    
    

    4,manger配置

    1)#创建MHA软件目录并拷贝配置文件

    [root@\ db03]# mkdir /etc/mha
    [root@\ db03]# mkdir -p /var/log/mha/app1(日志)
    
    [root@\ db03/tmp/mha/mha4mysql-manager-0.56]# cp /tmp/mha4mysql-manager-0.56/samples/conf/app1.cnf  /etc/mha/app1.conf
    
    

    2)manage上设置全局配置

    [root@\ db03]# vim /etc/mha/app1.cnf
    [server default]
    manager_workdir=/var/log/mha/app1
    manager_log=/var/log/mha/app1/manager.log
    master_binlog_dir=/var/lib/mysql
    master_ip_failover_script= /usr/local/bin/master_ip_failover
    password=mhapwd
    user=mha
    remote_workdir=/tmp
    repl_password=slavepwd
    repl_user=slave
    secondary_check_script= /usr/local/bin/masterha_secondary_check -s 172.16.1.51 -s 172.16.1.7  #这里的地址是非manger的另外两台地址,并不是非master的地址
    shutdown_script=""
    ssh_user=root
    
    [server1]
    hostname=172.16.1.51
    candidate_master=1
    port=3306
    
    [server2]
    hostname=172.16.1.7
    port=3306
    candidate_master=1
    check_repl_delay=0
    
    [server3]
    hostname=172.16.1.52
    candidate_master=1
    port=3306
    
    

    5,检测无秘钥登录

    [root@\ db03/tmp/mha/mha4mysql-manager-0.56]# masterha_check_ssh -conf=/etc/mha/app1.cnf
    Mon Mar 15 17:41:20 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
    Mon Mar 15 17:41:20 2021 - [info] Reading application default configuration from /etc/mha/app1.conf..
    Mon Mar 15 17:41:20 2021 - [info] Reading server configuration from /etc/mha/app1.conf..
    Mon Mar 15 17:41:20 2021 - [info] Starting SSH connection tests..
    Mon Mar 15 17:41:21 2021 - [debug]
    Mon Mar 15 17:41:20 2021 - [debug]  Connecting via SSH from root@10.0.0.7(10.0.0.7:22) to root@10.0.0.52(10.0.0.52:22)..
    Mon Mar 15 17:41:20 2021 - [debug]   ok.
    Mon Mar 15 17:41:20 2021 - [debug]  Connecting via SSH from root@10.0.0.7(10.0.0.7:22) to root@10.0.0.51(10.0.0.51:22)..
    Mon Mar 15 17:41:21 2021 - [debug]   ok.
    Mon Mar 15 17:41:21 2021 - [debug]
    Mon Mar 15 17:41:20 2021 - [debug]  Connecting via SSH from root@10.0.0.52(10.0.0.52:22) to root@10.0.0.7(10.0.0.7:22)..
    Mon Mar 15 17:41:21 2021 - [debug]   ok.
    Mon Mar 15 17:41:21 2021 - [debug]  Connecting via SSH from root@10.0.0.52(10.0.0.52:22) to root@10.0.0.51(10.0.0.51:22)..
    Mon Mar 15 17:41:21 2021 - [debug]   ok.
    Mon Mar 15 17:41:22 2021 - [debug]
    Mon Mar 15 17:41:21 2021 - [debug]  Connecting via SSH from root@10.0.0.51(10.0.0.51:22) to root@10.0.0.7(10.0.0.7:22)..
    Mon Mar 15 17:41:21 2021 - [debug]   ok.
    Mon Mar 15 17:41:21 2021 - [debug]  Connecting via SSH from root@10.0.0.51(10.0.0.51:22) to root@10.0.0.52(10.0.0.52:22)..
    Mon Mar 15 17:41:21 2021 - [debug]   ok.
    Mon Mar 15 17:41:22 2021 - [info] All SSH connection tests passed successfully.
    #以上结果说明检查成功
    
    

    6,复制自动切换时 VIP 管理的脚本到/usr/local/bin 目录,并编写脚本

    [root@\ db03/tmp/mha4mysql-manager-0.56]# cp samples/scripts/master_ip_failover /usr/local/bin/
    
    [root@\ db03~]# cp /usr/local/bin/master_ip_failover /usr/local/bin/master_ip_failover_backup #软件包问题,使用新的脚本
    
    
    
    [root@\ db03~]# vim /usr/local/bin/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.200/24';  # Virtual IP 
    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 "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; 
    
        if ( $command eq "stop" || $command eq "stopssh" ) {
    
            # $orig_master_host, $orig_master_ip, $orig_master_port are passed.
            # If you manage master ip address at global catalog database,
            # invalidate orig_master_ip here.
            my $exit_code = 1;
            eval {
                print "Disabling the VIP on old master: $orig_master_host \n";
                &stop_vip();
                $exit_code = 0;
            };
            if ($@) {
                warn "Got Error: $@\n";
                exit $exit_code;
            }
            exit $exit_code;
        }
        elsif ( $command eq "start" ) {
    
            # all arguments are passed.
            # If you manage master ip address at global catalog database,
            # activate new_master_ip here.
            # You can also grant write access (create user, set read_only=0, etc) here.
            my $exit_code = 10;
            eval {
                print "Enabling the VIP - $vip on the new master - $new_master_host \n";
                &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 \n"; 
            `ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
            exit 0;
        }
        else {
            &usage();
            exit 1;
        }
    }
    
    # A simple system call that enable the VIP on the new master 
    sub start_vip() {
        `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    }
    # A simple system call that disable the VIP on the old_master
    sub stop_vip() {
        `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\n";
    }
    
    
    #授权
    [root@\ db03~]# chmod +x /usr/local/bin/master_ip_failover
    
    
    注意:
    my $vip = '172.16.1.200/24';  # Virtual IP vvip是在这里设置的
    

    7,测试 MySQL 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明

    [root@\ db03/tmp/mha4mysql-manager-0.56/bin]# masterha_check_repl -conf=/etc/mha/app1.cnf
    
    ...
    
    MySQL Replication Health is OK.
    
    注意:
    授权的网段和[root@\ db03/tmp/mha4mysql-manager-0.56/bin]# masterha_check_repl -conf=/etc/mha/app1.cnf里设置的网段一定要一致,排错了好久....
    
    

    8,启动MHA

    [root@\ db03/tmp/mha/mha4mysql-manager-0.56/bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
    [1] 12622
    
    –remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
    –manger_log 日志存放位置。
    –ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,
    == 这里设置为–ignore_last_failover ==
    
    

    9,查看MHA 状态

    [root@\ db03/tmp/mha/mha4mysql-manager-0.56/bin]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:12622) is running(0:PING_OK), master:172.16.1.51
    
    
    # 以看到当前的 master 是node1 节点。
    
    

    10,查看MHA日志

    [root@\ db03/tmp/mha/mha4mysql-manager-0.56/bin]# tail /var/log/mha/app1/manager.log
     +--172.16.1.52(172.16.1.52:3306)
    Mon Mar 15 19:41:26 2021 - [info] Checking master_ip_failover_script status:
    Mon Mar 15 19:41:26 2021 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=172.16.1.51 --orig_master_ip=172.16.1.51 --orig_master_port=3306
    Mon Mar 15 19:41:26 2021 - [info]  OK.
    Mon Mar 15 19:41:26 2021 - [warning] shutdown_script is not defined.
    Mon Mar 15 19:41:26 2021 - [info] Set master ping interval 3 seconds.
    Mon Mar 15 19:41:26 2021 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s 172.16.1.51 -s 172.16.1.7
    Mon Mar 15 19:41:26 2021 - [info] Starting ping health check on 172.16.1.51(172.16.1.51:3306)..
    Mon Mar 15 19:41:26 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
    
    #这里也可以看见master的节点ip
    
    

    11,查看虚拟ip

    #这里没有自动生成,手动配置
    [root@\ db01/tmp/mha4mysql-node-0.56/bin]# /sbin/ifconfig eth1:1 172.16.1.200/24
    
    检测IP
    [root@\ db01/tmp/mha4mysql-node-0.56/bin]# /sbin/ifconfig eth1:1 172.16.1.200/24
    [root@\ db01/tmp/mha4mysql-node-0.56/bin]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:ab:b3:09 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.51/24 brd 10.0.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:feab:b309/64 scope link
           valid_lft forever preferred_lft forever
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:ab:b3:13 brd ff:ff:ff:ff:ff:ff
        inet 172.16.1.51/24 brd 172.16.1.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet 172.16.1.200/24 brd 172.16.1.255 scope global secondary eth1:1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:feab:b313/64 scope link
           valid_lft forever preferred_lft forever
    
    

    12,故障转移测试

    #主库停止数据库
    [root@\ db01]# systemctl stop mysqld
    
    
    #此台成主库
    [root@\ db03]# mysql -uroot -p123456
    
    
    
    mysql> show master status;
    +------------------+-----------+--------------+------------------+-------------------+
    | File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+-----------+--------------+------------------+-------------------+
    | mysql-bin.000003 | 136566433 |              |                  |                   |
    +------------------+-----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    
    
    
    
    
    
    
    # 此台为从库
    [root@\ db02/]# mysql -uroot -p123
             mysql> show master status;
                   Empty set (0.00 sec)
    
             mysql> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.16.1.52
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000003
              Read_Master_Log_Pos: 136566433
                   Relay_Log_File: mysqld-relay-bin.000002
                    Relay_Log_Pos: 283
            Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                      ...
    
    
    
    命令行查看虚拟IP是否漂移完成
    
    
    
    

    12,关闭MHA manage监控命令

    [root@node1 mha4mysql-manager-0.56]# masterha_stop --conf=/etc/mha/app1.cnf
    
    

    13,故障排除后,后续修补

    1,查看manger机器上的配置,主库相关server信息移除,需重新添加
    
    [root@\ db03/mha/mha4mysql-manager-0.56]# vim /etc/mha/app1.cnf
    ...
    
    [server2]
    candidate_master=1
    check_repl_delay=0
    hostname=172.16.1.53
    port=3306
    
    [server3]
    candidate_master=1
    hostname=172.16.1.52
    port=3306
    
    
    #添加
    [server1]
    hostname=10.0.0.51
    candidate_master=1
    port=3306
    
    
    
    
    
    2,同步数据
    [root@\ db03/tmp/mha/mha4mysql-manager-0.56]# scp -r /tmp/all.sql root@10.0.0.51:/tmp/
    all.sql                                                              100%  127MB  53.4MB/s   00:02
    
    
    #172.16.1.51这台服务器导入数据
    mysql> source /tmp/all.sql
    
    
    
    
    
    
    3,172.16.1.51这台服务器MySQL主从关系会失效,需建立新的主从关系,将主库指向漂移后的新服务器
    
    [root@\ db01~]# systemctl start mysqld
    [root@\ db01~]# mysql -uroot -p123456
    mysql> change master to
           master_host='172.16.1.52',
           master_user='slave',
           master_password='slavepwd',
           master_log_file='mysql-bin.000003',
           master_log_pos=136566785;
    Query OK, 0 rows affected, 2 warnings (0.02 sec)
    
    
    
    
    #开启同步
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    
    
    #测试(在主服务器172.16.1.52上删除或者新建库查看)
    

    相关文章

      网友评论

          本文标题:主从复制 & MHA

          本文链接:https://www.haomeiwen.com/subject/ikihcltx.html