美文网首页
mysql主从复制监控的脚本

mysql主从复制监控的脚本

作者: 刘小白DOER | 来源:发表于2020-10-05 22:58 被阅读0次

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

    相关文章

      网友评论

          本文标题:mysql主从复制监控的脚本

          本文链接:https://www.haomeiwen.com/subject/lfmguktx.html