前几篇我们聊了系统的设计, 编码开发等各个环节需要注意的地方. 但是, 如果仅仅做到这些, 距离真正支撑 7×24 小时, 不间断的业务运营, 还有很远的距离. 我们还要做好线上服务的高质量运维.
运维的三个层次
古代神医扁鹊说医术有三个层次, 当病人已经病入膏肓, 你能让他绝处逢生, 厉害吧, 但这只是第一个层次; 第二个层次, 就是当病情已经出现了初期症状, 你能准确判断, 药到病除, 这是第二个层次; 第三个层次就是当一切都还没有征兆, 你能识之于未发, 提前预防, 这是第三个层次. 人们往往重视第一个层次, 缺忽略了第二第三个层次.
线上服务的运维也有这类似的三个层次. 发生了故障能快速恢复, 止损业务, 这是第一个层次. 在故障刚开始有苗头的时候, 就快速采取措施, 控制影响范围, 这是第二个层次. 提前做好各个流程节点的控制, 当有问题可能发生的时候, 系统甚至自动识别出来并自动调整, 对业务完全无感, 这是第三个层次. 我们分别来看一下每次层都要修炼什么.
第一个层次
第一个层次, 当系统真的发生线上事故的时候, 我们要能有能力快速力缆狂澜. 这阶段的目标就是一个字快. 这需要我们具备什么样的能力呢?
首先, 我们得有能力快速定位问题所在, 决策要准. 这就需要我们能够快速收集到线上运行的所有信息, 就像飞机的仪表盘, 我们得能看到全局的信息. 当问题发生的时候, 我们才能快速甄别出异常点, 定位问题所在.
然后, 我们得有提前准备好的危机预案. 这种紧急情况下, 如果临时想方案肯定就延误了恢复的时间, 而且风险很大. 对各种可能的故障情况想得越清楚, 准备得越充分, 恢复得越快.
最后, 这一个阶段基本要靠人去修复问题, 所以人的协调和沟通效率至关重要. 尤其是紧急情况下, 大家的压力都比较大, 平时舒畅的沟通可能变得走形.
这里有几点特别需要注意. 第一, 所有人要目标一致, 先止损, 先去恢复线上服务. 不要带有情绪, 就事论事, 先解决问题. 至于是谁的责任, 事后再来复盘.
第二, 事故发生时, 经常不会在办公时间, 大家要通过各种通讯手段进行沟通, 所以传递信息一定要尽可能的简洁, 条理且清晰. 尽可能传递清楚事实数据, 表达清楚哪些是事实, 哪些是猜测. 比如要告诉别人手机上产品的一个故障, 就要说清楚手机型号, 网络情况, 做了什么操作, 有什么异常现象等等, 不要只给出你的判断.
第三, 要有唯一负责人. 紧急情况下, 要有大量的协作和沟通, 唯一负责人非常重要. 这个要提前指定好, 并且要指定好备选的人, 以免突发情况下, 第一负责人不能指挥的情况.
第四, 要做好对业务相关方的沟通. 当事故发生时, 业务已经受到了影响, 要第一时间通知相干方以及领导. 这样, 业务方才能第一时间去评估对用户的影响, 并及时做出补救措施.
整个事故处理过程中, 都要主动通知相关业务方事情的进展情况, 做好协同和预期管理非常重要.
最后一点, 要反复的彩排故障处理流程, 不断复盘和改进.
台上十分钟, 台下十年功, 一丝马虎都不能留下. 我们越觉得不可能发生的事情, 就越会发生.
第二个层次
在系统可能有问题的时候, 就及时报警出来. 这个阶段, 已经无法通过人力去盯线上服务的状态了. 需要我们有非常完善的监控体系.
这个监控体系越完善, 越细致, 我们越能提前发现问题, 就越能为故障处理赢得时间.
怎么才能做到监控体系的完善且细致, 我们要从全流程的角度去考虑. 什么叫全流程, 就是从用户打开产品开始, 到我们线上服务给到响应的整个过程.
我们看看这个全流程. 首先, 用户使用的什么网络链接到互联网, 是小区宽带还是 2G,3G,4G, 是移动还是联通? 域名是怎么解析的? 然后网络请求又是通过什么链路到达了我们机房, 我们机房又是通过什么设备到达服务器, 服务器又访问了什么, 等等. 每个环节我们都要有监控. 每个监控我们都要在成本收益的考虑下做到极致.
有了监控, 我们还是需要人去处理. 这就要求我们不要放过任何一个报警, 不要以为优先级不高就忽略掉. 除非我们明确的知道到底发生了什么, 不要放过任何蛛丝马迹. 每次报警都是有原因的, 都是优化我们系统的好机会.
第三个层次
最后一个层次, 就是要我们防患于未然, 提前做准备. 我们要知道做好线上运维不仅仅是运维同学的事情, 他是所有研发, 测试各个岗位最重要的事情.
我们所有的研发, 测试, 上线流程和制度, 其实都是在提前做准备. 所以每一个环节都非常重要, 都要提前考虑对稳定性的影响.
首先, 线上变更是最容易出问题的点. 所以上线流程需要规定好各个节点的检查项, 做得越细致越不容易出问题.
其次, 充分的想好可能的应急方案. 方案考虑的越细致, 出问题后就越快能解决. 比如系统设计阶段要考虑好系统的高可用性, 全流程的各个环节都考虑; 代码阶段要考虑好健壮性; 测试阶段要考虑好边界条件的测试; 上线要做好回滚策略等等.
最后, 逐渐提升线上服务的自愈能力. 如果全部靠人来保证线上稳定, 人都要有一个响应, 协同, 处理的时间, 这将是线上可用性的上界.
如果说 3 个 9 的可用性还能用人来抗的话, 4 个 9,5 个 9 就必须要运维自动化. 这个自动化是整个研发, 测试, 上线, 运维的整体自动化, 越少人参与, 出错的几率就越小.
总结一下, 线上稳定无小事, 事事认真, 不断复盘优化, 做好各个流程点的控制, 提前做好各种方案, 才能防患于未然.
来源: http://www.jianshu.com/p/ad31ed9f84eb