“總不能讓我這個上班才1周的新人來背鍋吧?”CloudFlare作為全球最為知名的網絡服務提供商之一,偶爾出現中斷是很常見的事情,一般來說CloudFlare有多種不同的冗餘策略,即便掛影響范圍也比較小。
但是前兩天 CloudFlare 出現的技術故障竟然持續 40 個小時,這應該是 CloudFlare 中斷時間最長的一次事故,所以現在恢復後 CloudFlare 火速發佈博客分析此事件的前因後果。
故障時間是從 2023 年 11 月 2 日 11:44 到 11 月 4 日 04:25,時間均為 UTC 時間,與中國時間有 + 08:00 時差,下面提到的所有時間都是 UTC 時間。
直接原因:機房供電故障、高壓線接地故障
時間說明:11:44 UTC 換成太平洋時間 (下面提到的這個數據中心位於美國俄勒岡州,使用太平洋時間) 是夜裡四點前後。
本次中斷事故影響 CloudFlare 的很多產品,不過最嚴重的是 CloudFlare 控制臺和分析服務,其中控制臺就是客戶登錄 CloudFlare 後用來操作的地方,分析服務則是提供日志和分析報告之類的。
盡管 CloudFlare 已經考慮到核心數據中心可能會掛掉因此做冗餘,但隨著時間的推移,系統會變得越來越復雜,因此冗餘也不一定能生效。
根據 CloudFlare 說明,最直接的原因是 CloudFlare 租用的 Flexential 數據中心出現一起計劃外的供電維護,這導致數據中心的市電供應中斷,但數據中心都有備用發電機,即便備用發電機沒用那還有 UPS 不間斷電源呢。
盡管 Flexential 的數據中心已經通過 Tier III 認證,不過在通用電氣進行計劃外的市電維護後,這個數據中心還是出現一大堆問題。
當出現供電問題後 Flexential 啟動備用發電機進行供電,但並沒有通知他們的客戶,包括 CloudFlare,因此 CloudFlare 是不知道核心數據中心出現電力問題。
與最佳實踐不同的是,Flexential 同時運行僅剩的一個市電設施以及內部的發電機進行供電,一般來說遇到這種情況應該直接切換為備用發電機供電,因為在市電供應問題出現後,僅剩的這個市電設施也可能會被切斷,而 Flexential 既沒有通知客戶也不知道為什麼還要使用剩餘的一個市電設施。
但這個市電設施就這麼巧出現問題,到 11:40,也就是 CloudFlare 故障幾分鐘前 (這時候還沒故障,因為備用發電機還在幹活中),剩餘的這個市電設施的前置變壓器出現接地故障,前置變壓器的電源是 12kV 的高壓電,高壓電出現接地是很嚴重的問題。
出現高壓電接地後電氣系統為確保電氣設施的安全立即自動啟動停機保護,不巧的是這種停機保護也把所有發電機都給停,於是這個數據中心的市電和備用發電機供電全部停掉。
萬幸的是還有一組 UPS 電池,大約可以供電 10 分鐘,如果在 10 分鐘內市電或者發電機能恢復工作,那麼 UPS 會停機,這樣整個系統基本都不會出現大問題。
然而這組 UPS 電池工作 4 分鐘後就出現故障,此時 Flexential 還沒修好發電機,於是數據中心徹底斷電。
三件事阻礙發電機重新工作:
第一,由於高壓線接地故障導致電路跳閘,必須物理訪問並手動重啟各個設施;
第二,Flexential 的門禁系統也沒有備用電池供電,因此出於離線模式,壓根進不去(那最後估計是暴力方式進去的);
第三,Flexential 數據中心夜班隻有保安和一名工作僅一周的技術人員,沒有經驗豐富的操作或電氣專傢。
由於發電機遲遲沒有恢復,UPS 電源在 12:01 徹底歇菜,此時整個數據中心都歇菜,但 Flexential 仍然沒有通知他們的任何客戶表示數據中心已經掛。
CloudFlare 在 11:44 收到第一個報警通知,這就是 UPS 電源工作 4 分鐘後出現故障的時間,這時候 CloudFlare 意識到問題,開始主動聯系 Flexential 並希望派遣 CloudFlare 自己在當地的工程師進入數據中心。
到 12:28 Flexential 終於向客戶發出第一條通知 (此時當地時間是凌晨 5 點前後),表示數據中心遇到故障,工程師正在積極努力解決問題。
12:48 Flexential 終於重啟發電機,部分設施開始恢復供電,但是更巧合的是 CloudFlare 所屬的電源線路的斷路器又損壞,不知道這是由於接地故障還是浪湧導致的,亦或者說之前就已經壞,現在發現發電機重新上線後沒法恢復供電才發現斷路器壞。
Flexential 於是又開始嘗試更換新的斷路器,但由於損壞的斷路器太多,他們還需要去采購,不知道這會兒 Flexential 有沒有打電話讓正在睡覺的電氣工程師進入現場。但這個點去采購斷路器估計有點難度。
由於 Flexential 無法告知恢復時間,CloudFlare 決定在 13:40 啟用位於歐洲的災備站點,讓服務先恢復。
龐大的系統能夠快速通過冗餘站點恢復那是不可能的,前提是你已經經過完完全全的測試,否則真正進行切換時肯定會遇到問題。
所以接下來就是 CloudFlare 自己的問題。
CloudFlare 自己的問題:
直接原因是數據中心問題,但還有間接原因,那就是為快速迭代 CloudFlare 允許團隊快速創新,這意味著有一些新東西可能沒有經過嚴格測試就上線。
在故障轉移過程中失敗的 API 調用直接起飛,由於失敗的 API 調用太多,CloudFlare 不得不開始限制請求速率,直到 17:57 後災備站點基本恢復運行。
但還有些產品 - 一些較新的產品並沒有完全進行災備測試,所以部分服務仍然不可用。
到 11 月 2 日 22:48 Flexential 那邊終於換好斷路器並開始使用市電進行供電,此時忙得暈頭轉向的 CloudFlare 團隊決定歇會兒,畢竟災備站點現在能應對大部分服務的運行。
到 11 月 3 日開始 CloudFlare 著手恢復 Flexential 數據中心,首先是物理啟動網絡設備,然後啟動數千臺服務器並恢復服務,但這些服務器也需要重新配置,而重建管理配置服務器就花 3 個小時。有些服務之間存在依賴,必須上遊服務恢復才能使用,所以必須按照順序進行操作。
配置服務器能用後工程師開始操作其他服務器,每臺服務器重建時間在 10 分鐘~2 小時之間,直到 11 月 4 日 04:25 整個服務才被恢復。
對運維有興趣的用戶建議閱讀 CloudFlare 原文看看總結出來的教訓:https://blog.cloudflare.com/post-mortem-on-cloudflare-control-plane-and-analytics-outage/