自動監控從MySQL同步的腳本
原創【51CTO獨家特稿】筆者有不少基于公網類型的網站(沒有硬件防火墻,直接置于IDC機房)做的都是MySQL主從架構,從機主要起備份數據庫和冷備份的作用,雖然從機宕機了問題不大,但也影響數據的備份工作;這樣的網站有數十個,如果一個一個手動的檢查,每天都要浪費不少時間,所以設計了一個自動監控從MySQL同步的腳本。
腳本設計思路:
1、此腳本應該能適應各種各樣不同的內外網環境,即IP不同的環境;
2、讓腳本也順便監控下MySQL是否正常運行;
3、Slave機器的IO和SQL狀態都必須為YES,缺一不可,這里用到了多重條件判斷-a。
腳本內容:
#crontab time 00:10
#!/bin/bash
#check MySQL_Slave Status
#crontab time 00:10
MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'`
MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'`
IO_env=`echo $STATUS | grep IO | awk ' {print $2}'`
SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`
DATA=`date +"%y-%m-%d %H:%M:%S"`
if [ "$MYSQLPORT" == "3306" ]
then
echo "mysql is running"
else
echo $MYSQLIP mysql is down" | mail -s "warn!server: $MYSQLIP mysql is down" 1309889xxxx@wo.com.cn
fi
if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]
then
echo "Slave is running!"
else
echo "Slave is not running!" | mail -s "warn! $DATA $MYSQLIP MySQL Slave is not running" 1309889xxxx@163.com
fi
上面是最終版本,增加了DATA參數,可以準確定位是哪一個時間點MySQL主從出現了問題。大家可以比較一下與之前***個版本有什么不同:
#!/bin/bash
#check MySQL_Slave Status
#crontab time 00:10
MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'`
MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'`
STATUS=$(/usr/local/webserver/mysql/bin/mysql -u yuhongchun -pyuhongchun101 -S /tmp/mysql.sock -e "show slave status\G" | grep -i "running")
IO_env=`echo $STATUS | grep IO | awk ' {print $2}'`
SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`
if [ "$MYSQLPORT" == "3306" ]
then
echo "mysql is running"
else
mail -s "warn!server: $MYSQLIP mysql is down" yuhongchun027@163.com
fi
if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]
then
echo "Slave is running!"
else
echo "####### $date #########">> /data/data/check_mysql_slave.log
echo "Slave is not running!" >> /data/data/check_mysql_slave.log
mail -s "warn! $MySQLIP_replicate_error" yuhongchun027@163.com << /data/data/check_mysql_slave.log
fi
使用方式:
用crontab設置定期運行,建議每十分鐘運行一次
*/10 * * * * root /bin/sh /root/mysql_slave.sh
記得在每臺MySQL從機上分配一個yuhongchun的用戶,權限大些也沒關系,只限定在本地運行,如下所示:
grant all privileges on *.* to "yuhongchun"@"127.0.0.1" identified by "yuhongchun101"; grant all privileges on *.* to "yuhongchun"@"localhost" identified by "yuhongchun101";
后期應用:
后期公司的MySQL數據庫準備由一主一從架色升級成一主多從,讀寫分離的架構,LVS作從數據庫的負載均衡器,此腳本自動監控從MySQL的replication狀態,如果不能同步則自動關閉本機的MySQL服務,免得影響整個網站的正常業務訪問。當然了,到時腳本的運行周期肯定也需要更改,由10分鐘變成秒級的,這個可以通過while循環來實現。
大家如果考慮用手機郵的話,有些事情也請注意一下:
一、Linux服務器本身就有sendmail服務的,它發送郵件的功能的效果就不錯,沒必要再經過公司的郵箱服務器中轉;
二、聯通雖然可以和郵箱綁定并設置郵件到達發送警報,但發現聯通的號延遲問題、到達問題還是很多,建議大家還是以移動的號為主;
三、這種報警策略只是作為輔助而已。
【51CTO.com獨家特稿,轉載請注明原文作者和出處。】
【編輯推薦】
























