本文是基于mysql主从环境的
MHA组成 MHA主要有Manager、Node两部分组成 Manager:Manager可以部署在单独的服务器上,管理多个主从集群,也可以部署在一个从服务器上。MHA Manager会探测集群中master节点,当master出现故障时,它可以自动将一个slave提升为新的master,然后重新建立主从关系 Node:所有机器均需要安装
MHA工作原理 当master出现故障后,MHA会挑选一个slave,进行数据补偿,让他做为新的master,并且重新建立主从关系。
选主策略 (1)如果从库(GTID)数据有差异,选择数据最接近master的slave成为备选主 (2)如果从库数据一致,按照配置文件顺序选主 (3)如果设定了权重(candidate_master=1),按照权重选主 1)默认情况下如果一个slave数据落后master大于100M的中继日志数据的话,权重不会生效 2)如果设置check_repl_delay=0,即使落后很多日志,也会成为备选主
MHA部署 实验环境 192.168.186.133 mysql-master node 192.168.186.134 mysql-slave node 192.168.186.135 mysql-slave node manager
建立软连接 ln -s /usr/local /mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog ln -s /usr/local /mysql/bin/mysql /usr/bin/mysql
配置ssh登陆无密码登陆 rm -rf /root/.ssh ssh-keygen cd /root/.ssh mv id_rsa.pub authorized_keys scp -r /root/.ssh 192.168.186.134:/root scp -r /root/.ssh 192.168.186.135:/root ssh 192.168.186.133 date ssh 192.168.186.134 date ssh 192.168.186.135 date ssh 192.168.186.133 date ssh 192.168.186.134 date ssh 192.168.186.135 date ssh 192.168.186.133 date ssh 192.168.186.134 date ssh 192.168.186.135 date
下载mha github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
所有节点安装node软件依赖包 yum install perl-DBD-MySQL -y rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
master节点创建mha用户 grant all privileges on *.* to mha@'192.168.186.%' identified by 'tang1611' ;
Manager软件安装 yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
manager配置文件 mkdir -p /etc/mha mkdir -p /var/log /mha/app1 vim /etc/mha/app1.cnf [server default] manager_log=/var/log /mha/app1/manager manager_workdir=/var/log /mha/app1 master_binlog_dir=/data/binlog user=mha password=tang1611 ping_interval=2 repl_password=tang1611 repl_user=twf ssh_user=root [server1] hostname=192.168.186.133 port=3306 [server2] hostname=192.168.186.134 port=3306 [server3] hostname=192.168.186.135 port=3306
ssh通信验证 masterha_check_ssh --conf=/etc/mha/app1.cnf
主从状态检查 masterha_check_repl --conf=/etc/mha/app1.cnf
启动MHA 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 &
查看MHA状态 masterha_check_status --conf=/etc/mha/app1.cnf
配置MHA的vip功能 修改manager配置文件
master_ip_failover_script=/usr/local /bin/master_ip_failover
master_ip_failover脚本内容
#!/usr/bin/env perl use strict; use warnings FATAL => 'all' ; use Getopt::Long; use MHA::DBHelper; my ( $command , $ssh_user , $orig_master_host , $orig_master_ip , $orig_master_port , $new_master_host , $new_master_ip , $new_master_port , $new_master_user , $new_master_password ); my $vip = '192.168.186.100/24' ; my $key = '1' ; my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip " ; my $ssh_stop_vip = "/sbin/ifconfig ens33:$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 , 'new_master_user=s' => \$new_master_user , 'new_master_password=s' => \$new_master_password , ); 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" ;}
使用dos2unix工具处理脚本
dos2unix /usr/local /bin/master_ip_failover
赋予可执行权限
chmod +x /usr/local /bin/master_ip_failover
在主库上生成vip
ifconfig ens33:1 192.168.186.100/24
测试 先重启MHA,让之前的配置生效
masterha_stop --conf=/etc/mha/app1.cnf 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 &
查看mha状态
masterha_check_status --conf=/etc/mha/app1.cnf
在master(192.168.186.133)节点pkill掉mysql、mysqld
在192.168.186.134查看虚拟vip 可以看出master已经在192.168.186.134机器上了 可以从app1.cnf看出192.168.186.133已经被MHA剔除了
恢复 在192.168.186.133机器执行
service mysql start mysql -uroot -p'tang1611' CHANGE MASTER TO MASTER_HOST='192.168.186.134' ,MASTER_USER='twf' , MASTER_PASSWORD='tang1611' ; start slave;
在192.168.186.135机器 vim /etc/mha/app1.cnf,将server1加进去 再次启动mha 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 &