最近笔者逛论坛发下一个Mysql数据库的健康检查脚本,来试验一下。按照之前的两个树莓派配置:mariadb双主复制+keepalived,只能在树莓派服务器宕机、进程阻塞、网络故障等情况下才会VIP漂移,Mysql数据库本身发生故障是不会切换的。
mysqlHealthCheck.sh
#!/bin/sh
while:
do
mysql -uroot -proot -e"select version();"
if[ $? -ne 0 ]; then
#echo "mysql error!!!"
service keepalived stop
else
keepalivedcheck=`ps -C keepalived --no-header | wc -l`
if[$keepalivedcheck-eq 0 ] ;then
service keepalived start
else
#echo "keepalived is running" :
fi
#echo "mysql running!!!"
fi
sleep 5
done
这个脚本通过5秒的循环执行来检查数据库执行select version();是否正常来检查数据库是否正常。其中有两个重要的命令如下:
mysql -uroot -proot -e"select version();"连接数据库并执行select version();
keepalivedcheck=`ps -C keepalived --no-header | wc -l 列出keepalived进程的行数,不包括头部那一行。当然这个命令也可以用 ps -ef |grep keepalived| grep -v grep |wc -l 来代替,输出结果都是2。
在实际运行, service keepalived start/stop需要root权限,需要加上sudo service keepalived start/stop 才能成功。可以运行service mysql stop 停掉一个mysql ,通过VIP检查客户端数据库访问和交互是否正常。
脚本 nohup /etc/keepalived/mysqlHealthCheck.sh >/dev/null 2>log &放置在两台树莓派/etc/init.d下就可以开机启动,每五秒执行一次这个脚本。在数据库故障时,sudo service keepalived stop,VIP漂移到热备树莓派;在数据库恢复正常时,sudo service keepalived start重新开启开启keepalived 进程,如果是master抢占式VIP就会重新漂移回来。
此脚本忽略两个数据库同步问题,不等从数据库把数据同步完就进行切换。如果时间不局限于5秒的话,可以不要while循环,只需要脚本中黑色部分,放在cron定时任务下1分钟检查 一次。但是如果mariadb是基于GTID复制,数据没有同步完需要怎么检查呢?留待下一次来完善吧!
整个脚本只负责控制keepalived 进程的启动和停止,伴随着VIP的漂移,摒弃故障mysql数据库。但在故障时,调用日志/var/log/mysql/error.log,通知运维人员来处理,这个就有其他脚本来处理。数据库恢复正常后,在测试阶段可以杀掉 mysqlHealthCheck.sh脚本进程,然后在运行脚本,自动拉起keepalived 进程。
网友评论