系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

公开事故复盘索引:按根因找同类事故这是一张“按根因找同类事故”的索引,不是 12 篇复盘的摘要合集。每条只保留事故、年份、直接根因、一句话教训和可对照的 Runbook;时间线、影响面、恢复过程和报告边界请回到原复盘。分组按“直接根因”归入一组,但很多事故是多因叠加,组内提示和第二假设同样重要。 事实以各事故的官方报告为准。本页不补写报告没有给出的数字,也不把传播中的简化标签当作根因

这是一张“按根因找同类事故”的索引,不是 12 篇复盘的摘要合集。每条只保留事故、年份、直接根因、一句话教训和可对照的 Runbook;时间线、影响面、恢复过程和报告边界请回到原复盘。分组按“直接根因”归入一组,但很多事故是多因叠加,组内提示和第二假设同样重要。

事实以各事故的官方报告为准。本页不补写报告没有给出的数字,也不把传播中的简化标签当作根因。

怎么用这个索引

  1. 先按症状找组。 从你正在看到的症状出发:解析失败、502 或超时、写入失败、延迟飙升、权限告警、控制面不可用。先进入最接近的组,再把其他可疑组记为第二假设。一次事故常常同时命中两组,例如“网络分区触发数据库选主”既像路由问题,也像控制面问题。
  2. 再读时间线与根因。 打开组内原复盘,重点看三件事:触发点到用户影响之间经过了哪些放大环节;恢复为什么慢;报告没有给出哪些数字。不要只记一句结论,也不要把传播中的简化标签当成根因,例如把 Cloudflare 2020 叫作“DNS 故障”。
  3. 最后回到自己的检查清单。 用文末的“复盘对照问题”逐条对照你的系统,把能落到工程控制的项写成 owner、截止时间和演练记录;再用对应的 Runbook 验证恢复路径是否真的可执行。处置节奏可参考 事故响应手册。

分组索引

路由 / DNS / BGP(2 篇)

症状线索:解析失败、跨地域绕行、单点拥塞、路由宣告异常、流量被吸到某个位置。先区分“DNS 软件故障”“BGP 宣告问题”和“骨干链路中断”,三者排查方向不同。

事故 年份 直接根因 一句话教训 对应 Runbook
Cloudflare 2020 2020 骨干路由策略改错匹配条件,全部 BGP 路由以更高 local-preference 泄漏,流量被吸往亚特兰大 一行配置也要做语义 diff;最大前缀限制等熔断器要提前部署 —
Facebook 2021 2021 例行维护命令误删全部骨干连接,站点健康判断撤回 DNS 的 BGP 宣告 危险命令要有独立熔断;带外通道和 DNS 不能依赖同一条骨干 —

组内提示:Facebook 2021 的触发点其实是维护命令,把它放在本组,是因为真正让全球不可访问的是 BGP 撤回与 DNS 不可达。按症状进组后,仍要回到原复盘看变更环节。

配置与变更(2 篇)

症状线索:故障紧跟发布、配置、补丁、扩容或运维命令出现;回滚后好转;或者“变更本身没错,但范围超出了预期”。

事故 年份 直接根因 一句话教训 对应 Runbook
AWS S3 2017 2017 容量移除命令输入错误,误删承载 index 与 placement 子系统的服务器 批量运维工具必须自己限制爆炸半径,不能只靠操作者输对 —
Datadog 2023 2023 自动 systemd 安全更新重启 networkd,删除 Cilium 路由;五个区域共用同一维护窗口 补丁窗口也是全局耦合;要测原地重启,并按故障域灰度 K8s/节点升级

组内提示:Datadog 2023 的变更不是人工发布,而是自动补丁通道;不要因为“没有发布”就排除变更类根因。

存储与数据(2 篇)

症状线索:数据目录被删、主从复制中断、写入延迟异常、快照或备份不可用、恢复点比预期旧。

事故 年份 直接根因 一句话教训 对应 Runbook
GitLab 2017 2017 本意清空从库目录,实际清空主库 PostgreSQL 数据目录,约 300 GB 备份只有恢复演练过才算备份;主机身份和 PITR 要能兜底 PostgreSQL PITR
Roblox 2021 2021 Consul streaming 竞争叠加 BoltDB freelist 膨胀,控制面写入恶化 存储引擎病态会伪装成网络问题;控制面要分片、遥测要解耦 控制面快照恢复(类比)

组内提示:Roblox 2021 同时是控制面事故;把它放在存储组,是因为两个低层缺陷都落在 Consul 的写入与存储引擎上。排查时不要把“网络慢”当成唯一方向。

容量与性能(3 篇)

症状线索:CPU、内存、线程、连接数或配额触顶;扩容后反而更差;延迟升高但进程没有崩溃;错误集中在高负载时段。

事故 年份 直接根因 一句话教训 对应 Runbook
Cloudflare 2019 2019 WAF 正则灾难性回溯,打满全球边缘 CPU,返回 502 正则要有线性时间引擎和性能门禁;配置变更要灰度并可全局停用 —
Slack 2021 2021 AWS TGW 未跟上每包速率突增;自动缩容和扩容供给链又放大故障 托管服务的透明扩容有上限;事故中先关闭缩容,监控要独立 —
AWS Kinesis 2020 2020 小规模扩容使每前端线程数越过 OS 上限,分片映射构建失败 扩容模型要算每节点随集群规模增长的开销;静默降级要有独立指标 —

组内提示:Cloudflare 2019 的触发点是配置部署;如果只按“变更”找,会漏掉“性能门禁”和“kill switch”这两个真正的教训。

权限与安全(1 篇)

症状线索:异常登录、会话复用、令牌或密钥疑似泄露、CI 变量被读取、审计日志出现陌生下载或授权。

事故 年份 直接根因 一句话教训 对应 Runbook
CircleCI 2023 2023 工程师笔记本恶意软件窃取受 2FA 保护的 SSO 会话,攻击者取走客户密钥 会话窃取可绕过 2FA;CI 长期密钥应换 OIDC 短期凭据并演练轮换 证书轮换(凭据轮换可借鉴)

控制面 / 云依赖(2 篇)

症状线索:服务发现、调度、密钥管理、数据库选主或云网络控制面异常;数据面还在跑,但路由、配置或选主已经失控。

事故 年份 直接根因 一句话教训 对应 Runbook
GitHub 2018 2018 43 秒网络分区使 Orchestrator 跨区域选主,应用跨区写入后产生分叉 自动切换必须理解应用延迟边界;数据优先于快速恢复 数据库切换
Google Cloud 2019 2019 维护自动化跨物理位置取消调度网络控制平面,BGP 撤回后区域容量骤降 维护自动化要以故障域为硬边界;控制面配置要能本地重建 控制面快照恢复(类比)

组内提示:Google Cloud 2019 同时有“维护变更”和“BGP 撤回”两层;归入本组是因为控制平面被整体取消调度,数据面才失去维持能力。

复盘对照问题

  1. 这次事故的直接触发点是什么?它属于哪一组根因,还是多组叠加?第二嫌疑组是什么?
  2. 从触发点到用户影响,中间经过了哪些放大环节:自动切换、健康检查、重试、扩缩容、BGP 撤回、缓存或队列?
  3. 如果与变更有关,爆炸半径有多大?是否有灰度、dry-run、二次确认、影响范围预览和独立熔断?
  4. 如果与容量有关,扩容模型是否计算了每节点随集群规模增长的线程、连接、内存和云配额?
  5. 如果与路由或 DNS 有关,健康判断与路由宣告会不会在总故障时形成正反馈?带外通道是否真的独立?
  6. 如果与存储或数据有关,最近一次恢复演练是什么时候?RPO、RTO 是多少?备份是否覆盖附属数据和密钥?
  7. 如果与权限或安全有关,长期凭据能否换成短期凭据?2FA 之外是否有会话窃取防护、最小权限和审计日志外送?
  8. 如果与控制面或云依赖有关,控制面配置能否本地持久化?fail-static 能撑多久?云厂商自动替换会不会破坏有状态数据?
  9. 监控、告警、状态页和应急工具是否与被监控系统共享依赖?故障时还能看见、还能沟通吗?
  10. 恢复阶段是否定义了优先级、分批重启、限流和放量门槛?会不会“恢复即二次故障”?

恢复路径与 Runbook

按你手上的恢复动作选 Runbook,不要按事故公司名选。下列 12 篇覆盖本站现有的主要恢复场景:

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 这页为什么按“直接根因”分组,而不是按公司、年份或影响面分组?
  2. 为什么不能把 Cloudflare 2020 简单称为“DNS 故障”?
  3. 复盘对照问题怎样才算真正落地,而不是写完就归档?
答案
  1. 按公司或年份只能帮助记忆,不能帮助排查;按直接根因分组,才能让你从当前症状找到同型事故,并顺着表格进入原复盘和对应 Runbook。多因事故仍要看组内提示,保留第二假设。
  2. 官方报告的根因是骨干网 BGP 路由策略错误:变更停用了匹配条件却保留策略项,路由器把全部路由以更高 local-preference 导出,流量被吸往亚特兰大。DNS 不是根因;把它叫“DNS 故障”会把排查方向带偏。
  3. 每条问题都要落到 owner、截止时间和验收标准,并映射到具体 Runbook、监控项或演练记录;下次演练时验证它是否真的可执行,复盘时再检查完成情况,而不是把清单存进文档库。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令