作者简介:侯佳刚,一直探索正确的质量保障之道。从事质量工作多年,擅长测试自动化及测试工具开发。目前在货拉拉主要负责营销相关质量保障工作和故障演练平台的开发工作。

一、背景

随着货拉拉微服务架构、容器化技术广泛使用,软件架构的复杂度在不断提升,由服务之间的依赖所带来的不确定性也呈指数级增长。在这样的依赖网中,任何一环出现非预期或者异常的变化,都可能对其他服务造成非常大的影响。因此,我们通过构建一个故障演练体系,来提升系统架构的容错能力和韧性,也可以站在未知故障视角来验证系统稳定性,验证整个故障定位能力和恢复体系。同时可以以战养兵,提升故障应急效率。

二、体系全览

目前,货拉拉故障演练体系主要包括管理体系、工具体系、运营体系:

我们在建设该体系之初,是想通过故障演练建立研发面向失败编程的思维,配合故障演练提前探知系统风险,并通过架构优化来解决优化系统风险,从而真正提升架构容错能力,并实现韧性架构,降低由于故障带来的损失。在这过程中,我们锻炼了故障应急同学解决故障的能力、并验证了应急流程、应急手段、监控报警有效性等。

  1. 管理体系,通过制定故障演练 SOP,从技术角度制定在故障演练实施过程中的操作规范,避免因人为操作可能引发的系统风险,以及当风险发生时的应对措施。
  2. 工具体系,围绕预防、发现、恢复、复盘、改进这 5 项关键点展开的故障演练工具体系的搭建。
  3. 运营体系,从演练评价、机制文化、组织建设等各方面构建起货拉拉演练生态。

三、工具体系

故障演练平台架构

货拉拉故障演练平台现阶段主要在全局攻防演练,日常故障演练等应用场景;主要模块有应用管理、故障中心、机器管理、演练经验库、运营统计等。

故障演练平台的总体架构如上图所示:

  1. 应用管理,维护应用相关元数据,包括应用名称、部署类型等信息。
  2. 故障中心,支持 Java 应用、中间件、系统资源等故障类型;并在故障生命周期中提供故障下发、故障恢复等能力。
  3. 演练经验库,将成熟的演练方案、演练场景纳入经验库,保证了场景真实性;针对通用的演练场景,可以提升创建演练的效率。
  4. 运营统计,通过更直观、更具业务价值的数据来帮助我们提升系统稳定性。主要运营数据有演练数据、预案数据、改进项等。

故障演练能力全景


以上是故障演练平台目前支持的能力,如图所示:

控制爆炸半径

通过流量隔离策略,能满足我们 90% 以上控制爆炸半径的诉求,目前有以下三种策略:

  1. 自定义标识隔离策略,指定单个/多个自定义的流量,适合故障需要隔离部分流量。
  2. 灰度隔离策略,指定单个灰度版本内的流量,适合在正式节点获取灰度标识信息(精准使用真实用户流量)。
  3. 多泳道隔离策略,指定单个泳道内的流量,可以满足针对某些城市一定比例的用户、司机注入故障。 流量隔离策略流程如下,

演练自动化

当我们做常态化演练时,需要考虑的一个问题是 ROI 是否合理。每次演练或多或少都需要人工参与,继而耗费人工成本。当我们常态化演练之后就需要考虑自动化,替换人工投入成本。其次混沌工程其实是一个防御性的工作,它要求覆盖面全,如果每个关键点上的性价比不高,那么全局损耗将非常巨大。因此,我们的目的非常明确,第一点,减少人工成本,并将覆盖面最大化;第二点,以发现问题为目的,定时定期自动演练。

演练自动化关键因素:

四、管理体系

通过制定演练策略和故障演练 SOP,来界定各个演练类型的边界,并从技术角度制定在故障演练实施过程中的操作规范,规避因任务操作可能引发的系统风险,以及当风险发生时的应对措施。力保避免因故障演练实施过程中对真实业务产生的影响。

故障演练类型

根据目前演练目的不同,区分为故障演练、全局攻防演练和混沌工程三大类。

演练类型 定义 故障场景 爆炸半径 演练组织人员
故障演练 模拟真实故障发生,在应急团队未知情况下,检验应急团队应急时效、预案有效性等指标 1. 优先历史发生过的生产故障
2. 其次是历史故障相似的链路(故障类型)
1. 可控流量
2. 单节点/单应用
3. 流量隔离
1. 领域稳定性小组负责人
2. 应用负责人
3. QA 负责人
监控报警演练 穷举核心应用关键指标,在应急团队已知情况下,检验应用监控报警有效性(不局限于无报、误报、噪点等 1. 核心应用
2. 核心指标
1. 单应用 1. 应用负责人
资金内控演练 模拟资损触发条件,在应急团队已知情况下,检验资损核对规则有效性 1. 优先历史资损场景
2. 穷举涉及资损链路上的故障
1. 单应用
2. 流量隔离
1. 应用负责人
全局攻防演练 虚拟攻守两方,模拟真实故障发生从发现、定位、处理、恢复的全过程 1. 核心链路 1. 全链路
2. 流量隔离
1. 故障演练团队
混沌工程 穷举链路上每个依赖,并注入故障,检验是否会发生事故 1. 核心链路 1. 全链路
2. 流量隔离
1. QA

故障演练流程

一次有效和高质量的故障演练,会涉及到方案梳理、故障注入、观察、问题记录、恢复、复盘等。流程如下:

过程中主要有以下几个阶段:

五、运营体系

故障演练在货拉拉的落地实施,总结下来主要分为三个阶段。

  1. 探索阶段,这个阶段主要探索验证为主,主要验证流程规范、平台能力等。通过小范围的试点,培养目标团队的心智,并同时拿到一些明显的收益,方便后续扩大试点范围。
  2. 试验阶段,经历了上一阶段的能力验证,将试点范围逐步放大到各个业务团队。其次组建了专门的故障演练团队,旨在帮助业务团队更好的落地。这个阶段主要是获取更多的数据样本,发现更多问题(业务、流程、工具平台等),为后续常态化奠定基础。
  3. 常态化阶段,该阶段故障演练范围覆盖了全部业务部门,演练流程、平台等方面也比较成熟;各部门已经具备自主演练能力。

运营数据

目前在公司内部实施故障演练的过程中,支撑了 10+ 业务部门演练需求,分析了 900+ 演练场景,通过每月 800+ 的频次开展常态化故障演练,有效发现了 100+ 问题(不局限于监控报警、应急预案、应急流程、系统强弱依赖等);故障演练管理体系的搭建,规范线上演练流程,避免因故障演练引发的线上故障;定期举办的攻防演练,不仅锻炼了故障应急响应团队的应急能力,还间接提升了系统稳定性。

六、未来展望

最后,展望一下故障演练体系未来的规划,主要从演练成本、故障多样性、演练过程观测能力等几方面展开:

  1. 丰富故障类型,建设业务链路级别故障、支持更多语言(c++、go)。
  2. 降低演练成本,比如演练场景选择、故障调试等。
  3. 进一步完善可观测能力,多视角多维度观测目标系统、链路。


↙↙↙阅读原文可查看相关链接,并与作者交流