美文网首页
mysql 5.7 MHA集群故障切换

mysql 5.7 MHA集群故障切换

作者: 茂凯 | 来源:发表于2020-11-24 16:49 被阅读0次

    服务器信息:

    manager: 192.168.28.184
    master:
    172.16.2.185
    node:
    172.16.2.186 172.16.0.171 192.168.12.20

    主从搭建命令
    stop slave;
    change master to master_host='172.16.2.185',master_user='repuser',
    master_password='repuser123',master_log_file='wm_binlog.000002',master_log_pos=154;

    MHA会提供诸多工具程序, 其常见的如下所示:

    Manager节点:

    masterha_check_ssh:MHA 依赖的 ssh 环境监测工具;

    masterha_check_repl:MYSQL 复制环境检测工具;

    masterga_manager:MHA 服务主程序;

    masterha_check_status:MHA 运行状态探测工具;

    masterha_master_monitor:MYSQL master 节点可用性监测工具;

    masterha_master_swith:master:节点切换工具;

    masterha_conf_host:添加或删除配置的节点;

    masterha_stop:关闭 MHA 服务的工具。

    Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)

    save_binary_logs:保存和复制 master 的二进制日志;

    apply_diff_relay_logs:识别差异的中继日志事件并应用于其他 slave;

    purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);

    自定义扩展:

    secondary_check_script:通过多条网络路由检测master的可用性;

    master_ip_failover_script:更新application使用的masterip;

    report_script:发送报告;

    init_conf_load_script:加载初始配置参数;

    master_ip_online_change_script;更新master节点ip地址。

    2.3工作原理

    MHA工作原理总结为以下几条:

    (1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);

    (2) 识别含有最新更新的 slave ;

    (3) 应用差异的中继日志(relay log) 到其他 slave ;

    (4) 应用从 master 保存的二进制日志事件(binlog events);

    (5) 提升一个 slave 为新 master ;

    (6) 使用其他的 slave 连接新的 master 进行复制。

    其最大特点是 可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致

    VIP切换脚本
    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.2.187/24';

    my $key = '1';

    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";

    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

    $ssh_user = "root";

    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" ) {

            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" ) {

            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";

            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\n";

    }

    MHA集群配置文件

    vim app1.cnf

    [server default]

    manager_log=/etc/masterha/manager.log

    manager_workdir=/etc/masterha

    master_binlog_dir=/mysql/logs/3306/binlog

    master_ip_failover_script=/etc/masterha/scripts/master_ip_failover

    password=123456

    ping_interval=1

    repl_password=repuser123

    repl_user=repuser

    ssh_user=root

    user=root

    [server1]

    hostname=172.16.2.186

    port=3306

    [server2]

    hostname=172.16.0.171

    port=3306

    [server3]

    hostname=192.168.12.20

    port=3306

    相关命令:

    -- 检查ssh连通性
    masterha_check_ssh --conf=/etc/masterha/app1.cnf

    -- 检查集群配置健康状态
    masterha_check_repl --conf=/etc/masterha/app1.cnf

    -- 检查MHA集群状态
    masterha_check_status --conf=/etc/masterha/app1.cnf

    -- 启动MHA集群 
    masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover &

    --ignore_last_failover
    默认情况下,如果MHA检查到主库发生宕机,且两次宕机时间间隔不足8小时,则不会发生切换,该参数可以避免上述情况

    日志分析
    tail -f /etc/masterha/manager.log

    MHA故障切换-日志01 MHA故障切换-日志02 MHA故障切换-日志03 MHA故障切换-日志04 MHA故障切换-日志05

    特别注意:

    1. MHA启动之后自动处理好集群主从读写关系

    2.manager节点也需要 node包

    3.故障切换后 masterha_manager进程会自动down掉,需重新启动(可脚本实现检测并自动启动) 

    vim check_manager_status.sh

    #!/bin/bash

    while :

    do

    MGECHECK=`ps -ef|grep masterha_manager |egrep -v grep| wc -l`

    if [ $MGECHECK -eq 0 ];then

    nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover > /dev/null  2>&1

    else

    echo "MHA manager start"

    fi

    sleep 5

    done

    写入开机启动: echo /usr/local/bin/check_manager_status.sh >> /etc/rc.d/rc.local

    搭建参考: https://www.cnblogs.com/sky-cheng/p/10972424.html
    感谢作者.

    相关文章

      网友评论

          本文标题:mysql 5.7 MHA集群故障切换

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