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 statusG |
查看上面所说的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 STATUSG"| 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主从复制教程解问题解答