mha总结

一.功能

1.自动的master监控及故障切换(10-30s)

9-12s检测到主节点故障

7-10s关闭主机避免脑裂

几秒钟应用relay log

 

2.人为的主节点故障切换

3.非人为的主节点故障切换(如果已经部署了主节点故障检测监控,可以用这种模式)

4.在线的主节点切换

 

二.架构

 

 

三.安装

下载地址

https://github.com/yoshinorim/mha4mysql-manager/releases
https://github.com/yoshinorim/mha4mysql-node/releases

前提条件,一主两从配置及互信

安装依赖

 

yum install epel-release
yum install perl-DBD-MySQL perl-CPAN -y
yum install -y perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
yum update -y

所有节点安装mha-node

$ tar xvf mha4mysql-node-0.58.tar.gz
$ cd mha4mysql-node-0.58
$ perl Makefile.PL
$ make && make install
安装完成后 /usr/local/bin 下会出现4个脚本
apply_diff_relay_logs  //识别差异的中继日志事件并将其差异的事件应用于其他的slave
save_binary_logs               //保存和复制master的二进制日志
filter_mysqlbinlog             //去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs               //清除中继日志(不会阻塞SQL线程)
 
安装mha-manager
$ tar xvf mha4mysql-manager-0.58.tar.gz
$ cd mha4mysql-manager-0.58
$ perl Makefile.PL
$ make && make install
安装完成后 /usr/local/bin下出现以下脚本

masterha_check_repl
masterha_check_ssh
masterha_check_status
masterha_conf_host
masterha_manager
masterha_master_monitor
masterha_master_switch
masterha_secondary_check
masterha_stop

配置文件

[server default]
manager_log=/root/duanzexun/mha/log/manager.log
manager_workdir=/root/duanzexun/mha
master_binlog_dir=/data0/mha/3306/mysql-bin
master_ip_failover_script=/root/duanzexun/mha/config/master_ip_failover
master_ip_online_change_script=/root/duanzexun/mha/config/master_ip_failover_online
password=Dba@2019huohua!
ping_interval=3
remote_workdir=/root/duanzexun/mha
repl_password=Dba@2019huohua!
repl_user=root
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 10.89.91.181 -s 10.89.91.203 --user=root --port=22 --master_host=10.89.91.231 --master_port=3306
ssh_port=22
ssh_user=root
user=root

[server1]
candidate_master=1
hostname=10.89.91.231
port=3306

[server2]
candidate_master=1
hostname=10.89.91.203
port=3306

[server3]
candidate_master=1
hostname=10.89.91.181
port=3306

  

master_ip_failover_online

#!/usr/bin/env perl  
  
use strict;  
use warnings FATAL => 'all';  
  
use Getopt::Long;  
  
my (  
    $command, $orig_master_host, $orig_master_ip,  
    $orig_master_port, $new_master_host, $new_master_ip, $new_master_port  
);  
  
my $vip = '10.10.200.44/24';  
my $key = '0';  
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";  
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";  
my $ssh_user = 'root';
  
GetOptions(  
    'command=s'          => \$command,  
    '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";  
}  

  

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 = '10.10.200.44/24';  
my $key = '0';  
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";  
my $ssh_stop_vip = "/sbin/ifconfig eth0:$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" ) {  
  
        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";  
}  

  

切换步骤可以参考

https://www.cnblogs.com/cmgg/p/11070599.html

 

 

 

posted on 2021-07-27 15:16  从零开始662  阅读(115)  评论(0)    收藏  举报

导航