Cloudflare 又双叒叕挂了?11.18 史诗级'炸鱼'事故全复盘!
兄弟们,刚才(11月18号)是不是感觉互联网突然”眨了一下眼”?如果你发现自己的网站报错 500,或者此时此刻正急着上 Cloudflare 控制台改配置却死活登不上去——恭喜你,你并没有被针对,我们一起见证了互联网基础设施的又一次”心脏骤停”。
作为一个天天跟架构打交道的”键盘侠”,这次 Cloudflare (CF) 的事故简直是教科书级别的**“蝴蝶效应”**。来,我们不吹不黑,扒开它的底裤,看看这次到底是哪行代码写出了 Bug,以及我们能从中学到点什么。
一、 发生了什么事情?(事故回放)
时间坐标:UTC 2025年11月18日 11:20(咱们这边的晚上,又是运维掉头发的好时候)。
现象:
全球范围内,大量使用 Cloudflare CDN 和安全服务的网站开始疯狂吐 HTTP 5xx 错误。最骚的是,连 CF 自己的状态页和控制台 (Dashboard) 甚至 Turnstile (验证码) 服务都挂了。
这就像是你家里着火了,你想打 119,结果发现电话线也是那个着火的运营商提供的——死循环。
官方第一反应: “卧槽,是不是有人搞我?这量级,难道是宇宙级 DDoS 攻击?”
工程师们看着监控图上一波波的红线,第一直觉是 DDoS。但这其实是一个巨大的烟雾弹。
二、 深度复盘:一个配置文件的”超重”之旅
这不是 DDoS,也不是黑客删库跑路,而是一个**“因为想把门锁紧点,结果把房子震塌了”**的故事。
1. 起因:一个”平平无奇”的数据库变更
Cloudflare 的工程师为了加强安全性,给内部的 ClickHouse 数据库做了一个权限管理的升级。这听起来很合理对吧?为了安全嘛!
2. 经过:蝴蝶扇动了翅膀
这个变更导致生成Bot Management(机器人管理)规则的 SQL 查询逻辑变了。它吐出了一个巨大的配置文件(Feature File)。
这就好比你平时出门只带把钥匙(配置文件小),今天你换了条裤子,口袋大得能装下一台冰箱(配置文件超大)。
3. 高潮:内存溢出,Proxy 炸裂
这个超大的配置文件被推送到全球边缘节点的 Proxy(代理服务)上。
重点来了!CF 的 Proxy 代码里有一个硬编码的内存限制(Hard-coded Limit)。
当 Proxy 试图加载这个”冰箱级”的配置文件时,它并没有优雅地拒绝说”太大了哥,我吃不下”,而是直接**Panic(崩溃)**了。
而且,由于这是个配置更新,它是间歇性地推送到各个进程的。所以系统表现出一种”一会儿好,一会儿坏”的翻滚式挂掉(Flapping),这也是为什么一开始大家以为是攻击的原因。
技术总结:
Database Change->Oversized Config File->Proxy Hard Limit->Process Panic->Global Outage
三、 我们可以学到什么?(抄作业时间)
这种级别的事故,对我们做架构的人来说,简直是免费的顶级反面教材。
1. 防御性编程(Defensive Programming)是保命符
Cloudflare 的 Proxy 居然因为配置文件过大就直接 Panic 崩溃?这在架构设计上是大忌。
-
教训:对于任何外部输入(哪怕是内部系统生成的配置),都要做校验和异常处理。
-
怎么做:如果文件太大,Log 一个 Error,然后使用旧的配置继续运行,而不是直接自杀。永远不要信任输入,哪怕它是你同事写的。
2. “灰度发布”不仅是代码,配置也要灰度
这次事故是因为配置一下子推到了核心路径上。
-
教训:配置变更(Configuration as Code)也是代码发布。
-
怎么做:金丝雀发布(Canary Release)。先推 1% 的节点,观察 10 分钟。如果那 1% 的节点炸了,回滚也就几秒钟的事,不至于全球陪葬。
3. 这里的”单点故障”是你没想到的
你以为用了 CDN 就高枕无忧了?如果你的 DNS、WAF、CDN 全是 Cloudflare 一家的,那它挂了你就彻底失联。
- 对于高可用要求极高的业务:考虑 Multi-CDN 策略。虽然贵且配置麻烦(要搞清楚 DNS 轮询或者故障切换),但在这种时候,你就是全网最靓的仔。
四、 如何优雅地避坑?
咱们普通开发者虽然没有 CF 那么大的体量,但道理是通的:
-
监控要独立:不要用跑在自己服务器上的监控去监控自己。像这次 CF 连状态页都挂了,你得用第三方的(比如 UptimeRobot 或 BetterStack)来监控你的服务。
-
降级策略(Fallback):
- 如果你的 API 依赖 CF 的 Workers KV,当 KV 挂了,你的代码是直接抛 500 给用户,还是能降级去读一个稍微旧一点的本地缓存?
- 代码里要留后路,Catch 住那些外部服务的异常。
-
不要迷信大厂:AWS 会挂,Azure 会挂,Cloudflare 也会挂。SLA 里的 99.99% 是赔你代金券的,不是保你不死机的。
五、 结语
这次 11.18 事故,Cloudflare 也是实实在在给大家上了一课:即使是互联网的守门人,也会被自己生成的”钥匙”给绊倒。
对于我们来说,除了吃瓜,更要记得:代码里的每一个 Limit,如果不处理好,都是一颗定时的雷。
P.S. 觉得文章有用的话,别忘了订阅。这里是Zac Sokach,我们下个 Bug 见!