聊天服务器故障处理记录

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数据库相关的记录。


db.currentOp()多输入几次,如果存在huarenchat,可以确定是mongo数据库死锁了。


复制下面命令,杀进程所有当前的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数据库引起




3、查看服务器日志,确认故障

输入pm2 log 可以查看服务器正在生成的日志


response time可能高达20几秒,这一步可以确认故障是由mongodb查询慢导致



4、找到慢查询的原因,通过开启mongodb性能分析工具

1)输入mongo进入shell (有可能mongo断开了连接,进入不了,需重新启动mongodb服务,启动mongo服务命令:输入 service mongod start)

2)输入show dbs,再输入 use huarenchat 切换到huanrenchat数据库,

3)查看该数据库下性能分析记录是否开启

输入 db.getProfilingLevel(),返回值可能为0,1,2

为0表示未开启,1表示记录大于100ms的查询,2表示记录所有查询。

输入db.setProfilingLevel( 1 )开启


稍等十几秒,输入show profile ,可以看到最近的数据库请求记录

可以看到在huarenjie.msgs表中查询一条消息,docsExamined表示检索了181631条数据,nreturned:1 表示返回一条, keysExamined表示索引查询的次数,等于0表示没有用到索引。

因此,故障原因就是在msgs表18万条数据中,查询某一条数据,却没有用到索引,进行了一次非常耗时的全表查询;


通过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})


发现msgs表,没有设置mid的索引

删除索引命令db.msgs.dropIndexes()

查看索引命令db.msgs.getIndexSpecs()

添加索引命令db.msgs.createIndex({mid:-1},{background:1})


一行命令解决问题:

db.msgs.createIndex({mid:-1},{background:1})


解决问题后,记得关闭性能分析工具:huarenchat数据库下,输入db.setProfilingLevel(0 ),若长期开启,会影响数据库性能。



6、重启应用,查询性能

1)测试聊天功能是否正常,若正常,则不需要重启;

2)若需要重启:进入项目根目录:输入npm run re_prd ,根目录如下

3)查看性能是否恢复正常

输入命令ps aux --sort -rss ,查看cup

输入pm2 log 查看请求时间



7、重启服务器

一般来说不需要重启服务器,假如重启了服务器,一定要清调防火墙设置

shutdown -r now 重启服务器

等1分钟,重新登录服务器,清掉防火墙:iptables -F




8、参考资料

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

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

你可能感兴趣的:(聊天服务器故障处理记录)