穩定性建設系列文章 - 故障演練
概述:爲提升系統穩定性,和線上故障的觸達、定位、恢復的速度,以及建立一套可執行、便於操作的特色的演練規範,並沉澱通用、可移植的演練規範,故發起了故障演練。
一、故障演練的意義
1.1 混沌工程
介紹故障演練之前,先來了解一下混沌工程。Netflix 在 2012 年發佈了 Chaos Monkey,向業界介紹了這個思想。引述一位業界先驅的話,混沌工程是一種深思熟慮的,經過計劃來揭露系統弱點的實驗。簡單來說,就是將異常擾動注入已經呈現穩態的系統中,觀測系統因此而產生的變化並作出對策,使今後系統面對同類異常擾動的變化 delta 在空間和時間維度上儘可能的小。
混沌工程不是一次性的實驗,通過驗證、改進和再實驗,形成一種往復性的提升機制。根據混沌工程原則(PRINCIPLES OF CHAOS ENGINEERING),它在設計上強調了 5 大基本要素:
1、建立一個系統穩定狀態運行的假設
首先我們需要一個穩定狀態運行的系統,用於進行混沌實驗。如何定義 “穩定狀態運行”,對於嚴謹科學的實驗,我們不能從感觀上去給“穩定狀態運行” 下定義,我需要給出具體的可測量的輸出。關注系統這些可測量的輸出,不去關心繫統內部實現,在短時間內對這些輸出的測量結果,就體現了 “穩定狀態運行” 的程度。tps、rt、latency、錯誤率等指標,都可能成爲體現穩態運行的感興趣的指標。
2、多樣化真實世界的事件
混沌實驗中的變量反映了真實世界的時間。通過潛在影響和估計頻率對事件優先級進行排序。認爲與硬件故障(如服務器死機)、軟件故障(如錯誤響應)和非故障事件(如流量激增或擴展事件)相對應的事件,任何能夠破壞穩態運行的事件,都有可能成爲混沌實驗中的變量。
3、在生產環境中進行實驗
系統的行爲因環境和流量模式而異。由於可利用的行爲隨時可能發生變化,因此對真實流量進行採樣是可靠捕獲請求路徑的唯一方法。爲了保證系統運行方式的真實性以及與當前部署系統的相關性,Chaos 強烈建議直接在生產流量上進行實驗。
4、持續自動化運行實驗
手動運行實驗是勞動密集型的,最終是不可持續的。自動化實驗並持續運行。混沌工程將自動化構建到系統中以驅動編排和分析。
5、最小化爆炸半徑
在生產中進行實驗有可能給客戶帶來不必要的痛苦。雖然必須考慮到一些短期的負面影響,但混沌工程師有責任和義務確保實驗產生的影響最小化並得到控制。
1.2 故障演練的意義
二、故障演練落地路徑
2.1 核心鏈路防劣化
首先,我們的演練是從核心鏈路防劣化開始做起,防止日常迭代將核心鏈路和業務場景劣化掉。有幾個前置工作:
-
前端核心 action 梳理。
-
核心業務場景梳理。
-
明確核心服務服務級別 (S1)。
-
嚴格把控服務升入和降出核心服務服務級別 (S1)。
按照前面所說的混沌工程 5 大基本要素,結合我的實驗場景,我們按照以下 4 個步驟進行實驗:
1、首先將 “穩態” 定義爲指示系統正常運行的可測量指標
這裏我們通過梳理一份核心鏈路迴歸 case,用這份 case 做爲系統 “穩態” 的可測量指標
2、假設這種穩態將在對照組合實驗組中持續下去
對照組:沒有注入異常前的系統。實驗組:注入異常後的系統。我們假設穩態的那一份 case 會在兩組都持續正常下去
3、引入反映現實世界事件的變量,如服務器崩潰、超時等
目前主要還只是做了宕機的事件引入,後續流程上和工具層面完善後,我們會繼續加入類型超時、npe 等真實事件進行實驗
4、試圖通過尋找對照組和實驗組的穩態上的差異,來反駁第 2 步中的假設
通過對對照組和實驗組的 case 的結果的差異,來反駁第 2 步中的假設。反駁的難度越大,我們對系統行爲的信心就越大。如果發現了一個弱點,我們就有了一個改進的目標,在該行爲在生產上整個系統中表現出來之前。
由於做的是防止劣化的混沌實驗,以及目前的基礎設施水平,我們在 5 大基本要素上,並沒有嚴格的執行,比如說:
我們沒有在生產上進行實驗,目前我們也沒有做到自動化的程度(不過也是在積極落地爲自動化 case 中)。具體詳情如下:
1、建立一個系統穩定狀態運行的假設
這邊我們通過梳理一份核心鏈路迴歸 case,通過 case 全部運行通過,來證明系統穩定狀態運行的假設成立
2、多樣化的真實事件
目前主要還只是做了宕機的事件,後續流程上和工具層面完善後,我們會繼續加入類型超時、npe 等真實事件進行實驗
3、在生產環境中進行實驗
因爲目前的情況是需要對核心鏈路的劣化進行控制,故我們需要將所有的非核心服務注入異常,通過對爆炸半徑的分析,故防劣化的實驗在測試環境進行
4、持續自動化實驗
目前驗證系統穩定狀態運行的假設這一步還沒有實現自動化(目前也是在積極落地爲自動化 case 中),故我們目前是每個迭代人工持續的在進行防止劣化的實驗,自動化這塊目前還有很大的優化空間
5、最小化爆炸半徑
最小化半徑這塊,我們將爆炸半徑控制在非 S1 服務,控制實驗期間不影響其他業務線的正常測試,並達到我們自己的實驗目的的效果
2.2 應急效率提升
這一塊主要是爲了提升線上故障的應急效率 5-5-10(監控告警的時效、故障原因定位的效率以及止血、故障恢復的快速性)而做的實驗。所以我們嚴格按照混沌工程的 5 大要素進行實驗。
首先我們選取了可以建立假設 “穩態說” 的可以測量的系統輸出 -- 業務核心(用車領域關鍵節點)大盤指標和注入的場景相關的 tps、error 指標;
其次在真實事件多樣化這塊,我們選取了目前超時異常和非超時異常 (npe),來驗證這兩大類型的異常對系統穩態的影響;
第三,因爲目標是應急,故我們的實驗直接上到了生產進行;
第四,我們也是持續性、常規化的進行故障實驗(自動化這一塊,因爲目前的進度、系統現狀以及平臺能力,暫時還不支持);
第五,最小化爆炸半徑,從選取異常注入場景上,我們每次選擇範圍在 3 個左右,並且會在測試環境提前做影響範圍驗證;從故障注入工具層面,通過流量標識,保證異常注入期間異常只會影響壓測流量,不影響上線真實流量;
2.3 混沌工程文化推廣
S1 線下故障演練操作規範、流程機制
綠通系統故障演練操作規範、流程機制
故障演練團隊分享 (相關流程規範以及工具使用)
三、演練流程的建議
因爲故障演練本身是通過對照組和實驗組的穩態結果進行對比而發現系統的弱點,故我們需要注意控制環境變量,提前做好 check,保證兩組之間的差異只由我們實驗引入的真實事件而導致的。
實驗結束後的環境驗證。不管是線上環境還是線下環境,都有對應的使用用戶,線上的爲真實用車騎行用戶,線下爲我們的測試相關人員,我們不能因爲故障演練去影響這些用戶的正常使用。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/h4_yWNonjrpho2TODjlRgw