该 Mysql 主从及高可用框架及其中使用的脚本仅供初期测试使用,暂未考虑生产模式使用场景。
1,Mysql_MHA
MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,在 MySQL 故障切换过程中,MHA 能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
2,mha4mysql-manager及mha4mysql-node
官方文档:地址
3,breeze2/mha4mysql-manager:0.57镜像
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信息
4,breeze2/mha4mysql-node:0.57镜像
Node 工具包(这些工具通常由 MHA Manager 的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
5,docker与docker-compose
Linux 系统下:
1,切换 docker-compose.yml 所在目录
$ cd mhsql-mha-docker
2,启动容器
# docker-compose up -d
3,启动各容器sshd服务并将生成的公钥写入其他容器 /root/.ssh/authorized_keys
文件
# sh ./scripts/ssh_start.sh
# sh ./scripts/ssh_share.sh
4,检查 MHA 中 ssh 连接情况
# sh ./scripts/mha_check_ssh.sh
或者进入容器 mha_manager 中
# docker exec -it mha_manager bash
(容器中)
# masterha_check_ssh --conf=/etc/mha/app1.conf
5,配置 Mysql 数据库主从[ master(主库),backup(备用主库),slave(从库)]
# sh ./scripts/mysql_set_mbs.sh
6,检查 MHA 中 repl 情况
# sh ./scripts/mha_check_repl.sh
或者进入容器 mha_manager 中
# docker exec -it mha_manager bash
(容器中)
# masterha_check_repl --conf=/etc/mha/app1.conf
7,启动 MHA Manager
sh ./scripts/mha_start_manager.sh
或者进入容器 mha_manager 中
# docker exec -it mha_manager bash
(容器中)
# masterha_manager --conf=/etc/mha/app1.conf
本文档解决的是 Mysql 原官方社区版的主从及高可用问题。后续可以采用 MHA + maxscale 的方式,该方案能以最小的代价对现有系统进行变更,进一步提高系统的可用性和稳定性。且 maxscale 与 MHA 兼容性好。
另外通过 MHA + keepalived 方式也可进一步提升可用性。
Slave failed to initialize relay log info structure from the repository
解决方法:(该脚本待修改,仅供测试使用)
# sh ./script/origin_clear.sh
ssh: connect to host 10.5.0.10 port 22: No route to host
解决方法:
10.5.0.10容器处在关闭状态
Got Error so couldn’t continue failover from here
解决方法:
查看 MHA 日志确认具体原因,可能为 ssh 无法访问,MHA_Manager 容器中关键脚本缺失等