混沌工程實踐

語言: CN / TW / HK

一、混沌工程簡介

1、什麼是混沌工程?

混沌工程的概念很早就存在,但是直到 2012 年Netflix 公司才讓外界更多夥伴知曉“混沌”一詞。為了更好地推廣混沌工程,Netflix 公司引入了“一隻猴子(Chaos Monkey)”。試想如下場景:一隻猴子平日裡安安靜靜,突然某天開始在系統裡肆意搗亂,作為工程師要做的一件事情就是逮住這隻猴子,阻止它繼續搗亂。這大概就是混沌工程想要表達的意思。

簡單來說混沌工程是一個工程學科,這就意味著需要做實驗。通過設計並進行混沌實驗,觀察系統對各類故障的真實反應,以此來完善保證系統的穩定性。混沌工程是一種提高技術架構彈效能力的複雜技術手段,是一種可試驗的、基於系統的方法,用於處理大規模分散式系統中的混亂問題。

2、混沌工程可以達成什麼樣的目的?

混沌工程被描述為在分散式系統上進行實驗的學科,目的是在生產環境中測試分散式系統在面對失控條件時是否具備較強的“可觀測性”和故障恢復能力,建立對系統承受生產環境中極端條件能力的信心。

3、混沌工程可以帶來哪些價值與意義?

混沌工程通過主動製造故障,測試系統在各種壓力下的行為,識別並修復故障問題,避免造成嚴重後果,提高系統健壯性。此外混沌工程能讓複雜系統中根深蒂固的混亂和不穩定性浮出水面,讓我們更全面瞭解系統中固有的現象並進行及時修復加固,防患於未然,打造出健壯的分散式系統。

二、混沌工程實施原則

  • 建立一個圍繞穩定狀態行為的假設
  • 多樣化真實世界的事件
  • 在生產環境中執行實驗
  • 持續自動化執行實驗
  • 最小化爆炸半徑

三、混沌工程應用場景

  • 提升系統的容錯能力,提高穩定性
  • 評估系統容災紅線
  • 驗證雲服務、雲資源的動態擴容能力
  • 驗證監控、告警的有效性和問題處理流程是否完善
  • 故障突襲,提升相關人員定位、恢復問題的能力

四、混沌工程工具對比

五、混沌工程實踐

1、模擬Pod故障

PodChaos 是 Chaos Mesh 中的一種故障型別。通過建立 PodChaos 實驗,可以模擬指定 Pod 或容器的故障場景。目前,PodChaos 支援以下故障型別:

  • Pod Failure:將故障注入到指定的 Pod 中,使該 Pod 在一段時間內不可用
  • Pod Kill:殺死指定的 Pod。為了保證 Pod 能夠成功重啟,需要配置 ReplicaSet 或類似的機制
  • Container Kill:殺死目標 Pod 中的指定容器。從下圖znbase的pod變化可以看出,在加入擾動後,pod從running狀態變為pending狀態,而後又恢復為running狀態

2、模擬網路故障

NetworkChaos 是 Chaos Mesh 中的一種故障型別。通過建立 NetworkChaos 實驗,可以模擬叢集的網路故障場景。目前,NetworkChaos 支援以下故障型別:

  • 分割槽:網路斷開和分割槽
  • 網路模擬:網路條件差,如高延遲、高丟包率、資料包重排序等
  • 頻寬:限制節點之間的通訊頻寬。在注入網路丟包的擾動後,當丟包率較低時,pod狀態維持在running狀態;當丟包率較高時,pod處於異常狀態。

3、模擬壓力場景

Chaos Mesh 提供了 StressChaos 實驗來模擬容器內的壓力場景,分為記憶體壓力實驗和cpu記憶體實驗。可以調整壓力引數測試資料庫的健壯性。

4、模擬DNS故障

DNSChaos 用於模擬錯誤的 DNS 響應。例如,DNSChaos 可以在接收 DNS 請求時返回錯誤或返回隨機 IP 地址。

5、模擬HTTP錯誤

HTTPChaos 是 Chaos Mesh 提供的一種故障型別。通過建立 HTTPChaos 實驗,可以模擬 HTTP 請求和響應處理過程中的故障場景。目前,HTTPChaos 支援模擬以下故障型別:

  • abort: 中斷連線delay: 在請求或響應中注入延遲
  • replace: 替換 HTTP 請求或響應訊息中的部分內容
  • patch:向 HTTP 請求或響應訊息新增附加內容

6、模擬檔案I/O故障

IOChaos 是 Chaos Mesh 中的一種故障。通過建立 IOChaos 實驗,可以模擬檔案系統故障的場景。目前,IOChaos 支援以下故障型別:

  • latency: 延遲檔案系統呼叫
  • fault: 返回檔案系統呼叫的錯誤
  • attrOverride: 修改檔案屬性
  • mistake: 使檔案讀或寫錯誤的值