mysql主从复制监控的脚本
今天笔者找到一个不错的mysql主从复制监控的脚本,经过测试正常。详情参考文章-Mysql实例连接数和主从复制延迟监控以及自动化告警推送 。
自己有双主复制的两个树莓派,修改好脚本后在两台机上部署,可以分别监控复制状态。从机主要监控三个状态:Slave_SQL_Running、Slave_IO_Running、Seconds_Behind_Master。主从机监控information_schema.processlist连接数、配置的max_connections最大连接数以及两个参数比值代表的连接百分比。
mysql_repl_monitor.sh脚本如下:
#!/bin/bash
#日志模块
curdate=$(date +"%Y%m%d")
curtime=$(date +'%Y-%m-%d %H:%M:%S')
logname="repl_check_"$curdate".log"
logfile=/home/pi/repl_check_log/$logname
user=phpmyadmin
passwd=root
# 从库实例
slave_ip=localhost
slave_port=3306
# 主库实例
master_ip=192.168.31.82
master_port=3306
# 实例复制状态巡检
function SlaveCheck() {
send_flag="init"
ProcCnt=0
io_thread=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -e"show slave stat us\G" |grep Slave_IO_Running: |awk '{print $2}')
sql_thread=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -e"show slave sta tus\G" |grep Slave_SQL_Running: |awk '{print $2}')
slv_delay=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -e"show slave stat us\G" |grep Seconds_Behind_Master: |awk '{print $2}')
ProcCnt=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -Ne"select count(*) from information_schema.processlist;")
TotalProc=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -Ne"show variables like 'max_connections';" |awk '{print $2}')
ProcPct=$(printf "%d" $((ProcCnt*100/TotalProc)))
#echo $TotalProc $ProcCnt $ProcPct
if [ ! -n "$io_thread" ] && [ ! -n "$sql_thread" ];then
msg="实例"$slave_ip":"$slave_port":主从配置为空,请及时查看!"
else
if [ x"$io_thread" == x'Yes' ] && [ x"$sql_thread" == x'Yes' ];then
if [ $slv_delay -gt 10 ];then
msg="实例"$slave_ip":"$slave_port":延迟"$slv_delay"秒"
echo $curtime" "$msg >>$logfile
else
send_flag="replication_ok"
msg="实例"$slave_ip":"$slave_port":replication_ok"
echo $curtime" "$msg >>$logfile
fi
else
msg="实例"$slave_ip":"$slave_port",io_thread或者sql_thread断开,请及时查看"
echo $curtime" "$msg >>$logfile
fi
fi
if [ $ProcPct -gt 75 ] && [ $ProcPct -le 90 ];then
msg="实例"$slave_ip":"$slave_port"连接数百分比达到"$ProcPct"%,请注意!"
echo $curtime" "$msg >>$logfile
elif [ $ProcPct -gt 90 ];then
msg="实例"$slave_ip":"$slave_port"连接数百分比达到"$ProcPct"%,请立即查看!"
echo $curtime" "$msg >>$logfile
else
msg="实例"$slave_ip":"$slave_port"连接数百分比达到"$ProcPct"%,正常"
echo $curtime" "$msg >>$logfile
fi
}
function MasterLoadMon() {
ProcCnt=$(mysql -u$user -p$passwd -h$master_ip -P$master_port -Ne"select count(* ) from information_schema.processlist;")
TotalProc=$(mysql -u$user -p$passwd -h$master_ip -P$master_port -Ne"show variabl es like 'max_connections';" |awk '{print $2}')
ProcPct=$(printf "%d" $((ProcCnt*100/TotalProc)))
if [ $ProcPct -gt 75 ] && [ $ProcPct -le 90 ];then
msg="实例"$master_ip":"$master_port"连接数百分比达到"$ProcPct"%,请注意!"
echo $curtime" "$msg >>$logfile
elif [ $ProcPct -gt 90 ];then
msg="实例"$master_ip":"$master_port"连接数百分比达到"$ProcPct"%,请立即查看!"
echo $curtime" "$msg >>$logfile
else
msg="实例"$master_ip":"$master_port"连接数百分比达到"$ProcPct"%,正常"
echo $curtime" "$msg >>$logfile
fi
}
MasterLoadMon
SlaveCheck
此脚本最主要的是知道从机状态,比如sql_thread=$(mysql -u$user -p$passwd -h$slave_ip -P$slave_port -e"show slave status\G" |grep Slave_SQL_Running: |awk '{print $2}'),连接到数据库执行命令查看从机状态show slave status\G,找对应的线程Slave_SQL_Running是否正常。
还有一个参数:Seconds_Behind_Master,官方解释是In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread.该值是SQL thread和 I/O thread.之间的差值。relay log中event记录的时间戳是主库上的时间戳,而SQL thread的时间戳是从库上的,所以这个参数的前提是主从机时间一致。
脚本可以放置在crontab定时任务中,或者可以解决我的文章-Mysql检查脚本控制keepalived(1) 中需要检查同步完成后才操作keepalived完成VIP漂移。
具体怎么操作呢?连接到数据库执行命令查看主机状态show master status,从机状态show slave status\G,找对应的二进制文件位置对比作为判断条件。
从机二进制位置 主机二进制位置但是master故障后就可能读不到主机状态,只能通过slave的状态来判断,不知怎么进一步判断。留待后续解决。