MySQL 高可用之MHA(二)

630 阅读4分钟

前言

上一篇《MySQL高可用之MHA 一》主要讲述了MHA的相关原理以及在铜板街上线的相关细节,本篇将从安装代码、测试等方面进行讲解MHA。

版本说明

系统版本:CentOS release 6.7 (Final)

DB版本:官方5.6.38-log MySQL Community Server (GPL)

MHA软件版本(下载地址见上篇文章):

mha4mysql-manager-0.56.tar.gz

mha4mysql-node-0.56.tar.gz

节点说明

manager : 192.168.1.102

mysql-master: 192.168.1.221

mysql-master VIP: 192.168.1.220

mysql-slave1: 192.168.1.222

mysql-slave2: 192.168.1.223

架构图(如下图1所示):


环境配置

  1. 配置 ssh 互通,分别登录所有节点,对其余节点配置 ssh 免密登录,如:登录 192.168.1.102 对 192.168.1.221 免密登录,执行 ssh-copy-id -i 192.168.1.221, 其他互通类似。

  2. 安装mha-node依赖及软件包,分别登录所有节点,执行:

  3. 1 yum -y install gcc perl-ExtUtils-MakeMaker perl-ExtUtils-CBuilder perl-CPAN perl-DBI perl-DBD-MySQL
    2 tar xvf mha4mysql-node-0.56.tar.gz && cd mha4mysql-node-0.56 && perl Makefile.PL && make && make install && save_binary_logs --version结果提示:save_binary_logs version 0.56.  
    表示安装正确。
    
  4. 安装mha-manager依赖及软件包,登录manager : 192.168.1.102,执行:

  5. 1 yum -y install perl-DBD-MySQL perl-Time-HiRes perl-Config-Tiny 
    2 wget http://xrl.us/cpanm --no-check-certificate 
    3 mv cpanm /usr/local/bin/ 
    4 chmod 755 /usr/local/bin/cpanm 
    5 cpanm install Log::Dispatch 
    6 cpanm install  Parallel::ForkManager 
    7
    8 tar xvf mha4mysql-manager-0.56.tar.gz && cd mha4mysql-manager-0.56 && perl Makefile.PL && make && make install && masterha_check_repl --version
    结果提示:masterha_check_repl version 0.56. 
    表示安装正确。
  6. 在主库添加VIP,登录mysql-master: 192.168.1.221 执行:

  7. 1 ip addr add 192.168.1.220/32 dev eth0;arping -q -c 2 -U -I eth0 192.168.1.220
  8. 主从配置,主库为 mysql-master: 192.168.1.221,从库为 mysql-slave1: 192.168.1.222,mysql-slave2: 192.168.1.223,架构如上面架构图(如图1所示),方法略。

主库授权

登录到mysql-master: 192.168.1.221 进行如下授权:

1 GRANT all ON *.* TO 'mhauser'@'192.168.1.102' IDENTIFIED BY 'mhauser';
2 GRANT all ON *.* TO 'mhauser'@'192.168.1.221' IDENTIFIED BY 'mhauser';
3 GRANT all ON *.* TO 'mhauser'@'192.168.1.222' IDENTIFIED BY 'mhauser';
4 GRANT all ON *.* TO 'mhauser'@'192.168.1.223' IDENTIFIED BY 'mhauser';
5 GRANT SELECT, RELOAD, SUPER ON *.* TO 'purge_user'@'127.0.0.1' identified by 'purge_user' ;     #该授权为后面的从库配置pure_relay_logs所需

从库配置 pure_relay_logs 

登录到各个从库 mysql-slave1: 192.168.1.222  
mysql-slave2: 192.168.1.223 执行:
1 cat <<'EOF' >/tmp/purge_relay_log.sh
2 /usr/local/bin/purge_relay_logs --user=purge_user --host=127.0.0.1 --port=3306  --password='purge_user' --disable_relay_log_purge --workdir=/tmp/
3 EOF
4
5 echo "0 4 * * * sh /tmp/purge_relay_log.sh &>> /tmp/purge_relay_logs_3306.log" >> /var/spool/cron/root
MHA配置

登录到manager : 192.168.1.102,执行如下:

 1 mkdir /etc/masterha/
 2 mkdir -p /masterha/app1
 3 cat <<'EOF' > /etc/masterha/app1.cnf
 4 [server default]
 5 manager_workdir=/masterha/app1
 6 manager_log=/masterha/app1/manager.log
 7 master_binlog_dir=/data/mysql/3306/binlog
 8 master_ip_failover_script=/usr/local/bin/master_ip_failover
 9 master_ip_online_change_script=/usr/local/bin/master_ip_online_change
10 user=mhauser
11 password=mhauser
12 ssh_user=root
13 repl_user=repluser
14 repl_password='repluser'
15 ping_interval=1
16 remote_workdir=/tmp
17 report_script=/usr/local/bin/send_report
18
19 [server1]
20 hostname=192.168.1.221
21 candidate_master=1
22 check_repl_delay=0
23 port=3306
24 [server2]
25 hostname=192.168.1.222
26 candidate_master=1
27 check_repl_delay=0
28 port=3306
29 [server3]
30 hostname=192.168.1.223
3 1ignore_fail=1
32 port=3306
33 EOF

相关脚本已经共享到 git,git clone 后替换 master_ip_failover、master_ip_online_change的vip和网卡为自己的配置,替换send_report中的 your email、your port、your password

1 git clone https://github.com/tianyuan2018/tbj_mha.git
2 cp tbj_mha/master_ip_failover tbj_mha/master_ip_online_change tbj_mha/send_report /usr/local/bin/
服务检测及启停

登录到manager : 192.168.1.102

  1. ssh 互通检测

  2. 1 masterha_check_ssh  --conf=/etc/masterha/app1.cnf
    

    结果:[info] All SSH connection tests passed successfully. 为正确

  3. 复制检测

  4. 1 masterha_check_repl  --conf=/etc/masterha/app1.cn

    结果:MySQL Replication Health is OK. 为正确

  5. 开启自动故障切换

  6. 1 nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_last_failover &> /dev/null &
    2 服务开启后,会在/masterha/app1生成日志文件manager.log和app1.master_status.health
    3 服务状态检测:masterha_check_status  --conf=/etc/masterha/app1.cnf
    4 app1 (pid:22161) is running(0:PING_OK), master:192.168.1.221
    5 停止服务:masterha_stop  --conf=/etc/masterha/app1.cnf
    6 Stopped app1 successfully.
    
  7. MHA服务手动设置

  8. 1 未开启服务,故障手工切换
    2 masterha_master_switch --conf=/etc/masterha/app1.cnf  --master_state=dead  --dead_master_host=192.168.1.221 --dead_master_port=3306  --new_master_host=192.168.1.222 --new_master_port=3306 --ignore_last_failover
    3 未开启服务,非故障手工在线切换
    4 masterha_master_switch --conf=/etc/masterha/app1.cnf  --master_state=alive --new_master_host=192.168.1.222 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
       
    

MHA 自动故障切换测试

manager : 192.168.1.102 开启服务

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

正常状态下,登录到主库192.168.1.221发现VIP 102.168.1.220


我们在主库上将数据库关闭

1 mysqladmin -uroot -h127.0.0.1 -p -P3306 shutdown
可发现主库192.168.1.221不再存在VIP 102.168.1.220


登录到从库mysql-slave1:192.168.1.222(mha manager 配置的candidate_master=1,查看VIP已经自动设置成功。


同时收到mha切换的邮件


测试前打开另一中端,通过对DB VIP执行查询命令进行测试:

1 while true; do mysql -umhauser -h192.168.1.220 -pmhauser -P3306 -e "select now();";sleep 1;done


发现VIP对外服务终止时间为24s。
此时登录到 mha manager 发现服务停止( MHA 在自动故障切换后,复制集群的状态发生变化,所以每次自动故障切换完后,MHA都会停止),重新启动MHA需要修改相应配置信息。


登录到新的主库192.168.1.222查看复制机器(server_id 12233306,为原来的mysql-slave2: 192.168.1.223),可以发现原来的从库已经指向自己。


原主库已经宕机,如果原主库故障处理后可以正常启动,需要加入原复制集群,可以通过登录到mha manager 执行grep "CHANGE MASTER TO " manager.log获得结果重新对新主库进行复制。


至此,MHA一个完整的自动故障切换流程已经完成。

作者简介

天元,铜板街DBA,2017 年 7 月加入团队,目前主要负责公司所有业务的数据库相关运维。

                                


                      更多精彩内容,请扫码关注 “铜板街科技” 微信公众号。