美文网首页
聊天服务器故障处理记录

聊天服务器故障处理记录

作者: robinliu_ | 来源:发表于2019-05-25 12:34 被阅读0次

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

相关文章

  • 聊天服务器故障处理记录

    2019-05-24聊天服务器故障处理记录 1、故障可能原因分析 在没有更新前后端代码逻辑的情况下,服务器突然登不...

  • 线上故障处理书目录

    线上故障处理之故障信息获取源 线上故障处理之处理流程 线上故障处理之故障后处理

  • MacOS Catalina 故障处理记录

    报错信息 解决方案,重装 ruby 和 vim,Catalina 弃用了旧的自带脚本语言,老版本 ruby 没了,...

  • 《AWS 云计算实战》笔记(十一)——容错设计

    容错设计 容错系统就是为故障而构建的。如果发生故障,容错系统将不会中断,并且可以继续处理请求。 EC2 虚拟服务器...

  • JVM 学习笔记记录

    JVM 学习笔记记录 Sun JDK 监控和故障处理工具 名称主要作用jpsJVM Process Status ...

  • 服务器网络故障处理——ping丢包或不通时链路测试说明

    服务器网络故障处理——ping丢包或不通时链路测试说明 前言 当客户端访问目标服务器出现 ping 丢包或 pin...

  • 故障处理

    解决方法:

  • 故障处理

    故障review前准备工作: 1、详细处理过程2、导致故障的原因3、故障影响范围、相关数据等4、故障的后续改进计划...

  • 2019-07-22

    服务器托管出现故障怎么办? 在服务器托管的过程中出现故障是不能完全避免的问题,可能是服务器硬盘出现硬件故障或者是防...

  • 我对故障处理的看法

    故障处理这个问题,仔细思考起来,非常有趣。 故障处理场景越多越好么? 故障处理的根本目的是,活下去,让公司、部门、...

网友评论

      本文标题:聊天服务器故障处理记录

      本文链接:https://www.haomeiwen.com/subject/itbazqtx.html