別等出了P0事故,才去建這個故障演練體系
一、背景
隨著貨拉拉微服務架構、容器化技術廣泛使用,軟體架構的複雜度在不斷提升,由服務之間的依賴所帶來的不確定性也呈指數級增長。在這樣的依賴網中,任何一環出現非預期或者異常的變化,都可能對其他服務造成非常大的影響。
因此,我們透過構建一個故障演練體系,來提升系統架構的容錯能力和韌性,也可以站在未知故障視角來驗證系統穩定性,驗證整個故障定位能力和恢復體系。同時可以以戰養兵,提升故障應急效率。
二、體系全覽
目前,貨拉拉故障演練體系主要包括管理體系、工具體系、運營體系:
我們在建設該體系之初,是想透過故障演練建立研發面向失敗程式設計的思維,配合故障演練提前探知系統風險,並透過架構最佳化來解決最佳化系統風險,從而真正提升架構容錯能力,並實現韌性架構,降低由於故障帶來的損失。
在這過程中,我們鍛鍊了故障應急同學解決故障的能力、並驗證了應急流程、應急手段、監控報警有效性等。
管理體系,透過制定故障演練SOP,從技術角度制定在故障演練實施過程中的操作規範,避免因人為操作可能引發的系統風險,以及當風險發生時的應對措施。
工具體系,圍繞預防、發現、恢復、覆盤、改進這5項關鍵點展開的故障演練工具體系的搭建。
運營體系,從演練評價、機制文化、組織建設等各方面構建起貨拉拉演練生態。
三、工具體系
1.故障演練平臺架構
貨拉拉故障演練平臺現階段主要在全域性攻防演練,日常故障演練等應用場景;主要模組有應用管理、故障中心、機器管理、演練經驗庫、運營統計等。
故障演練平臺的總體架構如上圖所示:
應用管理,維護應用相關後設資料,包括應用名稱、部署型別等資訊。
故障中心,支援Java應用、中介軟體、系統資源等故障型別;並在故障生命週期中提供故障下發、故障恢復等能力。
演練經驗庫,將成熟的演練方案、演練場景納入經驗庫,保證了場景真實性;針對通用的演練場景,可以提升建立演練的效率。
運營統計,透過更直觀、更具業務價值的資料來幫助我們提升系統穩定性。主要運營資料有演練資料、預案資料、改進項等。
2.故障演練能力全景
以上是故障演練平臺目前支援的能力,如圖所示:
從支援的場景來說,主要支援攻防類、功能類(監控、資損、預案等)、混沌工程三大類場景。
從故障型別來說,主要是Java應用、中介軟體、系統資源和基於業務場景維度的故障。
從爆炸半徑控制角度來看 ,分別提供了流量隔離策略、環境隔離、業務標識、控制命中次數等方式。
在混沌工程方面,提供業務鏈路/應用間強弱依賴關係的能力。
3.故障中心
故障中心在整個體系中主要承載了故障編排、故障下發、故障恢復能力。在平臺效能方面,支援單機每分鐘1000+節點的故障注入,完全滿足公司級別全域性攻防演練和日常演練需求。
基於故障場景的流程編排,我們可以透過多場景 + 多故障的方式自由組合,如上圖。
4.控制爆炸半徑
透過流量隔離策略,能滿足我們90%以上控制爆炸半徑的訴求,目前有以下三種策略:
自定義標識隔離策略,指定單個/多個自定義的流量,適合故障需要隔離部分流量。
灰度隔離策略,指定單個灰度版本內的流量,適合在正式節點獲取灰度標識資訊(精準使用真實使用者流量)。
多泳道隔離策略,指定單個泳道內的流量,可以滿足針對某些城市一定比例的使用者、司機注入故障。
流量隔離策略流程如下:
5.演練自動化
當我們做常態化演練時,需要考慮的一個問題是ROI是否合理。每次演練或多或少都需要人工參與,繼而耗費人工成本。當我們常態化演練之後就需要考慮自動化,替換人工投入成本。
其次混沌工程其實是一個防禦性的工作,它要求覆蓋面全,如果每個關鍵點上的價效比不高,那麼全域性損耗將非常巨大。
因此,我們的目的非常明確,第一點,減少人工成本,並將覆蓋面最大化;第二點,以發現問題為目的,定時定期自動演練。
演練自動化關鍵因素:
爆炸半徑控制,演練自動化無人值守,因此對爆炸半徑控制更為嚴格。目前確定的隔離策略是指定測試流量線上下穩定環境執行。
服務依賴關係管理,演練自動化旨在梳理兩兩依賴之間的強弱關係。首先,我們要拿到準確的依賴資訊,如,核心鏈路上,服務之間、介面之間、服務與中介軟體之間的依賴資訊。
故障編排,不同於常規故障演練。演練自動化的編排策略主要有並行、序列、手工控制。
熔斷能力,熔斷能力是演練自動化最重要的能力之一。在對目標服務注入故障時,根據監控資料判斷是否立即熔斷。
驗證流量,驗證強弱依賴關係最重要的判斷依據是驗證流量。驗證流量可以分為自然流量、測試流量、回放流量等。透過端到端的自動化作為驗證流量,能最大程度上滿足需求,並且投入成本低。
四、管理體系
透過制定演練策略和故障演練SOP,來界定各個演練型別的邊界,並從技術角度制定在故障演練實施過程中的操作規範,規避因任務操作可能引發的系統風險,以及當風險發生時的應對措施。力保避免因故障演練實施過程中對真實業務產生的影響。
1.故障演練型別
根據目前演練目的不同,區分為故障演練、全域性攻防演練和混沌工程三大類。
2.故障演練流程
一次有效和高質量的故障演練,會涉及到方案梳理、故障注入、觀察、問題記錄、恢復、覆盤等。流程如下:
過程中主要有以下幾個階段:
計劃階段,演練方案(包括強弱依賴關係、應急預案、目標應用、故障型別等)、演練事件、爆炸半徑控制等。
執行階段,演練過程中監控報警是否有效、應急預案是否生效;觀察故障影響範圍並及時反饋,有問題及時終止演練。
恢復階段,恢復故障注入,應用重新發布。
分析階段,收集故障演練中過程資料,如應急時效、預案執行後是否符合預期等;產出演練報告和最佳化項,最佳化項完成後再次透過故障演練驗證。
五、運營體系
故障演練在貨拉拉的落地實施,總結下來主要分為三個階段。
1.探索階段
這個階段主要探索驗證為主,主要驗證流程規範、平臺能力等。透過小範圍的試點,培養目標團隊的心智,並同時拿到一些明顯的收益,方便後續擴大試點範圍。
試點範圍主要集中在核心業務團隊的非核心場景,目的在於驗證故障演練的可行性。在各方建立了足夠的信心後,再擴大試點範圍。
演練場景優先選擇歷史發生過的故障,生產發生的故障,很有可能再次發生。透過復現歷史故障,驗證歷史故障是否被修復以及驗證應急預案有效性。
演練環境的選擇,從線下環境著手逐步轉線上是相對穩妥的選擇。
爆炸半徑則是透過測試流量 + 單介面 + 單節點的方式控制。
2.試驗階段
經歷了上一階段的能力驗證,將試點範圍逐步放大到各個業務團隊。其次組建了專門的故障演練團隊,旨在幫助業務團隊更好地落地。這個階段主要是獲取更多的資料樣本,發現更多問題(業務、流程、工具平臺等),為後續常態化奠定基礎。
試點範圍擴大至各個業務團隊,透過課程分享、部門推廣會等方式,培養研發同學心智,獲取更多資料樣本。
演練場景主要以歷史發生的故障、相似鏈路上的歷史故障型別為主,歷史發生的故障很有可能在其他鏈路上也發生。
在演練環境方面,故障演練平臺逐步開放線上灰度環境的演練。透過線上演練審批流程、釋出視窗、封網視窗等方式篩選線上演練場景。
在爆炸半徑控制方面,主要以單應用多節點、單應用單節點、測試流量等方式控制爆炸半徑。
演練時間主要推薦工作日晚上低峰期開始,這個時間段,相關同學保持oncall,任何情況都能及時處理。
工具平臺建設方面,主要實現自動化演練、自動化收集演練資料、高效管理演練場景等。
結合CI團隊,以驗證預案有效性為目的,演練平臺作為驗證預案有效性的唯一手段,進一步增加平臺使用者粘性。
在活動運營方面,每月/每季度定期舉行全域性攻防演練,提升品牌效應。
3.常態化階段
該階段故障演練範圍覆蓋了全部業務部門,演練流程、平臺等方面也比較成熟;各部門已經具備自主演練能力。
運營策略主要透過公眾號、客服群等方式提供給使用者一個瞭解平臺新功能和日常溝通渠道;並且透過全域性攻防演練和故障演練積分制等機制激發全員參與積極性。
演練場景主要以主鏈路核心場景,定期、隨機發起演練。
沉澱出各個業務部門故障演練優秀實踐,作為系統穩定性保障的重要一環,各個部門自行組織常態化演練。
平臺建設方面,主要開放演練自動化、監控報警驗證能力、資金內控驗證能力等主要功能,進一步支撐常態化演練。
心智方面,從被動接受故障演練到主動嘗試實驗;從驗證監控報警、預案有效性到主動發現系統穩定性。
正向收益和價值明顯,持續提升運營關鍵指標(各業務團隊故障演練數、預案驗證數、改進項等),有進一步支撐持續運營的動力。
4.運營資料
目前在公司內部實施故障演練的過程中,支撐了10+業務部門演練需求,分析了900+演練場景,透過每月800+的頻次開展常態化故障演練,有效發現了100+問題(不侷限於監控報警、應急預案、應急流程、系統強弱依賴等);
故障演練管理體系的搭建,規範線上演練流程,避免因故障演練引發的線上故障;
定期舉辦的攻防演練,不僅鍛鍊了故障應急響應團隊的應急能力,還間接提升了系統穩定性。
六、未來展望
最後,展望一下故障演練體系未來的規劃,主要從演練成本、故障多樣性、演練過程觀測能力等幾方面展開:
豐富故障型別,建設業務鏈路級別故障、支援更多語言(c++、go)。
降低演練成本,比如演練場景選擇、故障除錯等。
進一步完善可觀測能力,多視角多維度觀測目標系統、鏈路。
來自 “ 貨拉拉技術 ”, 原文作者:侯佳剛;原文連結:https://server.it168.com/a2023/1010/6824/000006824100.shtml,如有侵權,請聯絡管理員刪除。
相關文章
- MinIO線上故障演練
- redis的sentinel模式故障演練Redis模式
- P0級事故頻發後,這家公司終於醒悟了!
- 降本增笑P0事故頻發,構建持續高可用系統的破局之道
- 想問問有公司做介面級別的故障演練嗎?
- 雲原生背景下故障演練體系建設的思考與實踐—雲原生混沌工程系列之指南篇
- B站故障演練平臺實踐
- MySQL 可重複讀,差點就我背上了一個 P0 事故!MySql
- P0 總體
- 直播混沌工程之故障演練實踐總結
- 企業出了IT事故,誰來負責?
- 如何構建一個可“持續演進”的可觀測體系?| QCon
- 硬吃一個P0故障,「線上業務」應該如何調優HBase引數?
- 出了生產事故,到底要不要罰錢?
- 練手建個站
- 介面_演練
- 學了一個月,多練才會不難
- 剛才釋出了一個分享創造帖子怎麼不見了??
- Conntrack 監控,別等故障了再回來加監控
- 攻防論道 | 完備高效的攻防演練,要具備這5個階段
- 生產環境故障處理演練-mysql資料庫主從恢復MySql資料庫
- MySQL系列:binlog日誌詳解(引數、操作、GTID、最佳化、故障演練)MySql
- 用資料滅火——如何積極主動預防故障,避免IT消防演練
- 《覆盤:對過去的事情做思維演練》讀書筆記筆記
- 《覆盤-對過去的事情做思維演練》讀書筆記筆記
- 什麼是攻防演練?攻防演練包含哪些專案?
- 這些Git事故災難, 你經歷過幾個?Git
- JavaScript兩個等號和三個等號區別JavaScript
- Map集合類_演練
- Set集合類_演練
- Gin實戰演練
- Pytorch入門演練PyTorch
- 大多數飛機事故都發生在這個“安全”環節!
- 這樣建設美術館展廳才更能引人注目
- 容災演練月報 | 紹興銀行四大業務系統完成容災切換演練
- Known框架實戰演練——進銷存系統需求框架
- 直白點,這些公司問題大,別去!
- 再利用OSM模型、UJM模型等指標體系建設方法論模型指標