尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
越來越多的企業開始使用雲存儲基礎設施,將信息存儲在雲端而非以前的物理基礎設施中。然而,雲存儲並非萬無一失;在網路越來越複雜的情況下,雲存儲設施的故障也變得更加難以預料。
系統故障給企業帶來了代價高昂的損失:98% 的企業表示,一小時的宕機時間將給他們帶來超過 10 萬美元的損失,一次服務中斷有可能讓一個公司損失數百萬美元。英國航空公司首席執行官說,2017年5月發生了一起技術故障導致數萬名乘客滯留,他們公司因此損失了8000萬英鎊(約合7億人民幣)。
等待下一次系統故障並非解決方案,為了迎接挑戰,混沌工程應運而生。
2010年,Netflix的信息存儲開始從物理基礎設施向Amazon Web Services提供的雲基礎設施轉變。在這個轉移過程中,最讓企業擔憂的事情就是數據丟失而影響流媒體體驗的需求。為了對數據丟失或是停機等問題有所預防,Netflix的工程團隊創造了Chaos Monkey(混亂的猴子),這就是混沌工程的由來。
混沌工程是一種系統的方法,使得系統故障可以在導致中斷之前被識別。通過主動測試系統在壓力下如何響應,工程團隊可以在故障出現之前識別並修復它們。
用更通俗的方式來說,混沌工程就像「疫苗」:注射少量潛在有害的異物以預防疾病,這種人為的「破壞」其實是有幫助的。混沌工程通過在技術系統中注入危害(如延遲、CPU故障或網路黑洞)來建立這種免疫力,從而發現和修正潛在的弱點。
從Google、Amazon、Facebook、Netflix、Microsoft、LinkedIn等一系列網路公司,到諸如銀行、金融等更傳統的行業,越來越多的技術公司開始把混沌工程應用於服務器架構的檢測中。
混沌實驗可以幫助減少意外事件,減輕工程團隊應急的負擔,增加對系統故障模式的理解從而能改進系統設計,減少嚴重事故檢測的平均時間和重復嚴重事故。
那麼,混沌工程從何而來?混沌工程通過什麼原理和方法幫助公司預防系統故障?如果要展開第一個混沌工程實驗,你需要怎麼做?本文將分享混沌工程的簡要歷史,演示混沌工程如何為你的系統提供新的見解,並且為你展開第一個混沌工程實驗提出了一些建議。以下,Enjoy:
1
為什麼搞破壞?
混沌工程的作用
混沌工程最初出現在那些開創大規模分布式系統的互聯網公司。分布式系統是一組計算機通過網路相互連接、通信並協調它們的行為而形成的系統。分布式系統存在參與者眾多、依靠網路等特點,具有一定的複雜性。為了預測系統失敗或出現錯誤的所有方式,「混沌工程」應運而生。
使用分布式系統的公司把信息存儲也置於其中,因此出現了分布式存儲系統,也就是通俗所說的「雲存儲」。
起初,人們對於雲存儲的認識存在一些謬誤,比如網路是可靠的,寬帶是無限的,延遲是零等。在意識到以上的認知是錯誤之後,工程師把這種「錯誤」放入系統中,例如「包丟失攻擊」和「延遲攻擊」。認識到這些謬誤的存在,很大程度上驅動了混動工程實驗的設計。
通過混沌工程的實施,用戶、企業和技術本身都能有所獲益:
對於用戶來說,服務的可用性和持久性的提高,這意味著不會有中斷干擾他們的日常使用。
對企業來說,混沌工程可以幫助公司避免巨大的維護成本和損失,提高對工程團隊的應急培訓,改善整個公司的意外事件管理流程。
而對於技術本身,從混沌實驗中獲得的經驗可以減少意外事件,減少工程團隊應急的負擔,增加對系統故障模式的理解從而能改進系統設計,縮短嚴重事故檢測的平均時間,減少類似事故的再次發生。
2
混沌工程原理
混沌工程運行經過有計劃的實驗,這些實驗可以讓工程團隊在實際情況中了解到系統在失敗時的表現。
這些實驗遵循三個步驟:
你首先要形成一個假設,假設系統在出現問題時應該如何運行。
然後,設計針對性的實驗在系統中測試它。
最後,在每一步中計算系統失敗的帶來的影響,尋找成功或失敗的跡象。當實驗結束時,你可以更好地理解系統的實際行為。
3
如何展開混沌工程實驗
前面已經說到,混沌工程就像「疫苗」,因此不足或是過量都無法起到預想的作用。我們建議循序漸進地展開混沌工程實驗,按照以下順序進行實驗:
已知-已知——已經了解並注意到的
已知-未知——注意到但不了解的
未知-已知——了解但沒有注意到的
未知-未知——既沒有注意到也不了解的
下圖說明了這個概念:
圖片來源:ChaosEngineering: the history, principles, and practice
為了在實踐中舉例說明這一點,我們將演示如何基於MySQL數據庫進行實驗。
如下圖所示,我們有一個100個MySQL主機的集群,每個主機有多個分片。
在其中的一個區域,我們有一個主服務器、兩個副本並使用半同步復制,在另一個區域中,也有一個偽主服務器和兩個偽副本。
圖片來源:ChaosEngineering: the history, principles, and practice
第一步,我們要需要明確哪些內容分別是已知和未知的:
已知-已知:我們知道,副本如果發生宕機,它將從集群中刪除,然後將從主服務器克隆一個新的副本,並將其添加回集群。
已知-未知:我們已知克隆會發生,因為我們可以通過日志來確認它成功或失敗,但是我們不知道從失敗到將克隆有效地添加回集群所需的時間。
我們知道,副本發生宕機5分鐘後會收到一個警告,但是我們不知道是否應該調整警報閾值以更有效地防止故障發生。
未知-已知:如果我們同時關閉一個集群的兩個副本,我們不知道從現有的主服務器上克隆兩個新副本所需的確切時間。但是我們知道有一個偽主副本和兩個副本。
未知-未知:我們不知道如果關閉A區域中的整個集群會發生什麼,也不知道B區域是否能夠有效地進行故障轉移,因為我們還沒有運行這個場景。
第二步,在明確了已知與未知後,我們設計混沌工程實驗,按照以下順序逐步進行:
已知-已知:關閉一個副本,計算從檢測到關閉、刪除副本、啟動克隆、完成克隆和將克隆添加回集群的時間。在你開始這個步驟之前,把副本從2個增加到3個。報告復制關機故障恢復的平均時間,並按日期和時間細分,以反映高峰時間。
已知-未知:通過上一步,可以知道哪些是「已知-未知」的問題,你就能夠了解從副本發生故障到將克隆添加回集群所需的平均時間,以及知道5分鐘是否是預防嚴重事故的適當警報閾值。
未知-已知:在進行這個實驗之前,將副本的數量增加到4個。同時關閉其中的兩個副本,計算克隆兩個新副本需要多長時間。這個實驗可能會發現未知的問題,例如,主服務器不能同時處理克隆和備份帶來的負載,因此你需要更好地調整副本數量。
未知-未知:關閉整個集群(主副本和兩個副本)。這種失敗可能會導致嚴重的意外發生,但你可能還沒有準備好。在執行混沌實驗之前,請優先考慮處理這個失敗場景的應急工程工作。
4
第一個混沌工程實驗,有何建議?
▌計劃你的第一個實驗
混沌工程中最關鍵的問題之一是「哪里可能出問題?」通過對這個問題的思考和討論,我們可以總結系統潛在的弱點和預期結果。類似於風險評估,這可以讓你對優先級有所把握:哪些潛在問題更有可能發生或後果更嚴重。
作為管理者,你可以讓你的團隊將服務、依賴項(內部和外部)和數據存儲等因素寫下來,這可以讓你對「哪里可能出錯」有初步的認識。當你覺得某一項可能存在問題時,注入故障會是一個好的開始。
▌創建一個假設
你知道哪里可能會出問題,在相應的地方注入了故障。接下來會發生什麼?在實驗實施前先創建一個假設,會是一個很好的團隊思維練習。通過討論這個場景,你可以在運行它之前對預期結果進行假設,比如這個失敗對客戶、企業或對你的依賴項有什麼影響?
▌測量影響
要理解系統在壓力下運行時的行為,需要評估系統的可用性和持久性。你需要擁有一個與用戶相關的關鍵性能指標,例如每分鐘的訂單量,或每秒的流量。
根據經驗,如果你看到這些指標受到影響,則可以停止實驗。接下來是評估失敗本身,在這里你希望驗證(或反駁)你的假設。最後,你需要檢查儀表板和警報,看看是否有意外副作用。
▌回滾計劃
請務必要有一個回滾計劃,以防出現問題;但你也要接受,有時即使是回滾計劃也可能失敗。因此你需要考慮如何扭轉這種影響。
▌完善
在運行第一個實驗之後,你可能會遇到兩個結果之一:驗證了系統對引入的失敗是否具有彈性,或者發現需要修復的問題。這兩個結果都很好。如果是第一種情況,你增強了對系統及其行為的信心;如果是後者,你則在系統導致停機之前發現了問題。▌感受樂趣
混沌工程是一個讓工作更容易的工具。通過主動測試和驗證系統的故障模式,你將減少操作負擔,增加可用性。
在用戶體驗和用戶信息越來越受到重視的當下,停機故障給公司帶來的損失可謂巨大,因此無論是互聯網公司還是傳統行業,都開始將混沌工程的思想納入到風險控制中。
系統故障不可避免,但對系統故障的提前預測與防范是行之有效的應對措施。與其等待下一次代價高昂的停機,不如首先提高系統對潛在風險的「抵抗力」,通過故意破壞,暴露出可能影響系統和客戶的未知問題。
就如同人類要打疫苗才能免除病痛,企業的信息基礎架構安全,也離不開混沌工程。
Reference:Chaos Engineering: the history, principles, and practice, BY Gremlin
題圖來自pexels.com,圖片授權基於:CC0協議,如有侵權,請聯繫我們處理。