找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

110

积分

0

好友

8

主题
发表于 昨天 23:30 | 查看: 11| 回复: 0

2024 年 11 月 18 日,全球最大的 CDN 服务商之一 Cloudflare 突然发生大规模宕机。

当天上午 11:20(UTC 时间),无数网站同时返回 5xx 错误,用户无法正常访问,就连 Cloudflare 自己的工程师都被锁在了内部管理后台之外。这次事故持续数小时,影响了全球数百万个依赖 Cloudflare 服务的网站。

有网友在 Reddit 上调侃道:"你平时根本不知道有多少网站用了 Cloudflare,直到 Cloudflare 挂了。然后你想去 Google 搜一下到底有多少网站在用 Cloudflare,结果发现搜索结果里的网站也都用了 Cloudflare,全都打不开。"

6408.webp

故障根源:一次"例行优化"埋下的隐患

事后,Cloudflare CEO Matthew Prince 发布了详细的事故分析报告,披露了这次宕机的技术细节。

问题的起因看似简单:工程团队正在对 ClickHouse 数据库集群进行一次常规的安全改进,目的是通过显式声明用户权限来提高数据表访问的安全性。这本是一次标准的数据库优化操作,在云栈社区「后端 & 架构」板块( https://yunpan.plus/f/14 )的讨论中,类似的数据库权限管理优化案例并不少见。

然而,这个看似无害的改动却在 Bot Management(机器人管理)系统中触发了一个意想不到的连锁反应。

Prince 在报告中解释道:

"这次变更让所有用户都能准确访问到他们有权限的表的元数据。但问题在于,过去的系统假设查询返回的列信息只会包含 'default' 数据库的内容。"

实际情况远比预期复杂:更新后的数据库查询不仅返回了默认数据库的列信息,还意外地从底层的 r0 分片数据库中拉取了重复的行数据。

这导致一个名为"特征文件"(feature file)的配置集——用于追踪机器人威胁的核心数据——体积直接翻倍。

性能优化反成致命弱点

为了提升性能,Cloudflare 的核心代理软件会为这个特征文件预分配内存。但系统设置了一个硬性的安全上限:最多 200 个特征

当膨胀后的文件在网络中传播时,瞬间突破了这个限制,直接导致 Bot Management 模块崩溃。

更棘手的是诊断过程:由于数据库更新是逐步推出的(灰度发布),系统每隔几分钟就会在"正常"和"异常"状态之间反复切换。这种不稳定的表现让工程团队一度误判,以为他们正在遭受超大规模的 DDoS 攻击,而不是内部系统故障。

雪上加霜的是,Cloudflare 的外部状态页面也恰好在同一时间出现了问题——这完全是个巧合,却让外界一度以为连支持基础设施都遭到了攻击。

故障诊断时间线

  • 11:20 UTC:Bot Management 模块开始出现异常
  • 11:25 UTC:大规模 5xx 错误在全球范围内爆发
  • 11:30 UTC:工程团队误判为 DDoS 攻击
  • 12:15 UTC:定位到数据库变更相关性
  • 13:40 UTC:回滚数据库配置,服务逐步恢复

整个故障持续了超过 2 小时,影响了全球范围内使用 Cloudflare CDN、安全服务和 DNS 解析的网站。

事故背后的深层思考

Prince 在报告中坦诚地写道:

"我们的网络曾有一段时间无法路由流量,这对团队的每一位成员来说都是极其痛苦的。"

这次事故暴露了现代分布式系统架构中的几个关键问题:

1. 渐进式发布的双刃剑

灰度发布(渐进式部署)本是为了降低风险,但在这次事件中,它反而掩盖了问题的真实原因,让故障诊断变得更加困难。

系统在"好"与"坏"状态之间反复横跳,让工程师无法快速确定问题的根本原因。

2. 隐式假设的脆弱性

代码中那些"历史上一直如此"的假设,往往是系统中最脆弱的环节。

在这个案例中,Bot Management 系统假设数据库查询只会返回 default 数据库的列信息,这个未明确声明的依赖关系成为了定时炸弹。当上游的 ClickHouse 配置发生变化时,这个隐式假设立即失效。

3. 硬编码限制的风险

200 个特征的硬性上限原本是为了保护系统性能,防止内存溢出。但当业务逻辑发生变化、数据量翻倍时,这种固定阈值可能反而成为瓶颈。

更好的做法是

  • 设置动态阈值,根据实际内存使用情况调整
  • 增加告警机制,在接近阈值时提前预警
  • 实现优雅降级,而不是直接崩溃
4. 可观测性的重要性

在复杂的分布式系统中,如果缺乏足够的可观测性工具,工程师很难快速定位问题的真正根源,容易被表象误导。

这次事故中,工程团队花了近一个小时才从"DDoS 攻击"的误判中走出来,定位到真正的数据库配置问题。

给开发者和架构师的启示

对于从事后端开发、系统架构和运维工作的技术人员来说,这个案例提供了宝贵的经验教训:

数据库变更管理

  • 充分测试 schema 变更对下游系统的影响
  • 建立完整的依赖关系图谱
  • 在测试环境中模拟真实数据量进行压测

代码质量与架构设计

  • 警惕代码中的隐式假设,尽可能显式声明依赖
  • 避免硬编码限制,使用配置化的动态阈值
  • 为关键模块实现优雅降级机制

可观测性建设

  • 建立完善的监控、日志和追踪体系
  • 关键指标设置多级告警
  • 缩短从发现问题到定位根因的时间

灰度发布策略

  • 灰度过程中增加关键指标的实时监控
  • 设置自动回滚机制
  • 确保灰度步骤可快速撤销

基础设施独立性

  • 状态页面等关键基础设施应独立部署
  • 避免单点故障影响整体可用性
  • 建立多层次的故障隔离机制

写在最后

Cloudflare 这次宕机事件再次提醒我们:在云原生时代,即使是最成熟、最专业的技术团队,也可能因为一个看似微小的改动而引发全球性故障。

技术债务往往藏在最不起眼的地方。当我们追求性能优化和安全加固时,也要时刻警惕那些可能被忽略的边界条件。

毕竟,在分布式系统的世界里,蝴蝶效应无处不在。

对于正在构建和维护大规模分布式系统的团队来说,这个案例值得反复研读。它不仅展示了技术故障的演化路径,更重要的是揭示了在复杂系统中,如何平衡性能、安全与稳定性的永恒命题。


手机版|小黑屋|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-11-23 19:54 , Processed in 0.058460 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表