mysql 5.7 MHA集群故障切换

2020-11-24  本文已影响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
感谢作者.

上一篇下一篇

猜你喜欢

热点阅读