事故报告(2019/07/12)

事故时间

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恢复时,服务也能快速恢复。