聊天服務(wù)器故障處理記錄

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、參考資料

https://blog.csdn.net/huyangg/article/details/78918179

https://blog.51cto.com/chenql/2071267

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容