mysql主从复制监控的脚本

2020-10-05  本文已影响0人  刘小白DOER

    今天笔者找到一个不错的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的状态来判断,不知怎么进一步判断。留待后续解决。

上一篇下一篇

猜你喜欢

热点阅读