2019-05-24聊天服務(wù)器故障處理記錄
1、故障可能原因分析
在沒有更新前后端代碼邏輯的情況下,服務(wù)器突然登不上,最有可能的原因是mongodb連接斷開,或者mongodb死鎖了。
前幾次服務(wù)器故障也是mongodb的問題,因此首先需要確認(rèn)是不是mongodb出問題了。
2、初步確認(rèn)故障原因
確認(rèn)是不是mongodb掛了,或者mongodb存在死鎖或慢查詢
1)ssh登錄服務(wù)器:
2)分析服務(wù)器性能:?
輸入命令ps aux --sort -rss ,看cup是否被撐爆
輸入mongo進(jìn)入mongo shell ,
輸入db.currentOp()?查看當(dāng)前mongo進(jìn)程,看能不能找到與huarenchat數(shù)據(jù)庫(kù)相關(guān)的記錄。
db.currentOp()多輸入幾次,如果存在huarenchat,可以確定是mongo數(shù)據(jù)庫(kù)死鎖了。
復(fù)制下面命令,殺進(jìn)程所有當(dāng)前的mongo進(jìn)程:
var ops = db.currentOp().inprog; for(i = 0; i < ops.length; i++){ var opid = ops[i].opid; db.killOp(opid); print("Stopping op #"+opid)
}
注意:進(jìn)程可能殺不完,殺了又有,或者在某一刻沒有,但不表示殺干凈。
通過這一步,可以初步故障由mongod數(shù)據(jù)庫(kù)引起
3、查看服務(wù)器日志,確認(rèn)故障
輸入pm2 log 可以查看服務(wù)器正在生成的日志
response time可能高達(dá)20幾秒,這一步可以確認(rèn)故障是由mongodb查詢慢導(dǎo)致
4、找到慢查詢的原因,通過開啟mongodb性能分析工具
1)輸入mongo進(jìn)入shell (有可能mongo斷開了連接,進(jìn)入不了,需重新啟動(dòng)mongodb服務(wù),啟動(dòng)mongo服務(wù)命令:輸入 service mongod start)
2)輸入show dbs,再輸入 use huarenchat 切換到huanrenchat數(shù)據(jù)庫(kù),
3)查看該數(shù)據(jù)庫(kù)下性能分析記錄是否開啟
輸入?db.getProfilingLevel(),返回值可能為0,1,2
為0表示未開啟,1表示記錄大于100ms的查詢,2表示記錄所有查詢。
輸入db.setProfilingLevel( 1 )開啟
稍等十幾秒,輸入show profile ,可以看到最近的數(shù)據(jù)庫(kù)請(qǐng)求記錄
可以看到在huarenjie.msgs表中查詢一條消息,docsExamined表示檢索了181631條數(shù)據(jù),nreturned:1 表示返回一條, keysExamined表示索引查詢的次數(shù),等于0表示沒有用到索引。
因此,故障原因就是在msgs表18萬條數(shù)據(jù)中,查詢某一條數(shù)據(jù),卻沒有用到索引,進(jìn)行了一次非常耗時(shí)的全表查詢;
通過db.system.profile.find( { millis : { $gt : 5000 } } ) 可以查詢大于5秒的查詢,通過此命令可以一條條找到具體的慢查詢,分別予以解決
5、解決,添加索引
查看之前huarenchat表已添加的索引,記錄如下:
db.users.createIndex({uid:1},{background:1})
db.unreadmsgs.createIndex({to_uid:1},{background:1})
db.socketobjs.createIndex({uid:1},{background:1})
db.msgs.createIndex({to_uid:1},{background:1})
db.msgs.createIndex({gid:-1},{background:1})
db.msgs.createIndex({client_time:-1},{background:1})
db.jpushs.createIndex({uid:1},{background:1})
db.groups.createIndex({gid:-1},{background:1})
db.counts.createIndex({date:-1},{background:1})
db.blacklists.createIndex({myuid:1},{background:1})
發(fā)現(xiàn)msgs表,沒有設(shè)置mid的索引
刪除索引命令db.msgs.dropIndexes()
查看索引命令db.msgs.getIndexSpecs()
添加索引命令db.msgs.createIndex({mid:-1},{background:1})
一行命令解決問題:
db.msgs.createIndex({mid:-1},{background:1})
解決問題后,記得關(guān)閉性能分析工具:huarenchat數(shù)據(jù)庫(kù)下,輸入db.setProfilingLevel(0 ),若長(zhǎng)期開啟,會(huì)影響數(shù)據(jù)庫(kù)性能。
6、重啟應(yīng)用,查詢性能
1)測(cè)試聊天功能是否正常,若正常,則不需要重啟;
2)若需要重啟:進(jìn)入項(xiàng)目根目錄:輸入npm run re_prd ,根目錄如下
3)查看性能是否恢復(fù)正常
輸入命令ps aux --sort -rss ,查看cup
輸入pm2 log 查看請(qǐng)求時(shí)間
7、重啟服務(wù)器
一般來說不需要重啟服務(wù)器,假如重啟了服務(wù)器,一定要清調(diào)防火墻設(shè)置
shutdown -r now 重啟服務(wù)器
等1分鐘,重新登錄服務(wù)器,清掉防火墻:iptables?-F
8、參考資料