发生了什么
2021 年 10 月 4 日 15:39(UTC),Facebook 和它上面的一切——Instagram、WhatsApp、Messenger、Oculus——在全球陷入黑暗。接下来的六到七个小时里,数十亿人就是访问不了它们。原因不是网络攻击。在一次例行维护中,一名工程师运行了一条本意是评估 Facebook 全球骨干网容量的命令。命令出了错,意外地把 Facebook 所有数据中心一次性从那根骨干网上断开了。
这个设计把一条糟糕的命令变成了一场灾难。Facebook 运行着自己的 DNS 服务器,这些服务器被配置成:一旦与数据中心失去联系,就撤回它们的 BGP 路由——也就是互联网的地址簿条目。所以骨干网一倒,DNS 服务器就尽职尽责地告诉互联网其余部分:Facebook 的地址已经不存在了。Facebook 实际上把自己从互联网上删掉了,而这次撤回级联得如此彻底,连 Facebook 自己的工具都很难够到它去修复。
这场封锁彻底得近乎滑稽。Facebook 的内部系统也倒了:员工发不了外部邮件,访问不了公司通讯录,甚至——一个上了头条的细节——用门禁卡打不开办公楼和会议室的门,因为门禁也依赖同一张网络。恢复需要一个团队物理进入圣克拉拉的数据中心,手动重置服务器。服务在 UTC 大约 21:50 到 22:50 之间逐渐恢复。Facebook 股价当天下跌近 5%,马克·扎克伯格的个人财富缩水逾 60 亿美元。
付出的代价
宕机 6 小时;广告收入损失逾 6000 万美元
为什么发生
一条没有充分防护的维护命令,把 Facebook 所有数据中心一次性从骨干网上断开。
DNS 服务器被设计成一旦失去数据中心就撤回 BGP 路由——于是这场故障自动把 Facebook 从互联网的路由表里抹掉了。
恢复工具和访问权限 (包括实体门禁卡) 都依赖那张已经故障的网络,把工程师锁在了修复之外。
没有一条带外路径能触及系统、快速撤销这次变更。
可以学到什么
恢复路径不能依赖那个刚刚坏掉的东西。当你的 DNS、认证和门禁卡全都跑在你刚刚搞垮的那张网上,你就把自己关在门外了。
后续
Facebook 的工程团队第二天发布了一篇详细说明,公司也道了歉。这次宕机——2008 年以来最严重的一次——据估计造成 6000 万美元以上的广告收入损失,市值蒸发数百亿,还一度把用户赶向竞争平台。它成为网络工程的教科书案例,讲单点故障之害、讲依赖被恢复系统的恢复系统之害,也讲一条没有防护的命令如何能搞垮一个三分之一人类在用的服务。
从这里,追溯依据