轉自: https://github.com/wizardbyron/principlesofchaos_zh-cn
混沌工程是在分布式系統上進行實驗的學科, 目的是建立對系統抵御生產環境中失控條件的能力以及信心。
大規模分布式軟件系統的發展正在改變軟件工程。作為一個行業,我們很快采用了提高開發靈活性和部署速度的實踐。緊跟着這些好處的一個緊迫問題是:我們對投入生產的復雜系統中有多少信心?
即使分布式系統中的所有單個服務都正常運行, 這些服務之間的交互也會導致不可預知的結果。 這些不可預知的結果, 由影響生產環境的罕見但破壞性的真實事件復合而成,令這些分布式系統存在內在的混沌。
我們需要在異常行為出現之前,在整個系統的范圍內找出這些弱點。 系統弱點包括以下形式: 當服務不可用時的不正確回退設置;不當的超時設置導致的重試風暴;由於下游依賴項流量過載導致的服務中斷;單點故障時的級聯失敗等。我們必須主動的發現這些重要的弱點,在這些弱點通過生產環境暴露給我們的客戶之前。我們需要一種方法來管理這些系統固有的混沌, 通過增加的靈活性和速率以提升我們對生產環境部署的信心, 盡管系統的復雜性是由這些部署所導致的。
基於經驗和系統的方法解決了分布式系統在規模增大時引發的混亂問題, 並以此建立對這些系統抵御現實條件的能力的信心。通過在受控實驗中觀察分布式系統的行為來了解它的特性,我們稱之為混沌工程。
混沌工程實踐
為了具體地解決分布式系統在規模上的不確定性,可以把混沌工程看作是為了揭示系統弱點而進行的實驗。這些實驗遵循四個步驟:
- 首先,用系統在正常行為下的一些可測量的輸出來定義“穩定狀態”。
- 假設這個在控制組和實驗組都會繼續保持穩定狀態。
- 在實驗組中引入反映真實世界事件的變量,如服務器崩潰、硬盤故障、網絡連接斷開等。
- 通過控制組和實驗組之間的狀態差異來反駁穩定狀態的假說。
破壞穩態的難度越大,我們對系統行為的信心就越強。如果發現了一個弱點,那么我們就有了一個改進目標。避免在系統規模化之后被放大。
高級原則
以下原則描述了應用混沌工程的理想方式,這些原則基於上述實驗過程。 對這些原則的匹配程度能夠增強我們在大規模分布式系統的信心。
建立一個圍繞穩定狀態行為的假說
要關注系統的可測量輸出, 而不是系統的屬性。 對這些輸出在短時間內的度量構成了系統穩定狀態的一個代理。 整個系統的吞吐量、錯誤率、延遲百分點等都可能是表示穩態行為的指標。 通過在實驗中的系統性行為模式上的關注, 混沌工程驗證了系統是否正常工作, 而不是試圖驗證它是如何工作的。
多樣化真實世界的事件
混沌變量反映了現實世界中的事件。 我們可以通過潛在影響或估計頻率排定這些事件的優先級。 考慮與硬件故障類似的事件, 如服務器宕機、軟件故障 (如錯誤響應) 和非故障事件 (如流量激增或縮放事件)。 任何能夠破壞穩態的事件都是混沌實驗中的一個潛在變量。
在生產環境中運行實驗
系統的行為會依據環境和流量模式都會有所不同。 由於資源使用率變化的隨時可能發生, 因此通過采集實際流量是捕獲請求路徑的唯一可靠方法。 為了保證系統執行方式的真實性與當前部署系統的相關性, 混沌工程強烈推薦直接采用生產環境流量進行實驗。
持續自動化運行實驗
手動運行實驗是勞動密集型的, 最終是不可持續的,所以我們要把實驗自動化並持續運行。 混沌工程要在系統中構建自動化的編排和分析。
最小化爆炸半徑
在生產中進行試驗可能會造成不必要的客戶投訴。雖然對一些短期負面影響必須有一個補償, 但混沌工程師的責任和義務是確保這些后續影響最小化且被考慮到。
混沌工程是一個強大的實踐, 它已經在世界上一些規模最大的業務系統上改變了軟件是如何設計和工程化的。 相較於其他方法解決了速度和靈活性, 混沌工程專門處理這些分布式系統中的系統不確定性。 混沌工程的原則為我們大規模的創新和給予客戶他們應得的高質量的體驗提供了信心。