整理 | 禾木木 責編 | 鄭麗媛
5 月 24 日,微軟 Azure DevOps 在巴西南部(SBR)區域內一處 scale-unit(微軟 Azure 部署架構中最小的容量單元)設施發生癱瘓,持續了 10 個小時。
6 月 2 日,微軟首席軟體工程經理 Eric Mattingly 為這次故障出面道歉,並透露了具體原因:一個簡單的錯誤拼寫,導致了整整 17 個生產級資料庫被刪除。


「隱藏」著一條拼寫錯誤
Mattingly 解釋道,Azure DevOps 工程師偶爾會對生產級資料庫的快照進行保存,以查看報告上的問題或測試性能改進。為清理這些快照資料庫,會有專門的後臺每天運行,系統會在一段設定的時間後刪除舊快照。
在最近的一波 sprint (敏捷開發術語中的迭代開發週期)中,Azure DevOps 工程師執行了一次程式碼升級,將已棄用的 Microsoft .Azure. Management.* 軟體包換成受支持的 Azure.ResourceManager.* NuGet 軟體包。
這個操作,連帶著大量 pull request 變更請求,會將舊包中的 API 調用替換為新包中的 API 調用——而引發此次事件的拼寫錯誤,就出現在 pull request 內,導致後臺快照刪除作業刪掉了整個伺服器。
Mattingly 表示:「這條 pull request 中的快照刪除作業中,隱藏著一條拼寫錯誤,它會刪除 Azure SQL 資料庫調用,並替換成刪除託管資料庫的 Azure SQL Server 調用。」
按理來說,Azure DevOps 有一系列測試可發現這類問題。但 Mattingly 稱,該錯誤程式碼只在某些條件下運行,因此沒有被現有的測試機制及時發現。
Mattingly 表示,Azure DevOps 工程師使用安全部署實踐(SDP)將 Sprint 222 部署到了 Ring 0(微軟內部部署),那裡不存在快照資料庫,所以刪除作業不會執行。但幾天後,Azure DevOps 工程師又將其部署至 Ring 1(客戶環境),也就是巴西南部的 scale-unit 設施。該環境中有一個比較舊的快照資料庫,因此觸發這個錯誤程式碼,於是它在刪除 Azure SQL Server 的同時,還刪掉了 scale-unit 設施中的 17 個生產級資料庫。
好在,據 Mattingly 介紹,此次事件並未引發資料丟失。為了防止問題再次發生,Mattingly 稱微軟已採取了各種修復和重置措施,並向所有受此中斷影響的客戶道歉。

為何花費了 10 個小時才全部恢復?
據微軟官方介紹,這 17 個生產級資料庫被刪後 20 分鐘不到,其工程師就檢測到了中斷並立即開始搶修,但依舊花費了 10 個小時才完全恢復。
Mattingly 表示,這其中有幾個原因:
▶ 首先,客戶無法自己恢復 Azure SQL Server,因此必須由 Azure 團隊來處理這項工作,這個過程對許多人來說大約需要一個小時。
▶ 其次,資料庫有不同的備份配置,一些資料庫被配置為 Zone 冗餘備份,另一些資料庫被配置為最新的 Geo-zone 冗餘備份。協調這種不匹配情況給恢復過程增添了不少時間。
▶ 最後,在資料庫開始重新上線後,由於 Web 伺服器出現了一系列複雜的問題,即使是資料位於這些資料庫中的客戶,也無法訪問整個 scale-unit 設施。
這些問題是伺服器預熱任務引起的,該任務會通過測試調用遍歷可用的資料庫列表。但恢復過程中的資料庫拋出了一個錯誤,導致預熱測試「執行指數級的 backoff 重試「,結果導致正常情況下只需不到 1 秒的預熱過程,平均耗時了 90 分鐘。
更復雜的是,整個恢復過程是交錯進行的,一旦其中一兩臺伺服器重新開始接收客戶流量,就會因過載而再次停運。最終,工程師只能阻斷所有流向巴西南部 scale-unit 的流量,確保一切準備就緒後,再重新加入負載均衡器並處理流量。
目前,為防止此次事故再次發生,微軟方面已實施各種修復和重新配置。Mattingly 說:「我們再次向所有受到這次故障影響的客戶道歉。」

網友:微軟只是繼續「貼膏藥」
儘管如此,但此次微軟的道歉並沒有得到網友的諒解:
▶ 「看來 Azure 變得越來越複雜了,而頻繁變化加上日益增加的複雜性,最終只會走上一條路:更多的災難以及可靠性降低。聽起來微軟對此事故的解決方案是繼續「貼膏藥」,但我認為在某個階段,還是有必要對方法進行更根本的重新思考,避免最終分崩離析。」
甚至因為這個簡單的 Bug 導致 10 小時宕機的結果,不少網友也開始討論「雲」的必要性:
▶ 「關於雲和 DevOps 最可怕的事情是,其實大多數檔案都相當簡潔,但其中總是有許多神奇的鍵/值,而實際上它們在程式碼審查中並沒有任何意義。」
▶ 「這就是我討厭雲的眾多原因之一。十多年來,我一直沒有與 IaaS 打交道的樂趣,我的本地內容非常完美,我還成功地抵禦了過去十年中那些想要一次又一次將雲帶回來的人。」
對此,你又有哪些看法呢?
參考連結:
https://www.theregister.com/2023/06/03/microsoft_azure_outage_brazil/
https://status.dev.azure.com/_event/392143683/post-mortem