MHA是一个非常优秀的实现数据库高可用的解决方案,起初学习过程中,比较感兴趣,就通过Shell去简单模拟实现了这个过程。
脚本实现的功能:
运行初始化脚本实现:
1.通过手动填写使用的代理端manager和数据库端( 默认1个master,2个slave )主机名和IP;自动化部署Ansible,让Manager成为中控机,数据库端的master,slave为受控机
2.在受控机上自动化安装mysql5.7版本,修改初始化密码为123!@#Qq
3.可指定master主机,备份主库使恢复到从库,完成1主2从,半复制模式
4.将manager的3306端口到master的3306的双向端口映射
5.由manager持续性监控master的状态,如果通信都出故障了,通过gtid辅助选举目前数据更新最快的slave数据库;进行master更新以及所有剩下的slave指向新的master
6.监控原来宕机的master状态,如果恢复了,能够自动加入到集群,成为slave服务器
模拟实现具体过程:
bin/setup.sh 进行初始化并启动服务;
bin/stop_mymha.sh 进行服务关闭;
logs/change.log 记录每次master状态改变情况
注意: 附件tar包解压释放到/usr/local/下,启动路径为/usr/local/mymha/bin/setup.sh
1.准备四台无数据库的节点,实验环境为4台Centos 7.5;
1台 Manager 【作为后续的ansible中控机,也是访问的代理机】
3台 Mysql数据库 【1台 Master,2台Slave】
注意:需要提前在Manager上配置好对所有数据库服务器的ssh免密
2.手动修改conf/mha.conf的定制的配置文档,其中manager和数据库主机的主机名和IP地址(脚本识别是Eth0)
3.抓取其配置文件中的IP和hostname信息,并指定master主机,出master和manager外都作为slave主机,并存入arr数组,方便调用
4.通过数组生成Ansible的主机清单,生成配置文件
5.通过packages目录下预准备的Mysql7.5相关安装包,对master和slave进行批量安装,并修改初始密码为123!@#Qq
6.预准备主和从库的my.cnf模板,对应开启server-id,指定日志文件名,半复制模式,开启gtid,在master数据库服务器上注册从服务器需要的同步账户repluser并授权
7.备份主库的数据库(备份指定--master-data --set-gtid-purged=ON),后续恢复的数据库可以识别日志偏移量和gtid的特性;将备份的数据库传回manager节点,下发到从库并还原,通过预准备的my.cnf模板和备份的数据库文件中偏移量完成主从架构
8.设置manager节点上的iptables,完成3306端口的双向映射,客户机访问manager实现访问到数据库服务
9.开启我们监控任务,模拟检测master状态,通过ping命令,每次完成5次1秒测试,如果100%丢包,认为该master节点宕机。激活选举任务,通过抓取gtid来辅助判定slave数据库的通过情况,通过排序来选举出最快的选手成为我们新的master
10.重新完成类似前面初始化的过程,给master和slave重新更新一下my.cnf文件,让剩余的slave重新指向新的master节点
11.上述完成后激活监控宕机的master的生命情况,如果5次ping都没丢包,认为宕机的master恢复正常,立刻完成由原有master角色到新master的slave角色
12.继续循环监控Master的状态...
测试: 手动在Master注册授权一个测试账号,登录时指定数据库为Manager节点
附件: 打包文件为实现过程,实现过程比较粗糙,还有很多可以改进的地方,只是自己感兴趣,就简单实现了一下。成长路上抛砖引玉,多交流!
https://share.weiyun.com/vhzuOEKThttps://share.weiyun.com/vhzuOEKT
注意: 附件tar包解压释放到/usr/local/下,启动路径为/usr/local/mymha/bin/setup.sh