事故时间
2019/7/12 11:37 ~ 12:15 ,持续38分钟
事故描述
移动用户无法登陆
事故原因
根本原因:数据库硬盘物理损坏,RAID修复过程中IO超时。
事故总结
短时间的IO超时,目前的服务器是能够承受的,但是长时间的IO超时带来的雪崩问题是需要总结的。
事实上我们的服务至少要把故障时间缩短为IO故障时间,比如IO故障5分钟,那么用户的故障时间也应该为5分钟,但目前的效果却是花费了35分钟的时间才恢复。
服务器的通讯库模型采用多线程竞争消费方式:
- tcp层将帧数据合并为一个用户请求包,丢入一个消息池
- 用户层启动n个消费线程,竞争方式去消息池取消息处理
这样设计的好处是每个线程的能力都得到最大的发挥,或者当一个线程出现问题时,其他线程仍然可以正常工作。
实际上如果IO发生长时间超时,用户发现登陆失败,就会不断的重试登陆,最后导致的结果是:
消息池的消息堆积越来越多。即使当IO恢复后,消费线程仍然在处理之前堆积着的请求消息,从而故障的恢复时间变的延后。
处理方法
- 在tcp丢入消息池时给每个消息打一个时间戳
- 消费线程在处理某些IO消息时,判断当前时间和消息时间戳是否 > n(s),超过则丢弃
- 这样当IO恢复时,服务也能快速恢复。