一、什么是混沌工程
混沌工程是在分布式系統上進行實驗的學科,目的是建立對系統抵御生產環境中失控條件的能力以及信心。
混沌工程,是一種提高技術架構彈性能力的復雜技術手段,旨在將故障扼殺在襁褓之中,也就是在故障造成中斷之前將它們識別出來。通過主動制造故障,
測試系統在各種壓力下的行為,識別並修復故障問題,避免造成嚴重后果。
二、混沌工程和故障注入、傳統測試的區別
兩者本質上是思維方式的不同。
1、故障注入首先要知道會發生什么故障,然后一個一個注入,然而在復雜分布式系統中,想要窮舉所有可能的故障,本身就是奢望。
2、傳統測試,旨在給定一個特定的條件,系統會輸出一個特定的二元結果,它僅僅是對已知的系統屬性可能的取值進行測驗。
3、混沌工程的思維方式是主動去找故障,是探索性的。雖然按計划做好了降級預案,但是關閉節點時卻引發了上游服務故障,進而引發雪崩,這不是靠故障注入或預先計划能發現的。
4、混沌工程,旨在幫助我們獲得更多的關於系統的新認知的實驗方法,而且通常還能開辟出一個更廣袤的對復雜系統的認知空間。
5、混沌工程實驗的可能性是無限的,根據不同的分布式系統架構和不同的核心業務價值,實驗可以千變萬化。
三、混沌工程的先決條件
1、團隊具備面向失敗設計(可以使系統暴露出已有問題的設計)和擁抱失敗的技術文化。
2、系統具備一定的彈性來應對破壞性演練中的一些異常事件。
3、具備一套破壞性演練的環境:理想實踐是直接在生產環境中進行實驗,其次是在離生產環境越近的地方進行實驗(如預發環境)。如在預發環境進行演練,確保預發和生產環境保持一致很重要,只有這樣才能體現演練意義。
4、具備配套的監控系統,用於判斷系統當前的各項狀態。如果沒有對系統行為的可見能力,那么也就無法從實驗中得出有效的結論。
四、混沌工程的五大原則
1、建立一個圍繞穩定狀態行為的假說
“穩定狀態”是指系統正常運行時的狀態。而系統的穩定狀態可以通過一些指標來定義,當指標在測試完成后,無法快速恢復穩態要求,可以認為這個系統是不穩定的。
指標可以分為系統指標和業務指標。系統指標(如CPU 負載、內存使用情況、網絡 I/O等)有助於幫助我們診斷性能問題。但在混沌工程中,業務指標通常比系統指標更有用,因為它們更適合衡量用戶體驗或運營。如果不能直接獲取和業務直接相關的指標,可以暫時先利用一些系統指標。
2、多樣化真實世界的事件
每個系統只要運行時間足夠長,都會受到不可預測的事件和條件的影響。要徹底阻止這些對可用性的各種威脅是不可能的,只能盡可能減輕這些威脅。所以不需要窮舉所有可能對系統造成改變的事件,只需要注入那些頻繁發生且影響重大的事件,同時要足夠理解會被影響的故障域,權衡引入的成本和復雜度。
常見事件:
- 硬件故障
- 功能缺陷
- 狀態轉換異常(例如發送方和接收方的狀態不一致);
- 網絡延遲或隔離
- 上行或下行輸入的大幅波動以及重試風暴
- 資源耗盡
- 服務之間的不正常的或者預料之外的組合調用
- 拜占庭故障
- 資源競爭條件
- 下游依賴故障
3. 在生產環境中運行實驗
根據環境與流量模式的不同,系統運行效果亦將受到影響。為了保證系統運行方式的真實性以及同現有部署系統間的關聯性,混沌工程原則強烈建議直接面向生產流量進行實驗。即便不能在生產環境中執行實驗,也要盡可能的在離生產環境最接近的環境中運行。
4. 持續自動化運行實驗
系統實際上,當今的系統越來越復雜,且處在一個無時不在變化的狀態,這意味着我們無法預先地知道生產環境的哪些變動會改變混沌工程實驗的結果。所以需要混沌工程的自動化工具和平台,以期不斷降低創建新實驗的門檻,並能夠完全自動運行這些實驗。
5. 最小化爆炸半徑
混沌實驗通過很多方法來探尋故障會造成的未知的、不可預見的影響,關鍵在於如何讓這些薄弱環節曝光出來而不會意外造成更大規模的故障。我們稱之為最小化“爆炸半徑”。
一般先只作用於很少的用戶之上,當自動化實驗成功之后,運行小規模的擴散實驗,再進行小規模的集中實驗,最后就是大規模無自定義路由的實驗。擴大實驗范圍的目的是進一步暴露小范圍實驗無法發現的一些問題。
根據對用戶的影響度判斷,隨時遏制和停止實驗的能力是必備的,可以避免造成更大的危機。
五、混沌成熟度模型
混沌工程成熟度模型(CMM)用於評估當前混沌工程項目成熟度狀態。CMM 包含熟練度(Sophistication)和接納度(Adoption)。缺乏熟練度時,實驗會比較危險、不可靠、且有可能是無效的。缺乏接納度時,所做的實驗就不會有什么意義和影響。要發揮混沌工程項目的最大效果需要在這兩個維度上保持一定的平衡。
1、混沌工程實驗熟練度等級
熟練度可以反映出,在你的組織中混沌工程項目的有效性和安全性。項目各自的特性會反映出不同程度的熟練度,有些完全不具備熟練度,而有些可能具備很高的熟練度。
2、混沌工程實驗接納度等級
接納度用來衡量混沌工程實驗覆蓋的廣度和深度。接納度越高,暴露的脆弱點就越多,你對系統的信心也就越足。
六、混沌工程的目標——韌性架構
“故障是注定的,隨着時間的流逝,一切終將歸於失敗”。必須接受故障發生是新常態的想法,處在部分故障的系統正常運行是完全可行的,這就需要架構本身具備韌性。
韌性架構的重要特征:
七、混沌工程實踐
完整的混沌工程實驗是一個持續性迭代的閉環體系,大致分為以下幾個步驟:
八、開源工具
Chaos Monkey:通過關停一個或多個虛擬機來模擬服務實例失效的工具。(https://github.com/Netflix/chaosmonkey)
Simian Army:猿軍工具集,除Chaos Monkey外,還包括Chaos Kong、Latency Monkey、Conformity Monkey、Security Monkey等。(https://github.com/Netflix/SimianArmy/tree/master/src/main/java/com/netflix/simianarmy)
ChaosBlade:是阿里巴巴開源的一款遵循混沌工程實驗原理,提供豐富故障場景實現,幫助分布式系統提升容錯性和可恢復性的混沌工程工具,可實現底層故障的注入,特點是操作簡潔、無侵入、擴展性強。(https://github.com/chaosblade-io/chaosblade)
ChaoMesh:是PingCap團隊研發的一款用於測試kubernetes環境的工具。通過人為地在集群中注入故障來檢測集群對故障的處理以及恢復能力。(https://github.com/chaos-mesh/chaos-mesh)