MySQL高可用之MHA

作者:Chris

MHA简介 #

MHA,即MasterHigh Availability Manager and Tools for MySQL,是日本的一位MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQLReplication(二层)环境,目的在于维持Master主库的高可用性。

MHA(Master High Availability)是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).

MHA有两部分组成:MHA Manager(管理节点)MHA Node(数据节点).

MHA Manager可以单独部署在一台独立机器上管理多个master-slave集群,也可以部署在一台slave上.MHA Manager探测集群的node节点,当发现master出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上.整个故障转移过程对应用程序是透明的。

MHA node运行在每台MySQL服务器上(master/slave/manager),它通过监控具备解析和清理logs功能的脚本来加快故障转移的。

工作原理 #

其工作原理我个人认为有以下几点:

  • MHA从代码层面看,就是一套Perl脚本集合
  • MHA安装本质其实就是把perl脚本执行文件解压并安装perl依赖包
  • 通过授权mysql账户和ssh互信来达到通过mha-manager使用perl脚本调用linux mysql命令实时检测控制各个node故障转移
  • mha-manager使用perl脚本来动态切换VIP以达到高可用
  • ......

其详细工作过程网上一大把不在赘述。。。

INSTALL #

废话不多说,开搞!!!

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器

我们自己使用其实也可以使用1主1从,但是master主机宕机后无法切换,以及无法补全binlog。master的mysqld进程crash后,还是可以切换成功,以及补全binlog的。

IPOSmysqlnodeMHA
192.168.179.128CentOS 7.35.7.22mastermha-node
192.168.179.129CentOS 7.35.7.22slavemha-manager & mha-node

vip 192.168.179.130
VMware® Workstation 14 Pro

配置主从,VIP,SSH互信,授权mysql管理账户 #

-- 128 129(配置mysql复制用户)
grant replication slave on *.* to 'repl'@'192.168.179.129'  identified by 'repl';
flush privileges;

grant replication slave on *.* to 'repl'@'192.168.179.128'  identified by 'repl';
flush privileges;


-- 128 129(配置mysql的mha监控用户)
grant all privileges on *.* to 'view'@'192.168.179.129' identified  by 'view123';
flush privileges;

grant all privileges on *.* to 'view'@'192.168.179.128' identified  by 'view123';
flush privileges;

-- #公钥互信
ssh-keygen
128和129互传公钥

#本机也要加
128# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
129# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

-- 128(master)
/sbin/ifconfig ens33:1 192.168.179.130/24
# ip addr add 192.168.179.130/24 dev ens33:1
# ip addr del 192.168.179.130/24 dev ens33:1
ip addr |grep '192.168.179.130'
show master status;


-- 129(slave)
CHANGE MASTER TO  MASTER_HOST='192.168.179.129',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=3340; 
start slave;

INSTALL MHA #

-- 129(slave)


rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm


yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes   --skip-broken  -y

yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

yum -y install perl-CPAN

yum install -y perl-Mail-Sender 

yum install -y perl-Log-Dispatch


tar xf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.PL
make && make install

tar xf mha4mysql-node-0.56.tar.gz 
cd mha4mysql-node-0.56
perl Makefile.PL
make && make install


-- 128(master) only install mha4mysql-node


cat /usr/local/bin/master_ip_failover
cat /usr/local/bin/master_ip_online_change
cat /usr/local/bin/load_cnf
cat /data/mha/3306/mha.cnf

CHECK MHA #

-- 129 mha-manager


# 检查ssh连接
masterha_check_ssh --conf=/data/mha/3306/mha.cnf

# 检查主从
masterha_check_repl --conf=/data/mha/3306/mha.cnf

# 手动切换主从
masterha_master_switch --master_state=alive --conf=/data/mha/3306/mha.cnf --new_master_host=192.168.179.129 --new_master_port=3306 --orig_master_is_new_slave

# 检查mha状态
masterha_check_status --conf=/data/mha/3306/mha.cnf

# 启动mha_manager
nohup /usr/local/bin/masterha_manager --conf=/data/mha/3306/mha.cnf --ignore_last_failover >> /data/mha/3306/log/manager.log 2>&1 &

TEST... #

修复宕机的Master #

如果Master主机修复好了,可以在修复好后的Master执行CHANGE MASTER操作,作为新的slave库。

[root@localhost ~]# grep -i "All other slaves should start"  /data/mha/3306/log/manager.log 
Tue Dec 11 01:31:59 2018 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.179.129', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=498, MASTER_USER='repl', MASTER_PASSWORD='xxx';

本着先开搞后研究的套路,搞出来都测试OK,然后在研究代码就很easy了!


MHA组件说明 #

前面说过MHA就是一套Perl脚本集合;所以他的各个文件都是Perl脚本

以下列举常用的组件

Manager工具包主要包括以下几个工具:

masterha_check_ssh              #检查MHA的SSH配置状况
masterha_check_repl             #检查MySQL复制状况
masterha_manger                 #启动MHA
masterha_check_status           #检测当前MHA运行状态
masterha_master_monitor         #检测master是否宕机
masterha_master_switch          #控制故障转移(自动或者手动)
masterha_conf_host              #添加或删除配置的server信息
master_ip_failover              #自动切换vip
master_ip_online_change         #在线切换vip
load_cnf                        #保存密码

Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs                #保存和复制master的二进制日志
apply_diff_relay_logs           #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog              #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs                #清除中继日志(不会阻塞SQL线程)**重要**

配置文件说明 #

[root@localhost ~]# cat /data/mha/3306/mha.cnf 
[server default]
client_bindir=/data/mysql-5.7.22-linux-glibc2.12-x86_64/bin/
manager_log=/data/mha/3306/log/manager.log  ##设置manager的日志
manager_workdir=/data/mha/3306/log  ##设置manager的工作目录
master_binlog_dir=/data/mysql-5.7.22-linux-glibc2.12-x86_64/data/  ##设置master保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script=/usr/local/bin/master_ip_failover  ##设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change  ##设置手动切换时候的切换脚本
report_script=/usr/local/bin/send_report  ##设置发生切换后发送的报警的脚本
init_conf_load_script=/usr/local/bin/load_cnf  ##保存mysql复制用户和root用户密码
remote_workdir=/tmp  ##设置远端mysql在发生切换时binlog的保存位置
#secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.0.30 -s 192.168.0.40
user=view  ##mysql的mha监控用户
ping_interval=3  ##设置监控主库,发送ping包的时间间隔,用来检查master是否正常,默认是3秒,尝试三次没有回应的时候自动进行railover
repl_user=repl  ##mysql复制帐号,用来在主从机之间同步二进制日志等
ssh_port=22  ##设置ssh的登录端口
ssh_user=root  ##设置ssh的登录用户名
max_ping_errors=40  ##max_ping_errors=40,这个是修改了源码,增加了检测次数的定义,默认是3次,太容易误切换。

[server1]
hostname=192.168.179.128
port=3306

[server2]
candidate_master=1  ##置为候选master,即master机宕掉后,优先启用这台作为新master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave

check_repl_delay=0  ##默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

hostname=192.168.179.129
port=3306
[root@localhost ~]# 

切换vip脚本 #

自动切换vip脚本master_ip_failover
在线切换vip脚本master_ip_online_change
须根据自行方案修改

[root@localhost ~]# cat /usr/local/bin/master_ip_failover |grep 'my' |awk '(NR<8 && NR>1)'
my $vip = '192.168.179.130';
my $key = '1';
my $gateway1 = '10.69.213.254';
my $gateway2 = '10.69.59.254';
my $ssh_start_vip = "/sbin/ip addr add  $vip/24 dev ens33:$key";
my $ssh_stop_vip  = "/sbin/ip addr del  $vip/24 dev ens33:$key";






[root@localhost ~]# cat /usr/local/bin/master_ip_online_change |grep 'my' |awk '(NR<10 && NR>3)'
my $vip = '192.168.179.130';
my $key = '1';
my $gateway1 = '10.69.213.254';
my $gateway2 = '10.69.59.254';
my $ssh_start_vip = "/sbin/ip addr add  $vip/24 dev ens33:$key";
my $ssh_stop_vip  = "/sbin/ip addr del  $vip/24 dev ens33:$key";
[root@localhost ~]# 

保存密码脚本 #

[root@localhost ~]# cat /usr/local/bin/load_cnf
#!/usr/bin/perl

eval 'exec /usr/bin/perl  -S $0 ${1+"$@"}'
    if 0; # not running under some shell
  
  print "password=view123\n";    //mysql的mha监控密码
  print "repl_password=repl\n";    //mysql复制密码
[root@zhenru13 3307]# 

解决跨路由arp问题 #

[root@localhost ~]# cat /usr/local/bin/master_ip_failover |grep 'ssh_Bcast_arp'
my $ssh_Bcast_arp = "/usr/sbin/arping -q -A -c 1 -I ens33 192.168.179.130";
    `ssh -o StrictHostKeyChecking=no -o GSSAPIAuthentication=no -p$new_master_ssh_port $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;



[root@localhost ~]# cat /usr/local/bin/master_ip_online_change |grep 'ssh_Bcast_arp'        
my $ssh_Bcast_arp = "/usr/sbin/arping -q -A -c 1 -I ens33 192.168.179.130";
      `ssh -o StrictHostKeyChecking=no -o GSSAPIAuthentication=no -p$new_master_ssh_port $new_master_ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;

您的评论

Build by Loppo 0.6.14