前段時間給大家分享了敏捷運維的一些概念和案例,非常眼饞微博的DBA能喝著茶看著大部分故障一個個被自動處理掉,研究了一下發現實現起來并不難,我做了一個案例給大家分享:
案例簡介:Mysql主從復制中會經常遇到同步失?。ㄔ蚝芏?,不闡述了),現有監控工具無法探測到,每次clecklist的時候會發現可能已經停了好幾天,重啟同步進程90%情況下是有效的,基于上述原因,做了一個腳本定時監聽同步進程,出錯后發郵件并嘗試修復,修復結果再發郵件通知。
適用范圍: ? ? 服務器進程奔潰(重啟進程)、CPU內存過高(重啟進程)、空間不足(擴文件系統)、系統日志中特定異常等等經常發生的且需要人工干預的已知問題或每天需要做的checklist
工具: ? ? 腳本語言(示例為shell)
效果: ? ? 大大降低管理員人工運維工作量,能夠較為精確的統計故障發生頻率和時間,以及是否被自動修復,具有一定概率可以在用戶報修前解決問題。
目標: ? ? 原則上可替代絕大部分checklist,看著故障一個個出現又一個個被修復,大大提高管理員的幸福指數
Tips: ? ? ? ?再貴的工具也不是萬能的,不如有針對性的腳本來的可靠;將運維經驗提煉成類似的自動化腳本可以大幅提升一個運維團隊的運維質量和效率
自動處理流程:
shell腳本示例:
#!/bin/sh
# Provides: Sam Zhao
# Version:1.7
# MySQL slave process monitor and auto fix
# Usually this is put in /etc/scripts
# crontab time: */10 * * * * 十分鐘執行一次
# mailx support
#===================
# Parameters
user=******
password=******
host=******
email=****@********.com
logfile=/tmp/slave.log
flagfile=/tmp/slaveisrestarted
# 執行show slave status, 將關注的數據篩選出來存入臨時文件$logfile
mysql -u$user -p$password -h$host -e "show slave status\\G;" | grep -i running > $logfile
# 查詢臨時文件,輸出結果判斷進程是否正常
if [ `cat $logfile | grep -i Slave_IO_Running: | awk '{print $2}'` = Yes ]
?then
? ? echo "slave IO process is OK"
else
#郵件通知出錯時間,暫未發現過IO process錯誤,需要人工干預
? ? echo "slave IO process is error at `date`"|mailx -s "Alarm info from $host" $email
fi
if [ `cat $logfile | grep -i Slave_SQL_Running: | awk '{print $2}'` = Yes ]
?then
? ? echo "slave SQL process is OK"
#進程已正常,如存在出錯標簽,說明問題已修復,發郵件告知已自動修復
? if [ -f "$flagfile" ];
? ? then
? ? ? rm -rf $flagfile
? ? ? echo "slave SQL process is fixed automatically"|mailx -s "Alarm info from $host" $email
? fi
#進程不正常,如存在出錯標簽,說明問題不可被自動修復,發郵件告知需人工干預
else
? if [ -f "$flagfile" ];
? ? then
? ? ? echo "slave SQL process is error and cannot to be autofixed"|mailx -s "Alarm info from $host" $email
#進程不正常,如不存在出錯標簽,說明問題第一次發生,嘗試重啟進程
? else ?
? ? ? mysql -u$user -p$password -h$host -e "stop slave;"
? ? ? sleep 5
? ? ? mysql -u$user -p$password -h$host -e "start slave;"
#創建出錯標簽,發郵件告知自動處理中
? ? ? touch $flagfile
? ? ? echo "slave SQL process is error at `date` and tried to restart"|mailx -s "Alarm info from $host" $email
? fi
fi
#刪除臨時文件$logfile
rm -rf $logfile
再舉一個日志檢查的例子:
定期檢索當天的java日志,篩選將含有OutOfMemoryError的語句輸出到臨時文件,判斷文件大小是否 > 0 kb,如果返回ture,表示該java主機發生內存溢出,一般是線程太多,資源沒有被回收導致,可以立即重啟服務進程,每個過程發郵件告知管理員,執行完畢刪除臨時文件。
內存溢出后會造成服務器訪問不穩定,用戶訪問慢,在多臺機器負載均衡的情況下,重啟其中一臺對用戶無感知,如果10分鐘檢查一次,用戶可能還沒發現問題就解決了,一般這個問題幾周發生一次,一個小腳本完全就搞定了。
當然如果一天內頻繁收到郵件在自動修復,肯定就是前一天發布的程序問題或者訪問量達到瓶頸,需要人工介入了。
原創作品,轉載請注明出處 ?http://www.lxweimin.com/p/61f367886714
email ? ?sam.z.s@163.com