微軟道歉!一條代碼引發(fā)慘案:一個(gè)拼寫錯(cuò)誤,17個(gè)生產(chǎn)數(shù)據(jù)庫被刪
微軟 Azure DevOps 是一套應(yīng)用程序生命周期服務(wù),提供了從代碼管理到持續(xù)集成、持續(xù)交付、測(cè)試、監(jiān)控等一系列功能。然而,就在 5 月 24 日,這個(gè)服務(wù)在巴西南部區(qū)域發(fā)生了長(zhǎng)達(dá) 10 小時(shí)的宕機(jī),影響了數(shù)千名客戶。事后調(diào)查發(fā)現(xiàn),竟然是因?yàn)橐粋€(gè)簡(jiǎn)單的拼寫錯(cuò)誤,導(dǎo)致了 17 個(gè)生產(chǎn)數(shù)據(jù)庫被誤刪。

這個(gè)拼寫錯(cuò)誤出現(xiàn)在一個(gè)用于清理數(shù)據(jù)庫快照的后臺(tái)作業(yè)中。原本,這個(gè)作業(yè)是為了幫助 Azure DevOps 工程師偶爾保存生產(chǎn)數(shù)據(jù)庫的快照,以便調(diào)查問題或測(cè)試性能改進(jìn)。但是,在最近的一次代碼升級(jí)中,工程師用一個(gè)新的 NuGet 包替換了一個(gè)已經(jīng)棄用的包,導(dǎo)致了一個(gè)巨大的變更請(qǐng)求。在這個(gè)請(qǐng)求中,有一行代碼將刪除 Azure SQL 數(shù)據(jù)庫的調(diào)用換成了刪除托管數(shù)據(jù)庫的 Azure SQL Server 的調(diào)用。也就是說,本來只想刪除一些舊的快照數(shù)據(jù)庫,結(jié)果卻把整個(gè)服務(wù)器都刪掉了。

這個(gè)錯(cuò)誤并沒有被及時(shí)發(fā)現(xiàn),因?yàn)樗辉谔囟l件下才會(huì)觸發(fā),而 Azure DevOps 的測(cè)試并沒有覆蓋這些極端情況。當(dāng)這個(gè)錯(cuò)誤代碼被部署到巴西南部區(qū)域的客戶環(huán)境時(shí),就引發(fā)了災(zāi)難性的后果。17 個(gè)生產(chǎn)數(shù)據(jù)庫被刪除后,整個(gè)區(qū)域的服務(wù)無法處理。
雖然數(shù)據(jù)沒有丟失,但恢復(fù)過程卻非常復(fù)雜和耗時(shí)。首先,由于客戶無法自行恢復(fù) Azure SQL Server,必須由 Azure SQL 團(tuán)隊(duì)參與恢復(fù)工作。其次,由于數(shù)據(jù)庫有不同的備份配置,導(dǎo)致恢復(fù)數(shù)據(jù)時(shí)出現(xiàn)了不匹配的問題。最后,在數(shù)據(jù)庫開始恢復(fù)上線之后,還出現(xiàn)了一系列網(wǎng)絡(luò)服務(wù)器和負(fù)載均衡器的問題,導(dǎo)致服務(wù)無法正常訪問。
微軟已經(jīng)對(duì)此次事件進(jìn)行了深入分析,并采取了各種措施來防止類似問題再次發(fā)生。包括修復(fù)快照刪除作業(yè)中的 bug,增加更多的測(cè)試覆蓋范圍,為關(guān)鍵資源添加鎖定機(jī)制,確保所有數(shù)據(jù)庫備份使用相同的設(shè)置等等。微軟也向所有受此次中斷影響的客戶表示了歉意,并承諾會(huì)持續(xù)改進(jìn)服務(wù)質(zhì)量和可靠性。
這起事件給我們提供了一個(gè)教訓(xùn):即使是一個(gè)看似微不足道的拼寫錯(cuò)誤,也可能造成嚴(yán)重的后果。因此,在編寫、審查和部署代碼時(shí),我們要格外小心和仔細(xì),并且要有充分的測(cè)試和備份機(jī)制來應(yīng)對(duì)可能出現(xiàn)的問題。