2019-05-24聊天服務器故障處理記錄
1届宠、故障可能原因分析
在沒有更新前后端代碼邏輯的情況下蛤袒,服務器突然登不上,最有可能的原因是mongodb連接斷開塌衰,或者mongodb死鎖了诉稍。
前幾次服務器故障也是mongodb的問題,因此首先需要確認是不是mongodb出問題了最疆。
2杯巨、初步確認故障原因
確認是不是mongodb掛了,或者mongodb存在死鎖或慢查詢
1)ssh登錄服務器:
2)分析服務器性能:?
輸入命令ps aux --sort -rss 努酸,看cup是否被撐爆
輸入mongo進入mongo shell ,
輸入db.currentOp()?查看當前mongo進程服爷,看能不能找到與huarenchat數(shù)據(jù)庫相關的記錄。
db.currentOp()多輸入幾次获诈,如果存在huarenchat仍源,可以確定是mongo數(shù)據(jù)庫死鎖了。
復制下面命令舔涎,殺進程所有當前的mongo進程:
var ops = db.currentOp().inprog; for(i = 0; i < ops.length; i++){ var opid = ops[i].opid; db.killOp(opid); print("Stopping op #"+opid)
}
注意:進程可能殺不完笼踩,殺了又有,或者在某一刻沒有亡嫌,但不表示殺干凈嚎于。
通過這一步,可以初步故障由mongod數(shù)據(jù)庫引起
3掘而、查看服務器日志,確認故障
輸入pm2 log 可以查看服務器正在生成的日志
response time可能高達20幾秒于购,這一步可以確認故障是由mongodb查詢慢導致
4袍睡、找到慢查詢的原因,通過開啟mongodb性能分析工具
1)輸入mongo進入shell (有可能mongo斷開了連接价涝,進入不了女蜈,需重新啟動mongodb服務,啟動mongo服務命令:輸入 service mongod start)
2)輸入show dbs色瘩,再輸入 use huarenchat 切換到huanrenchat數(shù)據(jù)庫,
3)查看該數(shù)據(jù)庫下性能分析記錄是否開啟
輸入?db.getProfilingLevel(),返回值可能為0逸寓,1居兆,2
為0表示未開啟,1表示記錄大于100ms的查詢竹伸,2表示記錄所有查詢泥栖。
輸入db.setProfilingLevel( 1 )開啟
稍等十幾秒,輸入show profile 勋篓,可以看到最近的數(shù)據(jù)庫請求記錄
可以看到在huarenjie.msgs表中查詢一條消息吧享,docsExamined表示檢索了181631條數(shù)據(jù),nreturned:1 表示返回一條譬嚣, keysExamined表示索引查詢的次數(shù)钢颂,等于0表示沒有用到索引。
因此拜银,故障原因就是在msgs表18萬條數(shù)據(jù)中殊鞭,查詢某一條數(shù)據(jù),卻沒有用到索引尼桶,進行了一次非常耗時的全表查詢操灿;
通過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表救鲤,沒有設置mid的索引
刪除索引命令db.msgs.dropIndexes()
查看索引命令db.msgs.getIndexSpecs()
添加索引命令db.msgs.createIndex({mid:-1},{background:1})
一行命令解決問題:
db.msgs.createIndex({mid:-1},{background:1})
解決問題后,記得關閉性能分析工具:huarenchat數(shù)據(jù)庫下溢豆,輸入db.setProfilingLevel(0 )蜒简,若長期開啟,會影響數(shù)據(jù)庫性能漩仙。
6搓茬、重啟應用犹赖,查詢性能
1)測試聊天功能是否正常,若正常卷仑,則不需要重啟峻村;
2)若需要重啟:進入項目根目錄:輸入npm run re_prd ,根目錄如下
3)查看性能是否恢復正常
輸入命令ps aux --sort -rss 锡凝,查看cup
輸入pm2 log 查看請求時間
7粘昨、重啟服務器
一般來說不需要重啟服務器,假如重啟了服務器窜锯,一定要清調防火墻設置
shutdown -r now 重啟服務器
等1分鐘张肾,重新登錄服務器,清掉防火墻:iptables?-F
8锚扎、參考資料