提供内容传递网络及安全服务的Cloudflare本周坦承,该公司在11月14日,因为内部系统一连串的bug,在短短5分钟的错误配置中,便遗失了55%的客户日志。
Cloudflare的网络是由分布在全球330个城市的系统组成,它们支持多项服务,且系统的每个部分都会产生事件日志,并将它们发送给客户,供客户执行合规性管理、系统观察,或是会计。Cloudflare平均每天会处理50兆个客户事件日志,但仅有不到10%、约4.5兆个会发送给客户。
Cloudflare的日志处理架构,包括负责从全球服务器接受并批量转发日志的Logfwdr,接收批量日志并进一步将它们分配至缓冲区的Logreceiver,管理超过100万个日志缓冲区的Buftee,以及将日志推送到客户指定地点的Logpush。
在11月14日那天,为了支持新的数据集以处理额外的日志类型,Cloudflare更新了Logpush的配置,配置系统需要将该配置发送给Logfwdr,但配置系统发送给Logfwdr的文件却是空白的,因而触发了Logfwdr内部的“故障开放”(Fail Open)机制。
该机制是一种系统设计策略,在发生故障时,系统默认选择开放状态,也即宁可多做也不要停止服务,在Cloudflare的日志系统上发生时,它便选择替所有的客户发送日志。
尽管Cloudflare很快就发现该错误,并在5分钟内恢复了该变更,但Logfwdr已根据Fail Open发送日志给大量客户,而Buftee原本有防护机制,却因配置问题而未被正确激活,导致Buftee所管理的日志缓冲区数量,很快就从一百多万个快速增加到4,000万个。
图片来源/Cloudflare
只有短短5分钟的错误配置便造成了巨大的重载,导致底层系统重载而无法正常运行,需要全面的重置与重新启动。这起意外从配置系统出错、Fail Open的设计、Buftee的保护机制未被启动,一直到恢复,总计持续了3.5个小时,造成Cloudflare原本应该发送给客户的日志中,有55%并未发送而且完全遗失。
Cloudflare表示,大规模系统中的故障是无可避免的,但子系统必须具备自我保护机制,以防止来自其他部分的故障引发连锁反应,在此次的事故中,系统某部分的配置错误导致了另一部分的重载,而另一部分的系统也存在着配置问题,如果正确的配置,即可避免日志遗失。