在大型網站架構中,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 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主從復制教程解問題解答