如何监控MySQL主从同步情况

Vonnie14H 9年前

来自: http://my.oschina.net/lwaif/blog/630436


在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成网站正常运行的重要环节。

MySQL主从同步监控

MySQL同步功能由3个线程(master上1个,slave上2个)来实现,简单的说就是:master发送日志一个,slave接收日志一个,slave运行日志一个。

首先,我们解释一下 show slave status  中重要的几个参数:
Slave_IO_Running: I/O线程是否被启动并成功地连接到主服务器上。

Slave_SQL_Running: SQL线程是否被启动。

Seconds_Behind_Master

本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。

如何监控从服务器是否正常运行呢?

1. 手动执行SHELL脚本

show slave status\G

查看上面所说的3个参数是否正常运行。

2. Percona Toolkit

Percona Toolkit 提供了一些MySQL数据库相关的工具,可以很好的管理MySQL数据库。
Percona工具包可以去这里下载:http://www.percona.com/software/percona-toolkit

pt-heartbeat: 监控MySQL从服务器的延时时间。
pt-slave-restart: 管理MySQL从服务器重启。
pt-table-checksum: 检查主从同步数据的一致性,比如遇到复制错误,我们执行了skip error操作之后,检查一下数据还是很有必要的。不过这个工具需要提前设置一下,安装相应的checksum表,请参阅相关资料。

3. 第三方工具

MySQL Enterprise Monitor,MySQL企业版监控工具。
MONyog – MySQL Monior and Advisor,MONyog大家都不陌生,windows下比较好用的MySQLGUI提供者,也有相关MySQL监控工具。

4. Nagios 以及Zabbix 的相关插件。

Nagios相关插件还是很丰富的,大家可以找到相关MySQL Slave的监控工具。

最后,这里给大家一个开源的MySQL Slave的监控脚本,实用cronjob或者其他相关工具就可以轻易的设置自己的监控工具。

比如我们实用Jenkins+shell脚本,做失败通知即可迅速的搭建一个简单的MySQL监控工具。

MySQL Slave 监控脚本:

#!/bin/bash  # (C) 2012 - Vincent van Scherpenseel, SYN-ACK.org     ### VARIABLES ###  SERVER=`hostname`  SECONDS_BEHIND_MASTER=`/usr/bin/mysql -e "SHOW SLAVE STATUS\G"| grep "Seconds_Behind_Master" | awk -F": " {' print $2 '}`  SENTFILE_BROKEN=/tmp/mysql_slaverep_broken.sent  SENTFILE_BEHIND=/tmp/mysql_slaverep_behind.sent        ### CHECK FOR REPLICATION BREAK ###  if [ "$SECONDS_BEHIND_MASTER" == "NULL" ]; then          # Slave replication is broken             if [ ! -f $SENTFILE_BROKEN ]; then                  # This has not been reported before                  echo "Slave replication broken on $SERVER"                  touch $SENTFILE_BROKEN          fi  else          # Slave replication is not broken             if [ -f $SENTFILE_BROKEN ]; then                  # It was broken before which was reported. Clear that state                  echo "Slave replication has been restored on $SERVER"                  rm $SENTFILE_BROKEN          fi             ### CHECK FOR REPLICATION DELAY ###          if [ "$SECONDS_BEHIND_MASTER" -gt "60" ]; then                  # Slave replication is delayed                     if [ ! -f $SENTFILE_BEHIND ]; then                          # This has not been reported before                          echo "Slave replication is $SECONDS_BEHIND_MASTER seconds behind master on $SERVER"                          touch $SENTFILE_BEHIND                  fi          else                  # Slave replication is not delayed                     if [ -f $SENTFILE_BEHIND ]; then                          # It was delayed before which was reported. Clear that state                          echo "Slave replication delay has been recovered and is now $SECONDS_BEHIND_MASTER seconds behind master on $SERVER"                          rm $SENTFILE_BEHIND                  fi          fi     fi 

推荐阅读:
如何添加新数据库到MySQL主从复制列表