提供內(nèi)容傳遞網(wǎng)絡(luò)及安全服務(wù)的Cloudflare本周坦承,該公司在11月14日,因?yàn)閮?nèi)部系統(tǒng)一連串的bug,在短短5分鐘的錯(cuò)誤配置中,便遺失了55%的客戶日志。
Cloudflare的網(wǎng)絡(luò)是由分布在全球330個(gè)城市的系統(tǒng)組成,它們支持多項(xiàng)服務(wù),且系統(tǒng)的每個(gè)部分都會(huì)產(chǎn)生事件日志,并將它們發(fā)送給客戶,供客戶執(zhí)行合規(guī)性管理、系統(tǒng)觀察,或是會(huì)計(jì)。Cloudflare平均每天會(huì)處理50兆個(gè)客戶事件日志,但僅有不到10%、約4.5兆個(gè)會(huì)發(fā)送給客戶。
Cloudflare的日志處理架構(gòu),包括負(fù)責(zé)從全球服務(wù)器接受并批量轉(zhuǎn)發(fā)日志的Logfwdr,接收批量日志并進(jìn)一步將它們分配至緩沖區(qū)的Logreceiver,管理超過(guò)100萬(wàn)個(gè)日志緩沖區(qū)的Buftee,以及將日志推送到客戶指定地點(diǎn)的Logpush。
在11月14日那天,為了支持新的數(shù)據(jù)集以處理額外的日志類型,Cloudflare更新了Logpush的配置,配置系統(tǒng)需要將該配置發(fā)送給Logfwdr,但配置系統(tǒng)發(fā)送給Logfwdr的文件卻是空白的,因而觸發(fā)了Logfwdr內(nèi)部的“故障開(kāi)放”(Fail Open)機(jī)制。
該機(jī)制是一種系統(tǒng)設(shè)計(jì)策略,在發(fā)生故障時(shí),系統(tǒng)默認(rèn)選擇開(kāi)放狀態(tài),也即寧可多做也不要停止服務(wù),在Cloudflare的日志系統(tǒng)上發(fā)生時(shí),它便選擇替所有的客戶發(fā)送日志。
盡管Cloudflare很快就發(fā)現(xiàn)該錯(cuò)誤,并在5分鐘內(nèi)恢復(fù)了該變更,但Logfwdr已根據(jù)Fail Open發(fā)送日志給大量客戶,而B(niǎo)uftee原本有防護(hù)機(jī)制,卻因配置問(wèn)題而未被正確激活,導(dǎo)致Buftee所管理的日志緩沖區(qū)數(shù)量,很快就從一百多萬(wàn)個(gè)快速增加到4,000萬(wàn)個(gè)。
圖片來(lái)源/Cloudflare
只有短短5分鐘的錯(cuò)誤配置便造成了巨大的重載,導(dǎo)致底層系統(tǒng)重載而無(wú)法正常運(yùn)行,需要全面的重置與重新啟動(dòng)。這起意外從配置系統(tǒng)出錯(cuò)、Fail Open的設(shè)計(jì)、Buftee的保護(hù)機(jī)制未被啟動(dòng),一直到恢復(fù),總計(jì)持續(xù)了3.5個(gè)小時(shí),造成Cloudflare原本應(yīng)該發(fā)送給客戶的日志中,有55%并未發(fā)送而且完全遺失。
Cloudflare表示,大規(guī)模系統(tǒng)中的故障是無(wú)可避免的,但子系統(tǒng)必須具備自我保護(hù)機(jī)制,以防止來(lái)自其他部分的故障引發(fā)連鎖反應(yīng),在此次的事故中,系統(tǒng)某部分的配置錯(cuò)誤導(dǎo)致了另一部分的重載,而另一部分的系統(tǒng)也存在著配置問(wèn)題,如果正確的配置,即可避免日志遺失。