专业书籍精读 · Chaos Engineering · 第 5 章
Chaos Engineering: System Resiliency in Practice · Ch 5 · Jason Cahoon(Google)· 2020
上一章,Slack 为一个老系统写剧本、排一场戏。这一章把舞台换成整个公司——讲 Google 内部那场年度大演练,名字叫 DiRT。
它最出人意料的地方是:被摇的不只有机器。文件、权限、沟通渠道,还有人,都在被摇的清单上。
大楼做消防演习,大家以为重点是灭火器有没有水——这些每年有人检修,基本没问题。
真出事那天把人困住的是另外几样:那扇安全门被谁堆满了杂物;负责吹哨子的人正好请假,没人知道该听谁的;疏散图贴在着火的那一层。
这些东西没人检修,因为它们不像设备,不在任何一张检查表上。DiRT 要演的就是它们。
大公司在机器层面的备份通常做得很足:机房有两三个、数据有副本、流量能切。于是心里有个很舒服的结论:我们扛得住。
可这结论从来没被完整验过。真出事时卡住的常常是:唯一真会操作切换的人在休假,他的做法从没写下来;应急预案存在内网,而内网跟着一起挂了;大家都在等「谁来下这个决定」。
没一样是技术缺陷,全是没人测过的环节。机器的备份有人管,人和流程的备份没人管。
收获是一张诚实的清单:你终于知道恢复能力断在哪几处,而且断的地方多半不在机器上。最便宜那一档几乎零成本——一张桌子、一个主持人、一句「现在去把预案找出来」,小团队当天能做。诚实说一句代价:全公司级大演练协调成本极高,一年只办得了几次,覆盖不了多少种故障。
你的机器大概扛得住,你的流程、文档和「只有一个人会」的那些操作大概扛不住——所以演练要连人和纸一起摇,并且事先约好一条「真出事就立刻停手」的规矩。
想进到具体机制、量级和示意图? → 切到精读版
你以为灾难演练是在验证技术冗余够不够。Google 跑了十余年 DiRT 得到的结论恰恰相反:技术冗余大多是好的,真正的单点落在流程、权限、文档和人身上——而这四样从来不在任何自动化测试、任何 SLO 里。所以 DiRT 把「被测系统」的边界从服务扩到整个公司的恢复能力,连「关键工程师联系不上」都当成一种可注入的故障;同时用一套交战规则(rules of engagement)保证摇公司不会变成毁公司。
全书 21 章的第 5 章,Part II「原则落地」的第二篇。和上一章同一种姿势、不同量级:Ch4 的 Slack 把一个存量系统推到人在回路的演练,Ch5 把这套做法放大到公司规模,并把非技术对象正式纳入被测范围;往下 Ch7 是 LinkedIn 对爆炸半径的伦理约束,Ch8 是 Capital One 在金融合规下的渐进路线。现实里它对着的,是已有多机房冗余、也有一份写好的 DR / BCP 文档、却从没真验过的组织。
一个典型的大型服务,技术冗余看起来是满的:三个以上区域、数据多副本、流量能按区域切、RPO 接近零、RTO 写着 15 分钟。但这些数字是部件级承诺,拼起来不等于「公司能从一场灾难里恢复」。
缺的是中间那层。真实的区域级事故里,恢复动作长这样:有人判定这是事故 → 定级 → 找到有权限的人批准切换 → 翻出预案 → 执行一串从没在生产跑过的命令 → 通知客服与上下游。这条链上只有一步是技术,其余全是流程、权限、文档和人——而它们一个都没被测过。
不解决会怎样?三种很典型的失败:
所以这章的问题是:怎么在不制造真事故的前提下,验证「整个公司」的恢复能力,而不只是「每个组件」的冗余?
这是本章最该带走的一张图。把一次恢复拆开,依次是:技术组件 → 流程与权限 → 文档与工具链 → 人。工程投入和自动化测试几乎只覆盖第一层,而真出事时断掉的概率从第一层往下递增。
原因不神秘:第一层有拥有者、有监控、有 CI;后三层没有拥有者——没人给「审批链」写单元测试,也没人每周验一次预案里的命令还能不能跑。DiRT 的价值几乎全在后三层:它是目前唯一能给这三层打分的手段。
这是第③层最锋利的失效,而且静态审查几乎看不出来:架构图上恢复工具和被恢复的系统是两个框,没人注意到它们最终落在同一个故障域里。
典型形态:区域 A 失联 → 按预案处置 → 预案在内网 wiki → wiki 只跑在区域 A。四步成环,卡死。变体很多:事故频道依赖的 SaaS、登录要过的 SSO、下发配置的控制面,甚至机房门禁。
判据只有一句,拿它去问每一份预案:恢复 X 所依赖的一切(文档、工具、凭据、沟通、人),是否都不在 X 的故障域里?答不上来就说明你需要一次演练,而不是一次评审。解法是每一环都备带外通道:离线的预案副本(导出 PDF 也算)、不依赖主站的第二条沟通渠道、独立的应急凭据。
演练放大到公司规模,风险也跟着放大。本章的护栏是一套事先公布、所有团队必须遵守的规则,核心四条:
还有一条隐含规则:沟通协议——何时发公告、发给谁、用什么前缀标明「这是演练」。没有它,演练会在别的团队那里被当成真事故,触发一串真的升级。
不是所有故障都能真注入:「总部所在城市发生强震」只能纸上演。于是有一道由虚到实的阶梯:纸上推演 → 角色扮演(Google 内部叫 Wheel of Misfortune,由一位资深工程师当主持人出题)→ 受控真实注入 → 全公司多日演练。
越往上越真,但纸上那几档有个致命陷阱:参与者说的是「应该怎么做」,不是真做。「我会去查那份预案」「我会找 X 批准」——听起来完美,掩盖的恰恰是第③④层的全部问题。
所以本章最可操作的判据是:凡回答里出现「我会去…」,当场要求他真做一次。现在打开那份预案、现在打那个电话、现在跑那条命令。主持人还能反向加压——被叫来救场的资深工程师,判定「正卡在没信号的地铁车厢里」。这是把演练从「我们知道该怎么做」逼成「我们刚才真做到了」。
最后一环最容易被省掉。要求是:每个发现变成有明确负责人的待修项,修完重跑同一个测试——没有重跑,你只有一份结论,没有回归。
还有一条文化要求:「演练通过」不是目标,学到东西才是。全部通过其实是设计失败,说明只摇了已有信心的部分。政治前提也在这里:一旦暴露的问题被用来追责,下次就没人敢把悲观假设写进方案(Ch18 的主题)。
第一张表是真实性阶梯的落地:手上这个故障场景该用哪一档。关键在认清每一档各自抓不到什么。
| 形态 | 抓得到 | 抓不到 | 成本 / 频率 | 什么时候用 |
|---|---|---|---|---|
| 纸上推演 | 决策链断点、预案存不存在、谁该拍板 | 一切真实行为——给的是「应该的」答案 | 一小时,随时可做 | 无法真注入的场景(地震、整城断电) |
| 角色扮演 (Wheel of Misfortune) | 排障思路、指挥流程、文档和工具真能不能打开 | 真实量级下的系统行为、重试风暴、缓存塌陷 | 每周一次也撑得住 | 常态训练;验第③④层最划算的一档 |
| 受控真实注入 | 真实量级的行为、告警响不响、恢复路径安不安全 | 跨团队协同与升级链——范围太小,触发不到 | 一个时间窗 + 一屋子人 | 单个系统第一次被验证(Ch4 的做法) |
| 全公司多日演练 | 四层串联的真实结果:技术 + 流程 + 文档 + 人 | 罕见故障组合——频率低,覆盖面窄 | 协调成本极高,一年几次 | 验证公司级 DR / BCP 承诺是否为真 |
越往下越真也越贵。误区是只做两头:要么只填表,要么只砸年度大演练——中间两档性价比最高。
第二张表按被测的四层给出测法与代价。
| 这一层 | 典型单点 | 怎么测 | 代价 / 难点 |
|---|---|---|---|
| ① 技术组件 | 号称冗余、实际早被改成单点的依赖 | 自动注入、持续跑(Ch3 原则四) | 需要编排平台与可观测性做前提 |
| ② 流程与权限 | 审批人唯一;值班表与故障同域 | 不告知审批人,看升级链多久走通 | 暴露组织问题,政治阻力最大 |
| ③ 文档与工具链 | 预案链接失效、命令过期、沟通渠道同域 | 当场打开,不接受「我会去查」 | 几乎零成本,却最常被跳过 |
| ④ 人 | bus factor = 1 的隐性知识 | 演练中「停用」此人,禁止回答 | 易被当成针对个人,须讲清测的是系统 |
落到具体选择:
这一章给的是三句能直接改变灾备评审结论的话。一:RPO / RTO 只承诺第①层,公司级恢复能力是四层串联的结果。二:恢复 X 所依赖的一切,都不许在 X 的故障域里。三:凡回答里出现「我会去…」,当场要求他真做一次。
面试被问「你们怎么做灾备演练」,答「每季度做一次故障切换」是组件层;答「流程、预案和关键人也是被测对象,事先约定真事故优先与回滚方案,结果跟踪到复测」是另一个层级——它显示你知道要测的是四层。
大厂实证
① 核心命题:技术冗余大多是好的,真正的单点在流程、权限、文档和人身上——被测对象必须从组件扩到整个公司的恢复能力。
② 四层模型:技术组件 → 流程与权限 → 文档与工具链 → 人。投入与测试覆盖集中在第①层,断点概率往下递增;RPO / RTO 只承诺第①层。
③ 最锋利的一类发现是恢复路径的循环依赖:预案在内网 wiki、wiki 跑在挂掉的区域,静态评审看不出来,真摘掉才暴露。判据一句话:恢复 X 所依赖的一切(文档、工具、凭据、沟通、人),是否都不在 X 的故障域里?解法是每一环都备一条带外通道。
④ 人形单点要直接测:演练中「停用」那个最懂的人、不许他回答——Google 的原话就是这么写的。
⑤ 交战规则四条:真事故优先于演练、必带回滚方案、影响预期写明、跨职能评审且高风险升到 VP 级批准;外加沟通协议,否则演练会被当成真事故。
⑥ 真实性阶梯:纸上推演 → 角色扮演(Wheel of Misfortune)→ 受控真实注入 → 全公司多日演练。别只做两头,中间两档最划算。
⑦ 最可操作的一句话:凡回答里出现「我会去…」,当场要求他真做一次——纸上推演的全部价值取决于这一下。
⑧ 结果要有负责人并重跑同一测试验证;「全部通过」是设计失败;一旦用于追责,演练立刻退化成表演。