本篇來自于本人6月-7月參加的“DevOps案例深度研究”活動Netflix案例研究的第五部分,詳細介紹了Netflix的混沌工程。
經過一個月的戰斗,四個版本的迭代,Netflix戰隊最后交付了讓所有人滿意的戰果,并獲得了全場唯一的案例研究最佳小組獎杯。感謝我們的戰友,還有指導老師,姚冬老師和徐磊老師。
Netflix實施混沌工程的背景
08年Netflix決定把它的業務遷移到aws上,從自身運維的角度考慮,它有很多擔憂的地方。
- 很長時間內有兩套系統在同時運行,運維的復雜度更高了。
- NetFlix的用戶量已經達到了1億,對應用穩定性依賴很高,如果出現故障對用戶的影響非常大,甚至是致命的。
- 它的業務不斷復雜,引入微服務架構,對應用的高可用性要求越來越高。
- 生產環境非常復雜,是多樣性的,很難在測試環境中完全模擬生產的狀態。
因此Netflix決心探索一種在生產環境驗證應用高可用性的一種方法,這就是現在大家所熟知的混沌工程。
混亂工程的發展
- 2010年,搗亂猴子誕生
- 2011年,猴子軍團,有了更多場景下的工具集
- 2012年,開源了搗亂猴子的代碼,建立社區,影響了越來越多的公司混沌工程的發展
- 2014年,NetFlix創建了新的工作角色,混沌工程師,代表了NetFlix將混沌工程融入了公司的運維文化中
- 2015年,NetFlix與社區正式提出混沌工程原則,從此混沌工程不只是一些工具的集合,而有了一套理論支撐
- 2016年,NetFlix前員工Kolton Andrus創立了Gremlin,正式將混沌實驗工具商用化,可以看到混沌工程影響著越來越多的企業。
- 2017年,Chaos Monkey 2.0
從一只猴子,發展成龐大的猴子軍團,是NetFlix在生產實踐中不斷探索與不斷進化的結果。
NetFlix猴子軍團
NetFlix猴子軍團包括很多工具:
- Chaos Monkey,搗亂猴子,可以隨機關閉生產環境中的實例,確保網站系統能夠經受故障的考驗,同時不會影響客戶的正常使用。
- Latency Monkey,延遲猴子,在RESTful服務的調用中引入人為的延時來模擬服務降級,測量上游服務是否會做出恰當響應。通過引入長時間延時,還可以模擬節點甚至整個服務不可用。
- Conformity Monkey,一致性猴子,查找不符合最佳實踐的實例,并將其關閉。例如,如果某個實例不在自動伸縮組里,那么就該將其關閉,讓服務所有者能重新讓其正常啟動。
- Doctor Monkey,醫生猴子,查找不健康實例的工具,除了運行在每個實例上的健康檢查,還會監控外部健康信號,一旦發現不健康實例就會將其移出服務組。
- Janitor Monkey,守衛猴子,查找不再需要的資源,將其回收,這能在一定程度上降低云資源的浪費。
- Security Monkey,安全猴子,這是Conformity Monkey的一個擴展,檢查系統的安全漏洞,同時也會保證SSL和DRM證書仍然有效。
- 10-18 Monkey,本地化猴子,進行本地化及國際化的配置檢查,確保不同地區、使用不同語言和字符集的用戶能正常使用Netflix。
- Chaos Gorilla,搗亂大猩猩,Chaos Monkey的升級版,可以模擬整個Amazon Availability Zone故障,以此驗證在不影響用戶,且無需人工干預的情況下,能夠自動進行可用區的重新平衡。
- Chaos Kong,搗亂金剛,Chaos Gorilla的升級版,可以模擬整個Region的故障。
這些工具向我們展示了NetFlix的一套方法論,混沌工程并不是一些測試工具的集合,而是一種思想:在生產實踐中遇到問題時,利用混沌工程的思想,實施自己的一些混沌實踐,引入新的猴子。相信以后會有越來越多的猴子加入到猴子軍團。
使用 Simian Army 進行混沌工程實驗,看起來似乎已經很完美。在生產上做這樣不可控的實驗,是很危險的。
混沌工程的原則
引入混沌實踐時需要了解混沌工程的五大原則。
- 建立穩定狀態的假設。
在做混沌工程實驗的時候,首先得確定需要測試的指標已經做了高可用的工作,才能進行驗證指標對業務的是否有影響。如果沒有做好高可用工作,而引入混沌工程實驗的話,對業務而言將會是一聲災難。 - 多樣化現實世界事件
不能夠憑空想像出一些事件來驗證,而是引入那些真實存在的,頻繁發生的,且影響重大的事件。對我們而言給這些事件做混沌實驗才具有價值。如磁盤故障、網絡延時、主機宕機等。 - 在生產環境運行實驗
盡量在類生產環境中進行測試,生產環境的多樣性是任何其它環境無法比擬的。混沌工程的價值就是保證生產上的業務連續不中斷。 - 持續自動化運行實驗
實施混沌工程實驗一般最開始是人工手動操作,當我們對業務有足夠的信心時,要把混沌實驗做成持續自動化。在版本升級、不斷迭代的過程中,持續不斷自動化地做驗證,最大程序保證業務的連續性驗證。 - 最小化影響范圍
做混沌工程的意義就是保證生產上的業務。在我們實施混沌實驗時也必須保證對線上業務影響最小。在實施實驗時,從小范圍開始,不斷擴大范圍,避開高風險時段,如選擇業務量最小的時候實施實驗。
混沌工程實踐步驟
有了這些原則,就可以根據業務的真實場景設計混沌工程實驗。
在真實展開實驗時分為兩個階段:準備階段、執行階段。
- 準備階段:
- 確認本次實驗需要驗證的目標。遵循建立穩定狀態的假設、多樣化現實世界事件的原則。例如:Redis的超時不會對系統影響。代碼中已經對Redis超時的情況做了相關的工作,保證業務的可靠。實驗只是用來測試驗證。
- 選擇實驗范圍。遵循對線上業務影響最小、盡量與生產環境相近的原則。例如先測試環境驗證,生產環境選擇最小量用戶驗證。
- 確認監控指標。例如:訂單成交量、應用請求響應時間、應用響應錯誤率,做好監控實時查看狀態。
- 團隊成員溝通。遵循最小化影響范圍。確保團隊相關成員了解實施情況,關注業務狀態。
準備階段一般只是第一次實驗的時候操作,一旦驗證好了以后以后,后序重復執行本次工程不需要重新準備,除非對實驗過程有變動。
- 執行階段:
- 執行實驗。遵循最小化影響范圍。執行過程中實時關注指標,如果有異常,隨時終止實驗。例如,把Redis延時調大,查看監控指標是否有異常。
- 分析結果。遵循最小化影響范圍。根據收集的指標數據確認假設Redis的超時不會對系統影響。如果驗證假設不成立,則需要分析代碼,確認好原因,再組織下一次的混沌工程實驗。
- 擴大實驗范圍。遵循最小化影響范圍。先小范圍測試,再逐步擴大測試范圍。
- 自動化。遵循持續自動化運行實驗。當對代碼有足夠的信心之后,將混沌工程實踐做成自動化,讓混沌工程實驗能夠持續保證業務的可用性,獲得最大的價值。
Chaos Monkey在K8S集群下的應用
Kubernetes是容器編排市場的領導者。如何保證K8S集群及運行在上面的應用能夠抵御生產中動蕩環境的能力和信心呢?正確地使用混沌工程實踐是這里面的關鍵。我做了一些調研,找到了常用的三款在K8S環境下的混沌工程工具。
- Kube-monkey:模擬在指定時間隨機刪除K8s集群中的pod
- Powerfulseal:控制K8S中的Pod及Node節點的狀態
- Gremlin:是一個商業版工具。通過web/API/CLI的方式對容器、主機,提供數十種攻擊方式,方便與其它工具進行集成。
總結:
可見混沌工程并不僅僅是在傳統運維、云平臺發揮著作用,在最新的基礎架構設施容器平臺中也發揮著它的價值。我相信會有越來越多的企業將意識到混沌工程給系統帶來的各種好處,不久的將來,混沌工程實踐也許會成為基礎設施運維與應用運維不可或缺的一部分。
參考文章
Netflix 混沌工程手冊
Unleash the Chaos Monkey
Netflix的Chaos Monkey的一個實現用于Kubernetes集群
獲得1.25億用戶以后,Netflix總結了這些系統可用性經驗
Istio Chaos Engineering: I Meant to Do That
AWS云上混沌工程實踐之啟動篇