- 起源 -
混沌工程是在分佈式系統上進行實驗的學科, 目的是建立對系統抵禦生產環境中失控條件的能力以及信心。由Netflix在2010年底提出,2012開源Chaos Monkey(混亂猴子),中間經過了一系列的演化。具體路線爲:
國內則是阿里在12年內部嘗試使用,經過6年實踐,最後在19.03.28開源了ChaosBlade,目前最新版本ChaosBlade0.6發行於20.05.27。
混沌工程應用場景比如有:
-
提升系統容錯能力以及穩定性
-
評估系統容災紅線
-
驗證雲服務的動態擴展能力
-
驗證監控和告警的有效性以及指標是否全面
-
故障突襲,提升相關人員定位,故障問題的能力
- 混沌工程原則 -
混沌工程原則是混沌工程的原理和設計指導思維。
爲了保障系統在未來不會遭受大規模中斷事故,冒一點可控的風險是值得的。
找到那些本不應該讓系統崩潰的事件的原因,包括那些還從未發生過的事件,保證系統的高可用。
“切爾諾貝利事件”起源一次驗證冷卻劑泵冗餘電源的演習,所以我們需要吸取教訓,且混沌工程的職責就是要理解和降低生產風險,可以爲實驗而具備良好設計的系統可以阻止大規模的生產事故,僅僅影響到少量的用戶。
-
建立穩定狀態的假設。
將系統正常運行時的狀態定義爲系統的“穩定狀態”。
-
多樣化現實世界事件。
我們無法窮舉所有可能事件,但可以儘量多元化現實事件來模擬。
-
在生產環境運行實驗。
-
持續自動化運行實驗。
-
最小化“爆炸半徑”。
混沌工程原則其實是一種反脆弱哲學的軟件實踐,德國哲學家尼采說過:“任何不能殺了我的,只會令我更強大”。混動工程通過模擬現實世界事件去實驗我們的系統,幫助我們的系統在失控的生產環境中保證高可用。
- 混沌實驗 -
一、需求
混沌實驗是混沌工程的落地表現,任何事情都有前提,實驗一樣有自己的前提需求:
-
對什麼做混沌實驗
明確實驗靶點,確定實驗參與者和組件。
-
混沌實驗實施的範圍是是什麼
確定實驗範圍,比如對應的集羣、集羣、對象
-
具體實施什麼實驗
確定實驗匹配條件,建立好匹配規則器
-
實驗生效的匹配條件有哪些
驅動實驗實行,即建立號具體執行的實驗規則
二、混沌實驗模型
由混沌實驗的需求,我們可以抽象出混沌實驗,得到混沌實驗模型:
-
Target:實驗靶點,指實驗發生的組件,例如容器、應用框架(Dubbo、Redis、Zookeeper)等。
-
Scope:實驗範圍,指具體觸發實驗的機器或者集羣等。
-
Matcher:規則匹配器,根據所配置的 Target,定義相關的實驗匹配規則,可以配置多個。
-
RPC 領域的 grpc、Dubbo,可以根據服務提供者提供的服務和服務消費者調用的服務進行匹配。
-
緩存領域的 Redis,可以根據 set、get 操作進行匹配。
-
-
Action:實驗行爲,具體的實驗規則,指實驗模擬的具體場景,Target 不同,實施的場景也不一樣。
-
比如磁盤,可以演練磁盤滿,磁盤IO 讀寫高,磁盤硬件故障等。
-
比如應用,可以抽象出延遲、異常、返回指定值(錯誤碼、大對象等)、參數篡改、重複調用等。
-
三、混沌實驗流程
設計一個混沌實驗的流程如下:
-
選定假設
-
設定實驗的範圍
-
識別出要監控的指標
-
在組織內溝通到位
-
執行實驗
-
分析實驗結果
-
擴大實驗範圍
-
自動化實驗
四、混沌實驗場景案例
-
模擬數據中心的故障
-
強制系統時鐘不同步
-
在驅動程序代碼中模擬I/O異常l模擬服務之間的延遲
-
隨機引發函數拋異常
- 混沌工程 VS 測試 -
混沌工程、故障注入和故障測試在關注點和工具中都有很大的重疊,經過思考後,可以得出以下差別:
-
對象
-
混沌工程側重現實世界意外事件引起的系統不穩定。l測試偏重於系統自身的流程不穩定性。
-
-
目標
-
混沌工程側重實踐產生無法預知的信息,幫助我們更好的認識系統,有更多的不確定性。
-
測試更偏重於是否達到預期。
-
-
結果
-
測試主要用來驗證;混沌工程用來探索未知,發現新知識。
-
-
環境
-
混沌工程離生產環境越近越好,而且需要持續自動化運行實驗。比如全鏈路壓測、廣義負載均衡等。
-
測試主要是內部環境自主控制。
- ChaosBlade -
-
ChaosBlade的中文名是“混沌之刃”,是阿里巴巴開源的一款遵循混沌工程原理和混沌實驗模型的實驗注入工具,是MonkeyKing對外開源的項目。建立在阿里巴巴近十年故障測試和演練實踐基礎上,結合了集團各業務的最佳創意和實踐。旨在幫助企業提升分佈式系統的容錯能力,並且在企業上雲或往雲原生系統遷移過程中業務連續性提供保障。
目前支持的場景有:基礎資源、Java應用、C++ 應用、Docker容器以及 Kubernetes平臺。該項目將場景按領域實現封裝成單獨的項目,不僅可以使領域內場景標準化實現,而且非常方便場景水平和垂直擴展,通過遵循混沌實驗模型,實現 chaosblade cli 統一調用。
ChaosBlade 特點
-
場景豐富度高
-
使用簡單,易於理解
-
動態加載,無侵入
-
場景擴展方便
-
支持運行時長設置
ChaosBlade 支持的實驗
-
CPU 滿載
-
網絡丟包 延遲 屏蔽
-
域名屏蔽
-
磁盤填充,磁盤 IO 讀寫負載
-
殺進程
-
刪容器,POD
-
RPC 調用延遲
-
JAVA 方法注入指定異常和設置返回值
ChaosBlade組成
-
chaosblade:阿里巴巴開源的一款簡單易用、功能強大的混沌實驗注入工具;地址爲 https://github.com/chaosblade-io/chaosblade
-
chaosblade-exec-jvml:對 Java 應用實施混沌實驗的 chaosblade執行器;地址爲https://github.com/chaosblade-io/chaosblade-exec-jvm
ChaosBlade模型
-
ExpModelCommandSpec:模型聲明,包含組件名稱和所支持的實驗場景列表。
-
ExpActionCommandSpec:實驗場景,包含場景名稱,場景所需參數和一些實驗規則匹配器
-
ExpFlagSpecl:實驗匹配器定義,包含名字、描述、參數值和是否必要
-
Executorl:執行器,例如如cpu下的fullload
-
expCommand:輸入命令
ChaosBladel文檔 https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
作者介紹 -- 林淮川
畢業於西安交通大學;奈學教育《百萬架構師訓練營》的講師,奈學教育企業級源碼內源負責人,前大樹金融高級架構師;前大樹金融技術委員會開創者;前大樹金融供應鏈金融技術總監;前天陽宏業交易事業部技術主管;多年互聯網金融行業(ToB)經驗。