ZACSOKACH
(Updated: 2025年11月19日 )

Cloudflare 又双叒叕挂了?11.18 史诗级'炸鱼'事故全复盘!

#Cloudflare #技术复盘 #架构设计 #系统故障 #运维经验

兄弟们,刚才(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 那么大的体量,但道理是通的:

  1. 监控要独立:不要用跑在自己服务器上的监控去监控自己。像这次 CF 连状态页都挂了,你得用第三方的(比如 UptimeRobot 或 BetterStack)来监控你的服务。

  2. 降级策略(Fallback)

    • 如果你的 API 依赖 CF 的 Workers KV,当 KV 挂了,你的代码是直接抛 500 给用户,还是能降级去读一个稍微旧一点的本地缓存?
    • 代码里要留后路,Catch 住那些外部服务的异常。
  3. 不要迷信大厂:AWS 会挂,Azure 会挂,Cloudflare 也会挂。SLA 里的 99.99% 是赔你代金券的,不是保你不死机的。


五、 结语

这次 11.18 事故,Cloudflare 也是实实在在给大家上了一课:即使是互联网的守门人,也会被自己生成的”钥匙”给绊倒。

对于我们来说,除了吃瓜,更要记得:代码里的每一个 Limit,如果不处理好,都是一颗定时的雷。

P.S. 觉得文章有用的话,别忘了订阅。这里是Zac Sokach,我们下个 Bug 见!