“总不能让我这个上班才 1 周的新人来背锅吧?”
CloudFlare 作为全球最为知名的网络服务提供商之一,偶尔出现中断是很常见的事情,一般来说 CloudFlare 有多种不同的冗余策略,即便挂了影响范围也比较小。
但是前两天 CloudFlare 出现的技术故障竟然持续了 40 个小时,这应该是 CloudFlare 中断时间最长的一次事故,所以现在恢复后 CloudFlare 火速发布博客分析此事件的前因后果。
故障时间是从 2023 年 11 月 2 日 11:44 到 11 月 4 日 04:25,时间均为 UTC 时间,与中国时间有 + 08:00 时差,下面提到的所有时间都是 UTC 时间。
直接原因:机房供电故障、高压线接地故障
时间说明:11:44 UTC 换成太平洋时间 (下面提到的这个数据中心位于美国俄勒冈州,使用太平洋时间) 是夜里四点前后。
本次中断事故影响了 CloudFlare 的很多产品,不过最严重的是 CloudFlare 控制台和分析服务,其中控制台就是客户登录 CloudFlare 后用来操作的地方,分析服务则是提供日志和分析报告之类的。
尽管 CloudFlare 已经考虑到核心数据中心可能会挂掉因此做了冗余,但随着时间的推移,系统会变得越来越复杂,因此冗余也不一定能生效。
根据 CloudFlare 说明,最直接的原因是 CloudFlare 租用的 Flexential 数据中心出现了一起计划外的供电维护,这导致数据中心的市电供应中断,但数据中心都有备用发电机,即便备用发电机没用那还有 UPS 不间断电源呢。
尽管 Flexential 的数据中心已经通过 Tier III 认证,不过在通用电气进行计划外的市电维护后,这个数据中心还是出现了一大堆问题。
当出现供电问题后 Flexential 启动了备用发电机进行供电,但并没有通知他们的客户,包括 CloudFlare,因此 CloudFlare 是不知道核心数据中心出现了电力问题。
与最佳实践不同的是,Flexential 同时运行仅剩的一个市电设施以及内部的发电机进行供电,一般来说遇到这种情况应该直接切换为备用发电机供电,因为在市电供应问题出现后,仅剩的这个市电设施也可能会被切断,而 Flexential 既没有通知客户也不知道为什么还要使用剩余的一个市电设施。
但这个市电设施就这么巧出现了问题,到 11:40,也就是 CloudFlare 故障几分钟前 (这时候还没故障,因为备用发电机还在干活中),剩余的这个市电设施的前置变压器出现了接地故障,前置变压器的电源是 12kV 的高压电,高压电出现了接地是很严重的问题。
出现了高压电接地后电气系统为了确保电气设施的安全立即自动启动停机保护,不巧的是这种停机保护也把所有发电机都给停了,于是这个数据中心的市电和备用发电机供电全部停掉。
万幸的是还有一组 UPS 电池,大约可以供电 10 分钟,如果在 10 分钟内市电或者发电机能恢复工作,那么 UPS 会停机,这样整个系统基本都不会出现大问题。
然而这组 UPS 电池工作 4 分钟后就出现了故障,此时 Flexential 还没修好发电机,于是数据中心彻底断电了。
三件事阻碍发电机重新工作:
第一,由于高压线接地故障导致电路跳闸,必须物理访问并手动重启各个设施;
第二,Flexential 的门禁系统也没有备用电池供电,因此处于离线模式,压根进不去(那最后估计是暴力方式进去的);
第三,Flexential 数据中心夜班只有保安和一名工作仅一周的技术人员,没有经验丰富的操作或电气专家。
由于发电机迟迟没有恢复,UPS 电源在 12:01 彻底歇菜,此时整个数据中心都歇菜了,但 Flexential 仍然没有通知他们的任何客户表示数据中心已经挂了。
CloudFlare 在 11:44 收到了第一个报警通知,这就是 UPS 电源工作 4 分钟后出现故障的时间,这时候 CloudFlare 意识到问题了,开始主动联系 Flexential 并希望派遣 CloudFlare 自己在当地的工程师进入数据中心。
到 12:28 Flexential 终于向客户发出了第一条通知 (此时当地时间是凌晨 5 点前后),表示数据中心遇到了故障,工程师正在积极努力解决问题。
12:48 Flexential 终于重启了发电机,部分设施开始恢复供电,但是更巧合的是 CloudFlare 所属的电源线路的断路器又损坏了,不知道这是由于接地故障还是浪涌导致的,亦或者说之前就已经坏了,现在发现发电机重新上线后没法恢复供电才发现断路器坏了。
Flexential 于是又开始尝试更换新的断路器,但由于损坏的断路器太多,他们还需要去采购,不知道这会儿 Flexential 有没有打电话让正在睡觉的电气工程师进入了现场。但这个点去采购断路器估计有点难度。
由于 Flexential 无法告知恢复时间,CloudFlare 决定在 13:40 启用位于欧洲的灾备站点,让服务先恢复。
庞大的系统能够快速通过冗余站点恢复那是不可能的,前提是你已经经过完完全全的测试,否则真正进行切换时肯定会遇到问题。
所以接下来就是 CloudFlare 自己的问题了。
CloudFlare 自己的问题:
直接原因是数据中心问题,但还有间接原因,那就是为了快速迭代 CloudFlare 允许团队快速创新,这意味着有一些新东西可能没有经过严格测试就上线了。
在故障转移过程中失败的 API 调用直接起飞了,由于失败的 API 调用太多,CloudFlare 不得不开始限制请求速率,直到 17:57 后灾备站点基本恢复运行。
但还有些产品 – 一些较新的产品并没有完全进行灾备测试,所以部分服务仍然不可用。
到 11 月 2 日 22:48 Flexential 那边终于换好了断路器并开始使用市电进行供电,此时忙得晕头转向的 CloudFlare 团队决定歇会儿,毕竟灾备站点现在能应对大部分服务的运行。
到 11 月 3 日开始 CloudFlare 着手恢复 Flexential 数据中心,首先是物理启动网络设备,然后启动数千台服务器并恢复服务,但这些服务器也需要重新配置,而重建管理配置服务器就花了 3 个小时。有些服务之间存在依赖,必须上游服务恢复了才能使用,所以必须按照顺序进行操作。
配置服务器能用后工程师开始操作其他服务器,每台服务器重建时间在 10 分钟~2 小时之间,直到 11 月 4 日 04:25 整个服务才被恢复。
对运维有兴趣的用户建议阅读 CloudFlare 原文看看总结出来的教训:https://blog.cloudflare.com/post-mortem-on-cloudflare-control-plane-and-analytics-outage/
暂无评论内容