前段時間給大家分享了敏捷運維的一些概念和案例呻粹,非常眼饞微博的DBA能喝著茶看著大部分故障一個個被自動處理掉,研究了一下發(fā)現(xiàn)實現(xiàn)起來并不難元践,我做了一個案例給大家分享:
案例簡介:Mysql主從復(fù)制中會經(jīng)常遇到同步失斞衅埂(原因很多,不闡述了)被辑,現(xiàn)有監(jiān)控工具無法探測到,每次clecklist的時候會發(fā)現(xiàn)可能已經(jīng)停了好幾天敬惦,重啟同步進程90%情況下是有效的盼理,基于上述原因,做了一個腳本定時監(jiān)聽同步進程俄删,出錯后發(fā)郵件并嘗試修復(fù)宏怔,修復(fù)結(jié)果再發(fā)郵件通知。
適用范圍: ? ? 服務(wù)器進程奔潰(重啟進程)畴椰、CPU內(nèi)存過高(重啟進程)臊诊、空間不足(擴文件系統(tǒng))、系統(tǒng)日志中特定異常等等經(jīng)常發(fā)生的且需要人工干預(yù)的已知問題或每天需要做的checklist
工具: ? ? 腳本語言(示例為shell)
效果: ? ? 大大降低管理員人工運維工作量斜脂,能夠較為精確的統(tǒng)計故障發(fā)生頻率和時間抓艳,以及是否被自動修復(fù),具有一定概率可以在用戶報修前解決問題帚戳。
目標: ? ? 原則上可替代絕大部分checklist壶硅,看著故障一個個出現(xiàn)又一個個被修復(fù)威兜,大大提高管理員的幸福指數(shù)
Tips: ? ? ? ?再貴的工具也不是萬能的销斟,不如有針對性的腳本來的可靠庐椒;將運維經(jīng)驗提煉成類似的自動化腳本可以大幅提升一個運維團隊的運維質(zhì)量和效率
自動處理流程:
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 * * * * 十分鐘執(zhí)行一次
# mailx support
#===================
# Parameters
user=******
password=******
host=******
email=****@********.com
logfile=/tmp/slave.log
flagfile=/tmp/slaveisrestarted
# 執(zhí)行show slave status, 將關(guān)注的數(shù)據(jù)篩選出來存入臨時文件$logfile
mysql -u$user -p$password -h$host -e "show slave status\\G;" | grep -i running > $logfile
# 查詢臨時文件,輸出結(jié)果判斷進程是否正常
if [ `cat $logfile | grep -i Slave_IO_Running: | awk '{print $2}'` = Yes ]
?then
? ? echo "slave IO process is OK"
else
#郵件通知出錯時間蚂踊,暫未發(fā)現(xiàn)過IO process錯誤约谈,需要人工干預(yù)
? ? 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"
#進程已正常,如存在出錯標簽犁钟,說明問題已修復(fù)棱诱,發(fā)郵件告知已自動修復(fù)
? if [ -f "$flagfile" ];
? ? then
? ? ? rm -rf $flagfile
? ? ? echo "slave SQL process is fixed automatically"|mailx -s "Alarm info from $host" $email
? fi
#進程不正常,如存在出錯標簽涝动,說明問題不可被自動修復(fù)迈勋,發(fā)郵件告知需人工干預(yù)
else
? if [ -f "$flagfile" ];
? ? then
? ? ? echo "slave SQL process is error and cannot to be autofixed"|mailx -s "Alarm info from $host" $email
#進程不正常,如不存在出錯標簽醋粟,說明問題第一次發(fā)生靡菇,嘗試重啟進程
? else ?
? ? ? mysql -u$user -p$password -h$host -e "stop slave;"
? ? ? sleep 5
? ? ? mysql -u$user -p$password -h$host -e "start slave;"
#創(chuàng)建出錯標簽,發(fā)郵件告知自動處理中
? ? ? 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
再舉一個日志檢查的例子:
定期檢索當(dāng)天的java日志米愿,篩選將含有OutOfMemoryError的語句輸出到臨時文件厦凤,判斷文件大小是否 > 0 kb,如果返回ture育苟,表示該java主機發(fā)生內(nèi)存溢出较鼓,一般是線程太多,資源沒有被回收導(dǎo)致违柏,可以立即重啟服務(wù)進程博烂,每個過程發(fā)郵件告知管理員,執(zhí)行完畢刪除臨時文件漱竖。
內(nèi)存溢出后會造成服務(wù)器訪問不穩(wěn)定禽篱,用戶訪問慢,在多臺機器負載均衡的情況下闲孤,重啟其中一臺對用戶無感知谆级,如果10分鐘檢查一次,用戶可能還沒發(fā)現(xiàn)問題就解決了讼积,一般這個問題幾周發(fā)生一次肥照,一個小腳本完全就搞定了。
當(dāng)然如果一天內(nèi)頻繁收到郵件在自動修復(fù)勤众,肯定就是前一天發(fā)布的程序問題或者訪問量達到瓶頸舆绎,需要人工介入了。
原創(chuàng)作品们颜,轉(zhuǎn)載請注明出處 ?http://www.reibang.com/p/61f367886714
email ? ?sam.z.s@163.com