MHA 是Perl语言写的,开源的MYSQL故障切换方案;全称:Master High Availability,故障切换时间10-30s
有人说,我不要MHA行不行啊; 可以,没问题, 如果数据库故障了,自己手动去登陆从库,然后CHANGE MASTER;
那问题来了,首先你这样得耗费多少时间;其次,你的几个SLAVE,你还得一个个对比,看谁执行的BINLOG比较新一些吧;
这个时候,业务无法访问了,一堆人站你旁边看着你,到时候一紧张再忘记开写了、SLAVE挂不上去,这个影响时间就不是一星半点了;
所以就有人写了个程序,来执行自动主从故障切换解决这个问题;
MHA由node和manager组成;
node:
就是所有数据库机器都需要部署的, master是一个node,slave也是一个node; 相当于监控客户端;
manager:
Manager相当server,它会对node进行管理,配置检查,binlog和relay log的获取,执行切换任务等; 可以单独部署在server上(推荐),单独部署可以管理多套主从架构。也可以部署在某一个slave上; 如果部署在slave上,那么该slave就无法 被升级为主库;
MHA切换主要涉及下面几个步骤:
1, MHA每隔3秒钟探测一次MASTER; (Hi, 你还活着吗?)
ping_interval 控制间隔时间;
ping_type 控制探测方式,SELECT(执行SELECT 1)和CONNECT(创建连接/断开连接)
2, 如果manager探测到MASTER 故障,无法访问,Manager会执行下面操作:
a, 从其他node发起,检查主库是否能够SSH上去;
b 从其他node发起连接,检查MASTER实例是否能够登陆;
3, 如果所有Node均连接失败,则开始故障转移,步骤如下:
Phase 1 | Configuration Check Phase.. | 检查数据库版本 检查是否启用GTID 检查从库是否存活 检查配置文件的candidate |
Phase 2 | Dead Master Shutdown Phase. | 该阶段会调用master_ip_failover脚本;去关闭所有Node的IO Thread 调用shutdown_script 强制关闭MASTER实例,防止应用程序来连接; |
Phase 3 | Master Recovery Phase.. | |
Phase 3.1 | Getting Latest Slaves Phase. | 检查所有节点,从show slave status中对比获取最新的binlog/position |
Phase 3.2 | Saving Dead Master's Binlog Phase.. | 如果老的Master可以SSH,上去获取BINLOG,从position到END位置,获取这段BINLOG(MASETER产生这段BINLOG,还未来得及发送给SLAVE)将这部分日志发送给Manager节点(manager_workdir位置); 如果故障Master无法SSH,则无法获取这段日志 |
Phase 3.3 | Determining New Master Phase.. | 对比所有SLAVE,从最新SALVE中同步差异realy log给其他slave;最终确保所有SLAVE数据一致 |
Phase 3.3 | New Master Diff Log Generation Phase.. | 确认新master 是否为最新slave,如果不是,则从最新slave获取差异日志; 将manager上获取的BINLOG日志发送给new master; |
Phase 3.4 | Master Log Apply Phase.. | 对比新master的Exec_Master_Log_Pos和Read_Master_Log_Pos,判断恢复的位置; 在本地回放 3.3 Phase的差异日志; 获取新master的binlog和position; |
Phase 4 | Slaves Recovery Phase.. | |
Phase 4.1 | Starting Parallel Slave Diff Log Generation Phase. | 对每个SLAVE恢复:所有SLAVE和最新Slave做对比,如果position不一致,则生产差异日志 |
Phase 4.2 | Starting Parallel Slave Log Apply Phase. | 每个SLAVE 应用差异日志; 执行CHANGE MASTER 挂在到新Master |
Phase 5 | New master cleanup phase.. | reset slave all; |
MHA脚本文件介绍介绍:
在已安装的Node节点上,执行 可以查看Node安装包和Manager安装包锁包含的脚本文件;
查看Node脚本: rpm -ql mha4mysql-node-0.56-0.el6.noarch
1 | apply_diff_relay_logs | 识别差异的中继日志,并将其应用到其他SLAVE |
2 | filter_mysqlbinlog | 去除掉不必要的ROLLBACK事件,已废弃,默认不启用 |
3 | purge_relay_logs | 清理relay logs,不会阻塞SQL线程 |
4 | save_binary_logs | 保存binlog和relay log日志 |
查看Manager脚本:rpm -ql mha4mysql-manager-0.56-0.el6.noarch
1 | masterha_check_repl | 切换前检查复制的运行情况 |
2 | masterha_check_ssh | 检查SSH连接 |
3 | masterha_secondary_check | 从其他网络路由检查主库的可用性 |
4 | masterha_check_status | 返回MYSQL主库状态监控信息; |
5 | masterha_conf_host | 从配置文件中增加或者删除host |
6 | masterha_manager | 监控Master可用性,如果master故障,则执行故障切换 |
7 | masterha_master_monitor | 监控主库的可用性 |
8 | masterha_master_switch | 执行主从切换 |
9 | masterha_stop | 停掉MHA Manager进程 |
实例脚本:
1 | master_ip_failover | 自动切换时,VIP的管理脚本, |
2 | master_ip_online_change | 在线切换时,VIP的管理,不是必须的 |
3 | power_manager | 电源管理脚本 |
4 | send_report | 发送告警脚本 |