公司新成立了一個穩定性團隊,20年的重要目標之一就是開展混沌工程。爲了後續更好的開展工做,記錄關於「混沌工程」相關的知識以及工程實踐。git
內容來源:《混沌工程:Netflix系統穩定性之道》摘錄以及我的思考總結。。。。。。github
概要docker
定義:主動發現系統中脆弱點的一整套方法論。安全
目的:如何讓系統在不肯定性中獲益?網絡
接受「系統越複雜,越脆弱」的事實,讓系統在每一次失敗中獲益,而後不斷進化。架構
在實踐中,用一系列的實驗來真實的驗證系統在各種故障場景下的表現,經過頻繁大量的實驗,使得系統自己的「反脆弱性」持續加強,讓組織創建對系統抵禦生產環境中失控條件的能力以及信心。框架
初衷:經過實驗性的方法,讓人們創建複雜分佈式系統可以在生產中抵禦事件能力的信息。運維
出現:最先由Netflix的技術團隊提出,現已經演變成計算機科學的一門新興學科,即「混沌工程」。分佈式
現狀:目前業內的認知和實踐積累較少,但它其實是一種提升技術架構彈性能力的複雜技術手段。微服務
挑戰:服務規模不斷增加,服務間依賴帶來的不肯定性指數級增加。軟件可用性面臨兩大挑戰:
1)自身複雜度激增;
2)開發者引入複雜性的同時對風險的低估和忽視;
方法:經過一系列可控實驗和執行實驗原則,揭示出系統中隨時發生的各種事件是如何逐步致使系統總體不可用的。
書籍:《混沌工程:Netflix系統穩定性之道》
工具
Chaos Dingo:支持在Azure相關服務上進行實驗。
Chaos-http-proxy:向http注入故障的代理服務工具。
Tugbot:可在基於docker的生產環境中進行測試的框架。
Chaos Lambda:辦公期間可隨機關閉AWS ASG節點的工具。
Blockade:基於docker,可測試網絡故障和網絡分區的工具。
Pumba:基於docker的混沌工程測試工具以及網絡模擬工具。
Simoorg:LinkedIn開發的故障注入工具,以擴展,不少關鍵組件可插拔。
Chaos Lemur:測試高可用性系統彈性的工具,可本地部署,容許隨機關閉BOSH虛擬機。
Monkey-Ops:Go語言實現,可在OpenShift V3.X上部署並在其中生成混沌工程實驗。可隨機中止OpenShift組件。
ChaosBlade:阿里開源的一款遵循混沌工程原理和混沌實驗模型的實驗注入工具,是內部MonkeyKing對外開源的項目,結合了阿里各業務的最佳創意和實踐。
背景
由不少微服務組成的分佈式系統中,永遠難以全面掌握什麼事件會致使系統局部不可用,甚至全面崩潰。主要因素:
1)系統架構演進:服務集羣→分佈式→微服務→容器化(K8S&docker)→上雲;
2)版本迭代增速:CICD、敏捷、devops、ABtest;
3)用戶需求變動:複雜化、多樣化、快速化、小衆化;
對系統的要求:擴展性、穩定性、彈性能力、容錯災備能力;
軟件系統現狀:系統複雜性提升、問題定位成本高;
要解決的問題:生產環境下的分佈式系統在面對失控條件時依然具有較強的「可觀測性」和故障恢復能力;
主要驗證方式:故障注入;
開展「混沌工程」的意義
開發者的能力和認知水平有邊界,不可能全部的細節均可以預估到,系統很脆弱,各類潛在不可預期的突發事件在所不免。
咱們須要在異常觸發以前,儘量地去篩選出會致使出現有異常問題的、容易形成故障的、系統中明顯裂痕的環節,這也是混沌工程所肩負的意義。
能讓複雜系統中根深蒂固的混亂和不穩定性浮出水面,讓咱們更全面瞭解系統中固有的現象,而後進行及時修復、加固和防患於未然,才能打造更具彈性的軟件工程系統。
思考
一、設計良好的系統,須要考慮哪些因素?
可靠性、安全性、可擴展性、可定製化、可伸縮性、可維護性、用戶體驗等。
二、混沌工程解決什麼問題?
生產環境下,分佈式系統在面對失控條件時是否具有較強的「可觀測性」和故障恢復能力。
三、開展混沌工程要考慮的維度有哪些?
1)創建穩定狀態的假設(清晰可衡量的指標)
2)用多樣的生產事件作驗證(多樣性下降偏差)
3)在生產環境作驗證(真實場景)
4)自動化開展實驗(持續運行)
5)控制最小化爆炸半徑(影響範圍)
四、Netflix開展混沌工程總結的三點經驗
1)創建面向失敗設計和擁抱失敗的技術文化(技術文化)
思想上,引入混沌工程的核心是經過引入一些風險去暴露已有的不易發現的問題,而不是創造問題。這樣有助於問題的發現和處理,下降潛在故障帶來的影響。
2)定義一個清晰可度量的目標(定義目標)
前期:對歷史故障的復現率以及解決率,確保故障改進的有效性;
中期:監控發現率,驗證故障發現能力的全面性和監控的完備程度;
後期:故障的「發現-定位-恢復」市場這種綜合性指標;
3)在控制風險的前提下不斷提高混沌工程效率(技術推廣)
先從簡單的場景開始嘗試,逐漸增長組織對系統的信心(要明白準備工做比落地執行更重要)。
混沌工程是一種實踐思想,方法論,自己不綁定任何工具或者技術。不過在進行推廣和實施時,考慮到真實性、容錯性、開發成本、運維效率等因素,建議複用成熟的開源組件或者商業化工具。