$ traceroute failrouter.com

失败路由博物馆

每次宕机,都有来路。

每次宕机都始于一个小改动,然后走上了没人预料的路线。这里收的是有名的那些,一跳一跳地讲。

展品 003 · 全局推送厅

一次内容更新,850 万台 Windows 蓝屏

· 修复用了几小时,清理用了几天到几周

影响 7.6/10

  1. 1安全厂商给 Windows 传感器推送了一次例行内容更新
  2. 2更新定义的输入字段比传感器代码预期的多
  3. 3内核驱动越界读取,随即崩溃
  4. 4约 850 万台 Windows 电脑蓝屏,反复重启
  5. 5航空公司、医院和银行只能一台一台手动修 ✕

内容更新也是代码更新,要像代码一样分阶段发布。

来源:CrowdStrike root cause analysis, August 2024

展品 001 · 丢包大厅

Facebook 从互联网上消失的 6 小时

· 约 6 小时

影响 4.8/10

  1. 1一条例行维护命令,本意是评估骨干网容量
  2. 2命令断开了各数据中心之间的全部骨干连接
  3. 3DNS 服务器发现骨干网没了,撤回了自己的 BGP 路由
  4. 4facebook.com、Instagram 和 WhatsApp 在全球范围内无法解析
  5. 5工程师要到现场才能重置路由器,内部工具也一起挂了 ✕

恢复工具如果也在出故障的那套系统后面,就等于没有恢复工具。

来源:Facebook Engineering blog, October 2021

展品 012 · 钟表室

根证书一过期,旧设备连不上 HTTPS

· 旧设备上拖了很久

影响 7.0/10

  1. 1一张旧根证书到了早已公告的过期日
  2. 2现代系统用的是新根证书,没有察觉
  3. 3旧手机、旧版 OpenSSL 和嵌入式设备仍然只信任旧的那张
  4. 4这些客户端的 TLS 握手开始失败
  5. 5修复办法从改配置到买新硬件不等 ✕

几年后的过期日也是一个日期。记进日历。

来源:Let's Encrypt announcements, 2020 to 2021

展品 005 · 全局推送厅

一次客户配置,唤醒了潜伏几周的 bug

· 不到 1 小时

影响 4.0/10

  1. 1几周前部署的一次软件变更带着一个潜伏的 bug
  2. 2一个客户推送了一次合法的配置变更
  3. 3这次变更在整个边缘网络上触发了那个 bug
  4. 4网络大部分节点开始报错,几家大新闻网站一片空白
  5. 5工程师找到这项配置并停用,流量恢复 ✕

bug 可以耐心地等,等那个能唤醒它的输入。

来源:Fastly blog, June 2021

展品 004 · 全局推送厅

一条正则拖垮全球边缘节点

· 27 分钟

影响 3.6/10

  1. 1一条新的托管 WAF 规则一次性部署到全球
  2. 2它的正则表达式在普通流量上发生灾难性回溯
  3. 3每台边缘机器的 CPU 都打到 100%
  4. 4接入这张网络的站点在全球返回 502
  5. 5关掉 WAF 规则的全局开关后,流量恢复 ✕

最快的部署流水线,也是最快的宕机流水线。

来源:Cloudflare blog, July 2019

展品 006 · 回车键画廊

一条命令输错,S3 宕机约 4 小时

· 约 4 小时

影响 4.8/10

  1. 1工程师排查一个变慢的计费系统,执行一条已审批的操作手册命令
  2. 2一个参数输错,移除的服务器远多于预期
  3. 3us-east-1 的两个 S3 子系统需要完全重启
  4. 4它们多年没有完全重启过,花了好几个小时
  5. 5大片网站宕机,AWS 自己的状态面板也在其中 ✕

不管命令怎么输,工具都应该拒绝一次移除太多、太快的容量。

来源:AWS service disruption summary, March 2017

展品 007 · 回车键画廊

rm -rf 敲在了主库上

· 约 18 小时,丢了大约 6 小时的数据

影响 5.2/10

  1. 1深夜,和数据库复制延迟缠斗
  2. 2工程师删除一个数据目录,准备重新同步副本
  3. 3那个 shell 连的是主库,不是副本
  4. 4几种备份方式结果都是坏的或空的
  5. 5从预发环境快照恢复,全程公开直播 ✕

从没恢复过的备份只是一个愿望,算不上备份。

来源:GitLab postmortem, February 2017

展品 008 · 回车键画廊

45 分钟亏掉 4.6 亿美元

· 45 分钟

影响 4.4/10

  1. 1新交易代码复用了一个标志位,它曾用来启用已退役的逻辑
  2. 2部署漏掉了八台服务器中的一台
  3. 3开盘后,那台服务器跑起了死代码
  4. 4它发出了数百万笔非预期订单
  5. 5公司亏损超过 4.6 亿美元,陷入严重的净资本困难 ✕

删掉死代码,核对每个部署目标,永远别复用标志位。

来源:SEC order, October 2013

展品 011 · 钟表室

闰秒那一秒,服务器 CPU 占满

· 几小时,看你当时在哪家

影响 4.0/10

  1. 1UTC 23:59:60 插入了一个闰秒
  2. 2一个 Linux 内核计时器 bug 让部分进程空转
  3. 3Java 和 MySQL 服务器的 CPU 被占满
  4. 4Reddit、Mozilla 等网站变慢或宕机
  5. 5修复办法:重新设置一次时钟,或者重启 ✕

时间也是输入。怪的那些时刻要测。

来源:Public postmortems and kernel mailing list, July 2012

展品 002 · 丢包大厅

一条 BGP 路由,把 YouTube 引向了巴基斯坦

· 约 2 小时

影响 2.8/10

  1. 1巴基斯坦电信接到命令,要在国内屏蔽 YouTube
  2. 2为此它宣告了一条比 YouTube 地址段更具体的路由
  3. 3上游运营商把这条宣告转发给了整个互联网
  4. 4各地路由器都优先选择更具体的那条路由
  5. 5全球大部分 YouTube 流量涌向巴基斯坦,然后消失 ✕

别人宣告什么,BGP 就信什么。客户宣告的路由要过滤。

来源:RIPE NCC case study, 2008

展品 010 · 错数陈列柜

英制对公制:丢失的火星探测器

· 飞了 10 个月,到达时失联

影响 6.0/10

  1. 1地面软件以磅力·秒为单位报告推进器冲量
  2. 2导航软件期望的单位是牛顿·秒
  3. 3每一次小的轨道修正都差了约 4.45 倍
  4. 4探测器到达火星时的高度低得多
  5. 5它消失在火星大气中 ✕

单位应该写进接口约定,而不是留在某个人的脑子里。

来源:NASA Mishap Investigation Board, November 1999

展品 009 · 错数陈列柜

整数溢出,火箭 37 秒后自毁

· 37 秒

影响 6.0/10

  1. 1制导软件沿用自阿丽亚娜 4 号
  2. 2阿丽亚娜 5 号飞得更快,一个水平速度值变得更大
  3. 3把 64 位浮点数转换成 16 位整数时溢出
  4. 4两套惯性参考系统以同样的方式失效
  5. 5火箭偏离航线并自毁 ✕

复用的代码,带着它原本那套系统的假设。

来源:Ariane 501 Inquiry Board report, July 1996