自動監(jiān)控從MySQL同步的腳本
原創(chuàng)【51CTO獨家特稿】筆者有不少基于公網(wǎng)類型的網(wǎng)站(沒有硬件防火墻,直接置于IDC機房)做的都是MySQL主從架構(gòu),從機主要起備份數(shù)據(jù)庫和冷備份的作用,雖然從機宕機了問題不大,但也影響數(shù)據(jù)的備份工作;這樣的網(wǎng)站有數(shù)十個,如果一個一個手動的檢查,每天都要浪費不少時間,所以設(shè)計了一個自動監(jiān)控從MySQL同步的腳本。
腳本設(shè)計思路:
1、此腳本應(yīng)該能適應(yīng)各種各樣不同的內(nèi)外網(wǎng)環(huán)境,即IP不同的環(huán)境;
2、讓腳本也順便監(jiān)控下MySQL是否正常運行;
3、Slave機器的IO和SQL狀態(tài)都必須為YES,缺一不可,這里用到了多重條件判斷-a。
腳本內(nèi)容:
#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參數(shù),可以準確定位是哪一個時間點MySQL主從出現(xiàn)了問題。大家可以比較一下與之前***個版本有什么不同:
#!/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設(shè)置定期運行,建議每十分鐘運行一次
*/10 * * * * root /bin/sh /root/mysql_slave.sh
記得在每臺MySQL從機上分配一個yuhongchun的用戶,權(quán)限大些也沒關(guān)系,只限定在本地運行,如下所示:
grant all privileges on *.* to "yuhongchun"@"127.0.0.1" identified by "yuhongchun101"; grant all privileges on *.* to "yuhongchun"@"localhost" identified by "yuhongchun101";
后期應(yīng)用:
后期公司的MySQL數(shù)據(jù)庫準備由一主一從架色升級成一主多從,讀寫分離的架構(gòu),LVS作從數(shù)據(jù)庫的負載均衡器,此腳本自動監(jiān)控從MySQL的replication狀態(tài),如果不能同步則自動關(guān)閉本機的MySQL服務(wù),免得影響整個網(wǎng)站的正常業(yè)務(wù)訪問。當然了,到時腳本的運行周期肯定也需要更改,由10分鐘變成秒級的,這個可以通過while循環(huán)來實現(xiàn)。
大家如果考慮用手機郵的話,有些事情也請注意一下:
一、Linux服務(wù)器本身就有sendmail服務(wù)的,它發(fā)送郵件的功能的效果就不錯,沒必要再經(jīng)過公司的郵箱服務(wù)器中轉(zhuǎn);
二、聯(lián)通雖然可以和郵箱綁定并設(shè)置郵件到達發(fā)送警報,但發(fā)現(xiàn)聯(lián)通的號延遲問題、到達問題還是很多,建議大家還是以移動的號為主;
三、這種報警策略只是作為輔助而已。
【51CTO.com獨家特稿,轉(zhuǎn)載請注明原文作者和出處?!?/p>
【編輯推薦】