Cloudflare 发布了一份报告,揭露了其基础设施遭受的最大规模事故之一。该事故导致其大部分内容分发网络 (CDN) 瘫痪超过三个小时。此次故障源于 ClickHouse 存储中托管的数据库结构发生变更,导致包含反机器人系统参数的文件大小翻倍。尽管用于生成该文件的 SQL 查询只是按键检索所有表中的所有数据,而没有过滤重复项,但数据库中仍然创建了重复表。查询语句如下:SELECT name, type FROM system.columns WHERE table = 'http_requests_features' order by name;

创建的文件被分发到集群中所有处理传入请求的节点。在用于检查机器人请求的处理程序中,文件中指定的参数存储在内存中。为了防止内存过度消耗,代码对文件大小设置了限制。正常情况下,实际文件大小远小于限制值,但在复制表之后,文件大小超过了限制。
问题在于,处理程序没有正确处理超出限制的值并继续使用之前的文件版本,也没有通知监控系统紧急情况,而是崩溃了,导致后续流量转发受阻。该错误是由 Rust 代码中对 Result 类型使用 unwrap() 方法引起的。

当 Result 值为“Ok”时,unwrap() 方法返回与该状态关联的对象;但如果结果为“Ok”,则调用会导致异常终止(调用“panic!”宏)。unwrap() 通常用于调试或编写测试代码时,不建议在生产项目中使用。


来源: opennet.ru
