聊聊混沌工程
這是鼎叔的第五十四篇原創文章。行業大牛和剛畢業的小白,都可以進來聊聊。
歡迎關注本專欄和微信公眾號《敏捷測試轉型》,大量原創思考文章陸續推出。
混沌工程是一門新興學科,它不僅僅只是個技術活動,還包含如何設計能夠持續協作的混沌實驗。它由Neflix首先在實踐中發現了混沌工程的商業價值,通過構建更有韌性的系統來抵御海量組件系統的意外失效。本文還會聊聊混沌工程的概念澄清,原則,投資回報和成熟度模型。
本文的內容參考了《混沌工程-復雜系統韌性實現之道》,作者是Casey Rosenthal,Nora Jones。
Neflix的混沌猴
Neflix的高績效文化體現在管理層和技術人員的有趣協作,管理者不會告訴技術人員要做什么,而是確保他們了解要解決什么問題,并信任技術工程師,讓他們決定工作的完成方式。
為了解決大型數據中心的實例無故消失問題,工程師嘗試了各種方法,最終只有混沌猴這種方法保留下來。原理非常簡單,遍歷集群列表,從每個集群中隨機選一個實例,在每個工作日的某個時間點將其關閉且不會發出警告。工程師只有解決了問題才能進行其他工作,不管是增加冗余,還是增加自動化容量伸縮,或是架構層面設計優化,都帶來了可觀的成效。
不幸的是,隨機性混沌注入方法,在分布式系統上的效果都不好,故障的組合空間巨大,且并不孤立。隨機方法也無法告訴我們實驗的覆蓋情況,應該進行多長時間才能得出結論。
替代隨機搜索的方法,就是利用系統專家的領域知識來推動實驗探索,利用之前實驗觀察形成新的假設并逐步完善。專家對故障注入進行篩選,決定哪些實驗不需要進行,避免重復。專家還會決定實驗的運行順序,盡可能提高知識增加的速度。專家也需要可觀測的基礎設施,越豐富越好。
混沌猴后來升級為混沌金剛,使某個AWS區域關閉,驗證AWS區域性故障的解決方案,大幅提升了組織內部對于故障的處理速度。后面即使發生多起停機事故,混沌金剛使用的區域故障轉移機制都發揮了作用。
混沌工程由此被定義:它是分布式系統上進行實驗的學科,目的是建立該系統能夠承受生產環境的動蕩條件的信心。不需要建立對系統的信心,就不需要混沌工程。
混沌工程通過提供可能超出“快樂路徑”(即系統構建的默認路徑,沒有異常或錯誤情況)的各種條件和變化參數,來做到這一點。
如今混沌工程已經形成了強大的專業社區。
復雜系統
混沌工程這門科學要尋找系統存在弱點的證據,它們會隱藏在系統的本質復雜性中。復雜系統因為非線性導致不可預測,必然會導致不良結果。系統內的部件所發生的變化會導致系統輸出發生指數級變化。輸出難以模擬或建模,導致傳統的探索系統安全性的方法不夠充分。
復雜系統中,不同服務模塊各自都有合理的設計決策和監控處理機制,但仍然會出現難以意料的崩潰。
比如場景一,少量用戶的消息異常不斷重試,可能導致服務降級,進而觸發更大范圍的重試風暴,導致服務不可用。
場景二,導入的程序庫出現的內存泄漏,可能會隨著服務請求數量的增加而緩慢增長,直到影響大量實例的錯誤率,導致局部停機。
面對復雜性,人月神話(聊聊沒有35歲焦慮的《人月神話》)將其分類為偶然復雜性和本質復雜性,前者是在資源有限的項目中編寫代碼,必然產生各種債務-代碼劣化、含糊的契約、廢棄的代碼路徑、不清晰的變量名等。編寫軟件和理解軟件如何失效,完全是兩件不同的事情。
沒有可持續的方法來解決偶然復雜性,甚至新系統會做得更加復雜。對于本質復雜性,只要添加新功能就會增加。
既然無法避免復雜性,那就接納它,學會如何應對,而混沌工程就是最有效可行的利器。推薦兩個應對復雜系統的模型。
一 動態安全模型
這模型有三個屬性:經濟性(投入的成本),工作量和安全性。工程師對成本和工作量有邊界直覺,但是對安全性缺乏直覺。安全事故通常都是意料之外的,而工程師只會對能看到的地方進行優化。混沌工程就是培養工程師安全性直覺的,進而默默地改進行為,讓系統更有韌性。
二 經濟支柱模型
復雜性有四個經濟支柱:狀態,關系,環境,可逆性。
一個研發組織控制某個支柱的程度,能反映出組織應對競爭性生產過程的復雜性的成熟度。一個汽車大廠可以控制產品狀態(有限的款式),關系(上下游產業鏈的供貨關系),環境(對外部法規的影響),但沒法控制可逆性,汽車制造容易回退難。
一個應用程序的功能(狀態)大多不斷在增加,而無法簡化。組件關系和人際關系都在復雜化。大多軟件公司都沒有影響環境的規模化能力。只有可逆性是軟件團隊可以大放異彩的支柱(即不斷修改完善軟件)。
而混沌工程實驗能夠揭示系統哪些方面違背了“可逆性”。
混沌工程的原則
混沌工程的通用解釋,是“促進發現系統弱點的實驗”,分為四個步驟
1 先定義“穩態”(steady state),系統行為正常時有哪些可以度量的輸出。
例如,在XXXX情況下,用戶依然擁有良好的體驗,表現在XXX數據上。
在XXX事件發生時,技術人員會得到XXX提醒。
2 建立假說,對照組和實驗組都會持續這種穩態。
3 引入體現真實事件的變量。選擇變量常見的誤區是,工程師的選擇標準經常是容易執行的,基于自身體驗而不是用戶體驗的。有些“異常事件”在現實世界不太可能發生,這就不是好的引入變量。
4 通過在對照組和實驗組之間尋找穩態差異來推翻假說
混沌工程原則提供了五項高級實踐及黃金標準:建立穩態行為假說,多樣化引入現實世界的事件,在生產環境實踐,持續運行自動化實驗,最小化爆炸半徑。
為了給真正關心的生產環境建立信息,高級的混沌工程都在生產環境發生,但是初始階段先在準生產系統上實驗也是有意義的。
自動化提供了規模化搜索的方法,比人手動操作,能覆蓋更多的實驗集;隨著時間的推移能低成本地持續驗證經驗假設,及時發現系統的變化。
設計更安全的實驗方法,將對生產環境中用戶流量的負面影響降到最低,還帶來加強信號檢測效果的好處。
聚焦用戶體驗是所有高級原則的基礎。
對混沌工程的常見誤解
一 實驗和測試是不同的
實驗并不知道如何斷言,而是通過假說的驗證或推翻來得到新知識。源于應對復雜系統問題,所以混沌工程更多體現“未知的實驗性”而非“已知的測試性”,主張驗證有效性,而不是檢查如何工作。
二 混沌工程并非人們誤解的“搞破壞”
單純搞破壞,很難做到減小爆炸半徑,和漏洞的批判性思考。混沌工程最終的價值是修復生產環境的漏洞。
三 很多人認為塔勒布的《反脆弱》理論和混沌工程在本質上是一樣的。
實際上兩個流派分歧很多,反脆弱缺乏軟件工程學的同行評審和理論基礎,給出的解決手段(如增加冗余)可能會帶來更多風險。反脆弱希望給系統引入混沌,而混沌工程希望發現復雜系統的固有混沌。
四 軟件接口設計不規范等問題能否通過混沌工程來發現
接口契約不匹配的協商解決,是開發過程的一部分,無需納入混沌工程來解決,這些已知屬性問題最好通過軟件測試解決。混沌實驗主要為不確定的自動化行為提供信心,它發現的BUG往往是多個細微邏輯錯誤的組合,以及時間相關性故障。
注意,被選定實驗的特定服務及其依賴服務,如果存在已知的關鍵缺陷,要先修復后再進行實驗,否則我們不能從實驗中學到確定的新東西。
混沌工程的投資回報
“只有事故真的發生了,才能有故事可講。”-- John Allspaw
混沌工程是一門務實的學科,旨在為企業提供價值。但是如何證明混沌工程的回報是令人困惑的。
系統可用性指標的上升,是否應該歸功于混沌工程實踐呢?混沌工程觸發的改進,傾向于給其他業務增加壓力,比如犧牲了發布速度,那如何確定收益率呢?
Kirkpatrick模型提供了一種評估投資回報率的方法,原本用于教學培訓領域,它把評估分解為四個遞進的級別:反應(混沌工程示范對受訓者有幫助,是否支持維持或加大該實驗),學習(證明并列舉團隊學到了什么),轉移(把知識轉化為實踐,發生了行為變化,提高了協作效率,提高了應急成熟度),結果(混沌工程的總成本,與商業結果價值進行比較)。每一級是否評價為積極,就展示了對應的投資回報。
混沌成熟度模型
成熟度模型橫軸是采用度,縱軸是復雜性。
“采用度”考慮這幾個因素:接受者,參與者,采用門檻(是否有觀測工具,積極討論的共識,經得起考驗的假說,一致的響應行動),采用障礙(業務的擔心,合規性,從未發生過事故,難以衡量回報率)
“復雜性”,會隨著實驗的發展而提升,如下所示:
1 Game Day,實踐試水,復雜性低,但是消耗大量人力,無法在大量服務上規模化執行。
2故障注入框架。工具可以讓多個團隊進行實驗,進行更多跨功能性的學習。
3 實驗平臺。滿足更好實驗的需求,在對照組和變量組進行安全對比,控制最小爆炸半徑。每個實驗都要被平臺監控。
4 平臺自動化。完全自動化進行的混沌工程,包括實驗的創建、優先級排序、執行和推翻/終止。平臺能夠“自我反省”,只自動運行哪些對實驗假說有可量化期望的實驗。
平臺還可以進一步進行能力升級,如控制“混沌預算”,使用組合實驗變量構建實驗,自動修復漏洞。
被引入的實驗變量也可以不限于基礎設施層級,還可以是應用程序邏輯層的變量-比如給服務返回出乎意料的響應。
??????基于混沌成熟度繪制的表格,就可以看到本組織所處的位置,確定如何技術投資的路徑,達到高復雜性與高參與度,讓混沌工程創造最大的價值。
下一篇,我們詳細介紹各大企業實踐混沌工程的優秀流程,經驗教訓,人和組織的能力提升,從中學習到了哪些洞見。
總結
- 上一篇: AI自动播——AI虚拟主播帮你实现24小
- 下一篇: war包方式部署solo博客