Cloudflare故障本可避免,但其解决方案未能切中要害
2025年11月26日
又一场全球IT中断事件发生了(我们行业似曾相识的场景再次上演)。这次发生在Cloudflare(Prince 2025),再次导致互联网大面积瘫痪(Booth 2025)。
与之前我对GCP和CrowdStrike中断事件的分析一样,本文将对Cloudflare的根本原因分析(RCA)提出批评——尽管其很好地概述了事件经过,但未能抓住真正的教训。
以下是他们RCA的关键部分:
不幸的是,过去存在这样的假设:类似这样的查询返回的列列表只会包含"默认"数据库:
1 2 3 4 5 6 7SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;注意这个查询没有过滤数据库名称。随着我们逐步向特定ClickHouse集群用户推出显式授权,在11:05的更改后,上述查询开始返回列的"重复项",因为这些列属于存储在r0数据库中的底层表。
不幸的是,这正是Bot Management功能文件生成逻辑为构建本节开头提到的文件中每个输入"特征"所执行的查询类型。
上述查询将返回一个列表,如下所示(简化示例):
然而,作为授予用户的附加权限的一部分,响应现在包含了r0模式的所有元数据,实际上使响应中的行数增加了一倍以上,最终影响了最终文件输出中的行数(即特征)。
核心问题
一个核心数据库查询没有正确的约束来表达业务规则。它不仅缺少数据库名称过滤,而且明显需要去重和限制,因为这些似乎是关键的业务规则。
因此,一个新的底层安全工作显现了查询中已有的(意外)潜在问题。由于这按定义是意外的,应用程序代码没有预料到这个值会变成这样,并做出了不良反应。这导致似乎所有Cloudflare核心系统都陷入了崩溃循环。这个错误在部署过程中没有被发现,因为错误的代码路径需要生成被认为不可能的数据。
听起来熟悉吗?应该熟悉。任何资深工程师以前都见过这种模式。这是经典的数据库/应用程序不匹配。考虑到这一点,让我们回顾一下Cloudflare计划如何防止这种情况再次发生:
- 以与处理用户生成输入相同的方式强化Cloudflare生成配置文件的摄取
- 为功能启用更多全局紧急停止开关
- 消除核心转储或其他错误报告压垮系统资源的能力
- 审查所有核心代理模块错误条件的故障模式
这些都是可靠、合理的步骤。但问题是:他们已经在做大部分这些工作——但中断还是发生了。
为什么?因为他们似乎将物理复制误认为没有单点故障。这混淆了物理层和逻辑层。一个人可以在没有任何物理单点故障的情况下拥有逻辑单点故障,这正是这种情况。
我的这一论断基于他们放弃PostgreSQL并采用ClickHouse(Bocharov 2018)的选择。整篇文章很好地概述了如何快速处理数据,但没有一行关于如何在面对变化时保证其逻辑正确性/一致性的内容。
他们将逻辑问题当作物理问题来处理
我将重复在我之前关于GCP中断的文章中提供的相同建议:
真正的原因
这类中断源于应用程序逻辑和数据库模式之间不受控制的交互。你不能通过更多测试或部署或标志来可靠地捕捉到这一点。你通过构造——通过分析设计来预防它。
- 无空值字段
- (作为第1点的推论)数据库的完全规范化(数据库设计原则,或者说,真相就在那里)
- 形式化验证的应用程序代码(Chapman et al. 2024)
结论
FAANG风格的公司不太可能全面采用形式化方法或关系严谨性。但对于他们最关键的系统中,他们应该这样做。这是通过设计使此类故障变得不可能的唯一方法,而不仅仅是减少可能性。
互联网会感谢他们。(云用户也会——购买者自负。)
参考文献
Bocharov, Alex. 2018. “使用Clickhouse每秒处理600万请求的HTTP分析。” https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/
Booth, Robert. 2025. “什么是Cloudflare——为什么它的中断导致如此多网站瘫痪?” https://www.theguardian.com/technology/2025/nov/18/what-is-cloudflare-and-why-did-its-outage-take-down-so-many-websites
Chapman, Roderick, Claire Dross, Stuart Matthews, and Yannick Moy. 2024. “共同开发程序及其正确性证明。” Commun. Acm 67 (3): 84–94. https://doi.org/10.1145/3624728
Prince, Matthew. 2025. “2025年11月18日Cloudflare中断事件。” https://blog.cloudflare.com/18-november-2025-outage/
图1:克吕尼图书馆曾是法国和欧洲最丰富、最重要的图书馆之一。1790年法国大革命期间,修道院被洗劫并大部分被毁,只有一小部分幸存