混沌工程是什么
背景
隨著服務(wù)化、微服務(wù)和持續(xù)集成的普及,軟件研發(fā)效率和敏捷性得到了極大提升,但大規(guī)模服務(wù)節(jié)點(diǎn)和復(fù)雜架構(gòu)應(yīng)用背后,期待任何架構(gòu)師能整體理解這些服務(wù)組件和交互模式、預(yù)測(cè)分布式服務(wù)所有可能的故障是不合理的,故障發(fā)生的隨機(jī)性和不可預(yù)測(cè)性也大大增加了。大學(xué)電氣工程的“信號(hào)和系統(tǒng)”課程中有一個(gè)拉普拉斯變換,是一種傳遞函數(shù),將整個(gè)電路行為用一個(gè)數(shù)學(xué)函數(shù)來(lái)表達(dá),函數(shù)描述的是系統(tǒng)在受到脈沖時(shí)如何響應(yīng),輸入信號(hào)包含所有可能輸入頻率的總和,有了這個(gè)電路傳遞函數(shù),就可以預(yù)測(cè)它受到所有可能的輸入信號(hào)會(huì)如何響應(yīng),分布式系統(tǒng)中沒(méi)有類似的函數(shù),無(wú)法為復(fù)雜的分布式系統(tǒng)建立一個(gè)預(yù)測(cè)模型,無(wú)法推測(cè)出各種網(wǎng)絡(luò)延遲、單點(diǎn)故障、上游服務(wù)不可用等行為下系統(tǒng)的表現(xiàn)和影響。
監(jiān)控告警和故障處理都是事后響應(yīng)與被動(dòng)應(yīng)對(duì)。
痛苦才能讓人深度思考,Chaos Engineering是過(guò)去多年同穩(wěn)定性持續(xù)戰(zhàn)斗、每一次故障后深度思考的結(jié)果。
在復(fù)雜分布式系統(tǒng)中,人力無(wú)法阻止這些故障的發(fā)生,我們應(yīng)該致力于在這些異常和故障被觸發(fā)之前,盡可能多地識(shí)別導(dǎo)出這些異常的、在系統(tǒng)中脆弱的、易出故障的環(huán)節(jié),當(dāng)識(shí)別出這些風(fēng)險(xiǎn),我們就可以有針對(duì)性的完善、加固和防范,不斷地打造更具彈性和韌性的系統(tǒng),樹(shù)立和提升我們對(duì)分布式系統(tǒng)的信心,從而避免故障發(fā)生時(shí)所帶來(lái)的的嚴(yán)重后果。
多米諾骨牌效應(yīng)
搞破壞
小尺度和大尺度
面向失敗編程和面向故障架構(gòu)
措手不及、不知所措
“故障發(fā)生,不是由你來(lái)選擇那一刻,而是那一刻選擇你,你只能選擇為之做好準(zhǔn)備?!??– 消防隊(duì)長(zhǎng) Mike Burtch
定義
混沌工程(Chaos Engineering)是在分布式系統(tǒng)上進(jìn)行受控試驗(yàn)的學(xué)科,目的是建立對(duì)系統(tǒng)抵御生產(chǎn)環(huán)境中失控條件的能力和信心。
可以把混沌工作看作是為了揭示生成環(huán)境中系統(tǒng)的未知弱點(diǎn)和脆弱環(huán)節(jié)而進(jìn)行的試驗(yàn),通過(guò)一系列試驗(yàn)幫助我們發(fā)現(xiàn)系統(tǒng)中潛在的、可導(dǎo)致災(zāi)難、或造成重大業(yè)務(wù)損失的脆弱環(huán)節(jié),推動(dòng)農(nóng)我們主動(dòng)解決這些環(huán)節(jié),提升系統(tǒng)的彈性和韌性。
混沌工程是一門(mén)相對(duì)高級(jí)的系統(tǒng)穩(wěn)定性治理的方法論,提倡采用探索式的研究實(shí)驗(yàn),發(fā)生生產(chǎn)環(huán)境中的各種風(fēng)險(xiǎn)。要成功實(shí)施混沌工程,要求現(xiàn)有系統(tǒng)具備一定程度的彈性。
混沌工程并非簡(jiǎn)單的制造服務(wù)中斷等故障,嘗試破壞系統(tǒng)和服務(wù)很簡(jiǎn)單,但不能建設(shè)性和高效地發(fā)現(xiàn)問(wèn)題,混沌工程期望可以最大化每個(gè)實(shí)驗(yàn)可以獲得的信息?;煦绻こ痰囊饬x是,讓復(fù)雜系統(tǒng)中根深蒂固的混亂和不穩(wěn)定性浮出表面,更好理解這些系統(tǒng)性固有現(xiàn)象,從而推動(dòng)更好的設(shè)計(jì)系統(tǒng),提升系統(tǒng)彈性。
混沌工程正是一種既能發(fā)現(xiàn)系統(tǒng)中的問(wèn)題點(diǎn),又能避免大規(guī)模影響的方法論。
混沌工程部是制造問(wèn)題,而是揭示問(wèn)題。
混沌工程就是利用實(shí)驗(yàn)提前探知系統(tǒng)風(fēng)險(xiǎn)和弱點(diǎn),通過(guò)架構(gòu)優(yōu)化來(lái)提升系統(tǒng)韌勁(彈性,恢復(fù)能力)。
價(jià)值
把故障帶來(lái)的痛苦提到最前。
接種疫苗,提高故障免疫力。
讓工程師形成了構(gòu)建具備足夠彈性和韌性服務(wù)的規(guī)約和規(guī)則。
VS 測(cè)試
混沌工程的核心是進(jìn)行為了揭示系統(tǒng)未知弱點(diǎn)的試驗(yàn),是能夠發(fā)現(xiàn)系統(tǒng)新信息、新知識(shí),探索系統(tǒng)的更多未知領(lǐng)域和問(wèn)題的過(guò)程和實(shí)踐。
故障注入是測(cè)試一種情況的方法,通過(guò)注入通信延遲和錯(cuò)誤等失敗來(lái)探索復(fù)雜系統(tǒng)可能出現(xiàn)的不良行為的表現(xiàn)。
故障測(cè)試是以某種預(yù)想的方式破壞系統(tǒng),但沒(méi)有探索出更多可能發(fā)生的奇怪場(chǎng)景。
測(cè)試和試驗(yàn)的一個(gè)重要區(qū)別是,測(cè)試中,進(jìn)行斷言:給定特定條件,系統(tǒng)將發(fā)出特定輸出,判定是真還是假,只是將效價(jià)分配給它的已知屬性,不會(huì)產(chǎn)生系統(tǒng)新的知識(shí)。
故障注入和故障測(cè)試是通過(guò)引入故障,讓程序走一些不常經(jīng)過(guò)的路徑,以此提高程序覆蓋率,是對(duì)特定條件、變量的驗(yàn)證。這個(gè)實(shí)踐本質(zhì)上不能挖掘系統(tǒng)內(nèi)未知或尚不明確的認(rèn)知。沒(méi)有辦法探索更廣闊的、不可預(yù)知的、但很可能發(fā)生的事情。
混沌工程的前提條件
是判斷是否要做系統(tǒng)實(shí)施混沌工程,需要確保系統(tǒng)已經(jīng)具備一定的彈性和韌性,能夠應(yīng)對(duì)某個(gè)服務(wù)不可用、網(wǎng)絡(luò)波動(dòng)、瞬間流量突增的情況?;煦绻こ淌怯脕?lái)揭示系統(tǒng)中未知的脆弱環(huán)節(jié)的,如果很明確系統(tǒng)的彈性水平非常弱,實(shí)施混沌工程沒(méi)有很大的價(jià)值,也會(huì)導(dǎo)致嚴(yán)重的線上故障和業(yè)務(wù)影響。同時(shí)混沌工程還依賴監(jiān)控系統(tǒng),用來(lái)觀測(cè)系統(tǒng)的各項(xiàng)狀態(tài)和指標(biāo),讓系統(tǒng)運(yùn)行行為可見(jiàn)和透明,否則實(shí)驗(yàn)無(wú)法得到有效的信息和結(jié)論。
FIT故障注入測(cè)試
分布式系統(tǒng)中各種問(wèn)題大多由預(yù)期外的事件或延遲導(dǎo)致的,故障注入測(cè)試(Failure Injection Testing)讓工程師訪問(wèn)服務(wù)的請(qǐng)求中注入一些失敗場(chǎng)景,注入失敗的請(qǐng)求在系統(tǒng)中流轉(zhuǎn)時(shí),服務(wù)中被注入的故障錨點(diǎn)會(huì)根據(jù)不同的失敗場(chǎng)景觸發(fā)相應(yīng)的邏輯。
試驗(yàn)的四個(gè)步驟
用系統(tǒng)在正常行為下的可測(cè)量的輸出來(lái)定義“穩(wěn)定狀態(tài)”。
假設(shè)系統(tǒng)在控制組和試驗(yàn)組都會(huì)繼續(xù)保持穩(wěn)定狀態(tài)。
在試驗(yàn)組引入反映真實(shí)世界事件的變量,如服務(wù)器崩潰、硬盤(pán)故障、網(wǎng)絡(luò)連接斷開(kāi)等。
通過(guò)控制組和實(shí)驗(yàn)組之間的狀態(tài)差異來(lái)反駁穩(wěn)定狀態(tài)的假說(shuō)。
破壞穩(wěn)態(tài)的難度越大,我們對(duì)系統(tǒng)行為的信心就越強(qiáng)。如果發(fā)現(xiàn)了一個(gè)弱點(diǎn),那么我們就有了一個(gè)改進(jìn)目標(biāo)。避免在系統(tǒng)規(guī)?;蟊环糯蟆?/p>
高級(jí)原則
建立一個(gè)圍繞穩(wěn)定狀態(tài)行為的假說(shuō)
關(guān)注可測(cè)量的輸出,而不是系統(tǒng)的內(nèi)部屬性。
短時(shí)間內(nèi)的度量結(jié)果,代表了系統(tǒng)的穩(wěn)定狀態(tài)。
驗(yàn)證系統(tǒng)是否工作,而不是如何工作。
多樣化真實(shí)世界的事件
混沌變量反映了現(xiàn)實(shí)世界中的事件。
通過(guò)潛在影響或預(yù)估頻率來(lái)排定事件的優(yōu)先級(jí)。
任何能夠破壞穩(wěn)態(tài)的事件都是混沌試驗(yàn)中的一個(gè)潛在變量。
在生產(chǎn)環(huán)境中進(jìn)行試驗(yàn)
系統(tǒng)的行為會(huì)因環(huán)境和流量模式有所不同。
為了保證系統(tǒng)執(zhí)行方式的真實(shí)性和當(dāng)前部署系統(tǒng)的相關(guān)性,混沌工程強(qiáng)烈推薦直接采用生產(chǎn)環(huán)境流量進(jìn)行試驗(yàn)。
持續(xù)自動(dòng)化運(yùn)行試驗(yàn)
手工運(yùn)行試驗(yàn)是勞動(dòng)密集型的,是不可持續(xù)的,要讓試驗(yàn)自動(dòng)化并持續(xù)運(yùn)行。
混沌工程要在系統(tǒng)中構(gòu)建自動(dòng)化的編排和分析。
最小化爆炸半徑
在生產(chǎn)環(huán)境中進(jìn)行試驗(yàn)會(huì)造成不必要的客戶投訴,工程師需要考慮如何讓試驗(yàn)影響最小化。
故障
故障類型故障故障說(shuō)明故障應(yīng)對(duì)方案
雪崩效應(yīng)一個(gè)異?;蚬收蠒?huì)觸發(fā)一個(gè)不斷自我強(qiáng)化的循環(huán),最終導(dǎo)致資源耗盡,拖垮整個(gè)應(yīng)用。
級(jí)聯(lián)故障因依賴關(guān)系引發(fā)的局部故障導(dǎo)致整個(gè)系統(tǒng)崩潰(俗稱蝴蝶效應(yīng))切換轉(zhuǎn)移
重試退避
超時(shí)機(jī)制
冪等操作
服務(wù)降級(jí):當(dāng)服務(wù)器壓力劇增的情況下,有策略地減少或退化部分服務(wù),以此釋放服務(wù)器資源以保證核心 任務(wù)的正常運(yùn)行,如只讀模式、停用耗時(shí)耗資源的功能等。
拒絕服務(wù):請(qǐng)求過(guò)載時(shí),按優(yōu)先級(jí)開(kāi)始丟棄相應(yīng)的請(qǐng)求。
服務(wù)熔斷:若某個(gè)目標(biāo)服務(wù)調(diào)用過(guò)慢或者有大量超時(shí),直接熔斷該服務(wù)的調(diào)用,對(duì)于后續(xù)調(diào)用請(qǐng)求,不在繼續(xù)調(diào)用目標(biāo)服務(wù),直接返回響應(yīng),快速釋放資源,待目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。
宕機(jī)
混沌工程實(shí)踐
建立穩(wěn)定狀態(tài)的假說(shuō)
如何描述穩(wěn)定狀態(tài)
對(duì)于任何復(fù)雜系統(tǒng),需要通用的方法來(lái)判斷和區(qū)分什么系統(tǒng)行為是預(yù)期中,哪些是預(yù)期之外的。我們?nèi)绾未_定系統(tǒng)是否正常工作?如何判斷系統(tǒng)處于健康狀態(tài)?我們將系統(tǒng)正常運(yùn)行時(shí)的狀態(tài)定義為系統(tǒng)的“穩(wěn)定狀態(tài)”,來(lái)指代系統(tǒng)維持在一定范圍內(nèi)或一定模式的屬性。跟生命特征指標(biāo)一樣,判斷一個(gè)生命是否是健康的,會(huì)去檢查他的脈搏、呼吸、血壓、體溫等,對(duì)于判斷一個(gè)系統(tǒng)是否處于健康的運(yùn)行狀態(tài)時(shí),會(huì)檢測(cè)系統(tǒng)的吞吐率、錯(cuò)誤率、T999、延遲、CPU和內(nèi)存利用率等。
指標(biāo)包含業(yè)務(wù)指標(biāo)和系統(tǒng)指標(biāo)。系統(tǒng)指標(biāo)有助于幫助于我們?cè)\斷問(wèn)題,發(fā)現(xiàn)功能缺陷,但在描述一個(gè)系統(tǒng)的穩(wěn)定狀態(tài)模型時(shí),強(qiáng)烈推薦建立在業(yè)務(wù)接受的業(yè)務(wù)指標(biāo)上,業(yè)務(wù)級(jí)別的指標(biāo)是最有價(jià)值的,才是系統(tǒng)健康的真實(shí)反映(我們正在流失用戶嗎?當(dāng)前黃金流程和核心功能是否可用?PV、UV、點(diǎn)擊、轉(zhuǎn)化如何?)。對(duì)于服務(wù)類的應(yīng)用,需要把客戶和服務(wù)之間的服務(wù)水平協(xié)議(SLA)納入考量。定義和抓取一個(gè)具有全面反映系統(tǒng)穩(wěn)定狀態(tài)的業(yè)務(wù)指標(biāo)是非常具有挑戰(zhàn)的,Netflix使用的是SPS(Starts per Second),視頻每秒開(kāi)始播放數(shù),整體反映Netflix核心業(yè)務(wù)的業(yè)務(wù)數(shù)據(jù)。業(yè)務(wù)指標(biāo)的直接和實(shí)時(shí)性也是非常重要的。當(dāng)無(wú)法用一個(gè)能全面反映系統(tǒng)健康狀態(tài)的業(yè)務(wù)指標(biāo)時(shí),也可以挑選一道多個(gè)系統(tǒng)指標(biāo)來(lái)反映系統(tǒng)的健康狀態(tài)。
手工定期收集和檢查系統(tǒng)是否處于穩(wěn)定狀態(tài)是不可取的,這是勞動(dòng)密集型的,不可以長(zhǎng)久持續(xù)的。
通過(guò)一個(gè)模型,基于所期望的業(yè)務(wù)指標(biāo),來(lái)描述系統(tǒng)的穩(wěn)定狀態(tài)。第一類為數(shù)值范圍類的,如同人體體溫在36.1℃~37℃被視為正常的,系統(tǒng)接口延遲平均20ms到100ms被認(rèn)為是正常的,低于20ms可能是出現(xiàn)了大量無(wú)效業(yè)務(wù)數(shù)據(jù),高于100ms可能是流量突增、死鎖、應(yīng)用掛起等造成的;第二類是波動(dòng)模式類,很多業(yè)務(wù)和系統(tǒng)指標(biāo)不能用簡(jiǎn)單的數(shù)值范圍來(lái)考核,比如流量、UV/PV,他們是隨著時(shí)間或營(yíng)銷(xiāo)事件波動(dòng)的,對(duì)于Netflix來(lái)說(shuō)晚間的SPS比白天高的多,系統(tǒng)的流量在晚上和白天10點(diǎn)比其他時(shí)段要高的多,大促618和雙十一流量比平日流量大的多。指標(biāo)能否呈現(xiàn)比較穩(wěn)定的波動(dòng)模式很大程度取決于行業(yè),對(duì)于新聞?lì)悜?yīng)用來(lái)說(shuō),突發(fā)性因素特別高。
建立假說(shuō)
定義好指標(biāo)并理解穩(wěn)定狀態(tài)的行為后,就可以使用他們來(lái)建立實(shí)驗(yàn)的假設(shè),沒(méi)有一個(gè)預(yù)先的假設(shè),不清楚從數(shù)據(jù)中找什么,很難獲得有價(jià)值和有效的結(jié)論。思考當(dāng)向系統(tǒng)注入不同類型的事件時(shí),穩(wěn)定狀態(tài)行為會(huì)發(fā)生什么變化,穩(wěn)定狀態(tài)是保持不變還是被破壞了,如果被破壞了,期待系統(tǒng)如何表現(xiàn)?一般的假設(shè)為:向系統(tǒng)注入的事件不會(huì)導(dǎo)致系統(tǒng)穩(wěn)定狀態(tài)發(fā)生明顯的變化,試驗(yàn)事件不會(huì)使系統(tǒng)行為偏離穩(wěn)定狀態(tài)。例如:在通天塔注入一個(gè)樓層BI依賴的上游服務(wù)不可用的事件,通天塔主接口能否優(yōu)雅降級(jí)BI,下發(fā)原始配置排序的樓層數(shù)據(jù)。定義偏離穩(wěn)定狀態(tài)的偏差是否在合理的范圍是具有挑戰(zhàn)的,只有定義清楚正常的偏差范圍,才能活動(dòng)一套驗(yàn)證假設(shè)的完善的試驗(yàn)集合。
多樣化真實(shí)世界的事件
多元化的業(yè)務(wù)場(chǎng)景、大規(guī)模服務(wù)節(jié)點(diǎn)、復(fù)雜的系統(tǒng)架構(gòu),會(huì)遇到各式各樣的故障,這些故障就是最真實(shí)的混沌工程變量。為了更有體感、立體和有效率的描述故障,從IaaS、PaaS、SaaS層角度把通用故障繪制成系統(tǒng)的故障畫(huà)像。
故障畫(huà)像
硬件故障、功能缺陷、狀態(tài)轉(zhuǎn)換異常、網(wǎng)絡(luò)延遲或隔離、上下行輸入大幅波動(dòng)以及風(fēng)暴、資源耗盡、服務(wù)之間不正常和預(yù)期外的組合調(diào)用、資源競(jìng)爭(zhēng)、下游依賴故障:
在徹底阻止和消滅對(duì)可用性的各種威脅是不現(xiàn)實(shí)的,但我們可以盡可能減輕這些威脅。在決定引入哪些事件時(shí),需要估算這些事件發(fā)生的頻率和影響范圍,然后權(quán)衡引入他們的成本和復(fù)雜度,不需要窮舉所有可能對(duì)系統(tǒng)造成威脅的事件,只需要注入那些頻繁發(fā)生且影響重大的事件,一定要強(qiáng)調(diào)的是,注入的事件一定是你認(rèn)為系統(tǒng)能處理的,同時(shí)事件應(yīng)該真實(shí)世界會(huì)發(fā)生的。同時(shí)要理解被影響的故障域(故障的影響范圍和隔離范圍稱為故障域),在試驗(yàn)中驗(yàn)證預(yù)先定好的邊界也是非常關(guān)鍵。
在生產(chǎn)環(huán)境運(yùn)行試驗(yàn)
傳統(tǒng)測(cè)試的觀點(diǎn)是,對(duì)于問(wèn)題或缺陷的發(fā)現(xiàn)應(yīng)該盡可能前置,越遠(yuǎn)離線上環(huán)境越好,這對(duì)需求的邏輯性和可預(yù)期的問(wèn)題來(lái)說(shuō)是合理和可行的,但系統(tǒng)運(yùn)行和提供服務(wù)時(shí)應(yīng)該作為一個(gè)整體去看待它的行為,除了代碼外,上游服務(wù)穩(wěn)定性、網(wǎng)絡(luò)波動(dòng)、流量波動(dòng)、中間件等對(duì)系統(tǒng)穩(wěn)定性造成的不確定性威脅是很難全面預(yù)測(cè)和模擬的,測(cè)試/預(yù)發(fā)環(huán)境和生產(chǎn)環(huán)境在服務(wù)器規(guī)格、配置、上游等存在差異,無(wú)法真實(shí)有效的測(cè)試和驗(yàn)證各類事件。
混沌工程要建立的是對(duì)生產(chǎn)環(huán)境的信心,當(dāng)然需要在生產(chǎn)環(huán)境中進(jìn)行實(shí)驗(yàn),否則會(huì)大大削弱實(shí)驗(yàn)的價(jià)值。
上游下游服務(wù)、第三方系統(tǒng)、中間件、網(wǎng)絡(luò)、客戶端、用戶、流量都是系統(tǒng)無(wú)法控制的,生產(chǎn)環(huán)境才是系統(tǒng)和這些組件真實(shí)交互的唯一場(chǎng)所。
需要考慮實(shí)驗(yàn)的“外部有效性”(從有限樣本中得出的研究結(jié)論,究竟在多大程度上能推廣到總體中去),這個(gè)實(shí)驗(yàn)的結(jié)果能否概括我們真正感興趣的現(xiàn)象?測(cè)量結(jié)果的產(chǎn)品運(yùn)行環(huán)境是否是專門(mén)為了測(cè)試而準(zhǔn)備的?不在生產(chǎn)環(huán)境進(jìn)行實(shí)驗(yàn)對(duì)外部有效性構(gòu)成很大的威脅。要盡可能的在離生產(chǎn)環(huán)境最接近的環(huán)境中運(yùn)行。越接近生產(chǎn) 環(huán)境,對(duì)實(shí)驗(yàn)外部有效性的威脅就越少,對(duì)實(shí)驗(yàn)結(jié)果的信心就越足。
逃避混沌工程的借口
混沌工程實(shí)驗(yàn)要求系統(tǒng)已經(jīng)具備一定程度的彈性,工程師對(duì)系統(tǒng)的成熟度具備一定的信心。如果系統(tǒng)明顯是很脆弱的,很確定實(shí)驗(yàn)會(huì)導(dǎo)致宕機(jī),那先專注于提升系統(tǒng)的彈性上。
宕機(jī)了就麻煩了。即使對(duì)系統(tǒng)的彈性具有很大的信心,但還是會(huì)擔(dān)心實(shí)驗(yàn)揭示出系統(tǒng)薄弱環(huán)節(jié)的同時(shí)造成重大的破壞。有2個(gè)途徑來(lái)最小化潛在的影響范圍
支持快速終止實(shí)驗(yàn)。應(yīng)該有一個(gè)用來(lái)立即終止實(shí)驗(yàn)的“大紅色按鈕”,最好是能自動(dòng)化這個(gè)功能,監(jiān)測(cè)到對(duì)穩(wěn)定狀態(tài)有潛在危害時(shí)立即終止實(shí)驗(yàn)。
最小化實(shí)驗(yàn)造成的“爆炸半徑”
在設(shè)計(jì)實(shí)驗(yàn)時(shí),要考慮如何既能從實(shí)驗(yàn)中獲得有意義的結(jié)論,同時(shí)兼顧最小化實(shí)驗(yàn)可能造成的潛在危害。
持續(xù)自動(dòng)化運(yùn)行試驗(yàn)
自動(dòng)化是最長(zhǎng)的杠桿。
實(shí)驗(yàn)如果不是自動(dòng)化的,那它就是作廢的。
當(dāng)今系統(tǒng)的復(fù)雜性意味著我們無(wú)法先驗(yàn)的知道,生產(chǎn)環(huán)境中哪些變動(dòng)會(huì)改變混沌工程實(shí)驗(yàn)的結(jié)果,我們需要假設(shè)所有變動(dòng)都會(huì)改變實(shí)驗(yàn)結(jié)果,生產(chǎn)環(huán)境實(shí)際上處在一個(gè)無(wú)時(shí)不刻變化的狀態(tài),理論上講,對(duì)實(shí)驗(yàn)結(jié)果的信心是隨著時(shí)間而衰減的。
實(shí)驗(yàn)如果不是自動(dòng)化的,那它就不會(huì)被執(zhí)行。
手動(dòng)執(zhí)行、手把手咨詢沒(méi)法規(guī)?;?,是勞動(dòng)密集型的,無(wú)法長(zhǎng)久持續(xù)的,終究也是不會(huì)被執(zhí)行的。
自動(dòng)創(chuàng)建實(shí)驗(yàn)
混沌工程實(shí)驗(yàn)的挑戰(zhàn)并非來(lái)自于定位導(dǎo)致生產(chǎn)環(huán)境崩潰的原因,這些在故障跟蹤中有,真正想做的是找到那些本不應(yīng)該讓系統(tǒng)崩潰的事件的原因,還包括那些從未發(fā)生過(guò)的事件,然后持續(xù)不斷的設(shè)計(jì)實(shí)驗(yàn)來(lái)驗(yàn)證,保證這些事件永遠(yuǎn)不會(huì)導(dǎo)致系統(tǒng)崩潰。這是非常困難的,導(dǎo)致系統(tǒng)波動(dòng)的原因空間是非常巨大的,不可能有足夠的時(shí)間和資源窮舉所有可能導(dǎo)致問(wèn)題得事件以及組合。
LDFI (Lineage-Driven Fault Injection)可以識(shí)別出可能導(dǎo)致分布式系統(tǒng)故障的錯(cuò)誤事件組合。LDFI 的工作原理是通過(guò)推斷系統(tǒng)正常情況下的行為來(lái)判斷需要注入的候選錯(cuò)誤事件。
流程錄制和回放
最小化“爆炸半徑”
切爾諾貝利事故
混沌工程師一項(xiàng)專業(yè)職責(zé)是要理解和降低生產(chǎn)風(fēng)險(xiǎn)。預(yù)期只影響一部分用戶的測(cè)試,卻由于級(jí)聯(lián)故障導(dǎo)致了大規(guī)模節(jié)點(diǎn)中斷,影響到了很多用戶,這種情況是糟糕的,但不得不立即中斷實(shí)驗(yàn),所以隨時(shí)遏制和停止實(shí)驗(yàn)的能力是必備的,以避免造成更大的危機(jī)。我們的實(shí)驗(yàn)通過(guò)很多方法來(lái)探尋故障會(huì)造成的未知的和不可預(yù)見(jiàn)的影響,所以關(guān)鍵在于如何讓這些薄弱環(huán)節(jié)曝光出來(lái)而不會(huì)意外造成更大規(guī)模的故障。 我們稱之為最小化“爆炸半徑”。
能帶來(lái)最大信心的實(shí)驗(yàn)也是風(fēng)險(xiǎn)最大的,混沌工程實(shí)驗(yàn)應(yīng)該只承 受謹(jǐn)慎的,可以衡量的風(fēng)險(xiǎn),并采用漸進(jìn)的方式,每一步都基于前一步的基礎(chǔ)之上。這種遞進(jìn)的方式 不斷增加對(duì)系統(tǒng)的信心,而不會(huì)對(duì)用戶造成過(guò)多不必要的影響。
要不要混沌工程
不管是低頻次的迭代還是平緩的業(yè)務(wù)變更,都需要混沌工程,無(wú)論是激進(jìn)的架構(gòu)演進(jìn)還是平緩的系統(tǒng)迭代,很多問(wèn)題不是因?yàn)檫w移上云才出現(xiàn),只是遷移上云才被揭露出來(lái)了。
打法
顧舊立新
保留原有系統(tǒng),搭建新系統(tǒng)支持新業(yè)務(wù)
平滑遷移
原有系統(tǒng)正常運(yùn)行,逐漸進(jìn)行優(yōu)化和改造
不破不立
利用新技術(shù)和新思路搭建系統(tǒng),替換老系統(tǒng)
試驗(yàn)
選定假設(shè)
確保on-call工程師掌握了整個(gè)應(yīng)急流程
設(shè)定實(shí)驗(yàn)的范圍
考慮“在生產(chǎn)環(huán)境運(yùn)行實(shí)驗(yàn)”和“最小化爆炸半徑”。
要盡可能最小化實(shí)驗(yàn)對(duì)用戶造成的影響,應(yīng)該從一個(gè)小范圍的測(cè)試開(kāi)始,而且要先在測(cè)試環(huán)境驗(yàn)證過(guò),然后一步步擴(kuò)大,直到我們認(rèn)為系統(tǒng)可以應(yīng)對(duì)預(yù)期的最大影響。
識(shí)別出要監(jiān)控的指標(biāo)
根據(jù)確定的假設(shè)和范圍,評(píng)估實(shí)驗(yàn)結(jié)果的指標(biāo),要基于指標(biāo)來(lái)驗(yàn)證假設(shè),例如主數(shù)據(jù)庫(kù)故障時(shí),服務(wù)都正常。要清晰定義什么是服務(wù)正常。像響應(yīng)時(shí)間和錯(cuò)誤率,需要明確定義這些指標(biāo)可以容忍的數(shù)值范圍。
如果實(shí)驗(yàn)產(chǎn)生的影響比預(yù)期大,要做好立即終止實(shí)驗(yàn)的準(zhǔn)備,也需要設(shè)定好明確的閾值,超過(guò)閾值按下“大紅色按鈕”終止實(shí)驗(yàn)。
在組織內(nèi)溝通到位
跟上下游、業(yè)務(wù)周知,實(shí)驗(yàn)安排和可能的影響。
執(zhí)行試驗(yàn)
盯住指標(biāo),隨時(shí)終止實(shí)驗(yàn)的能力異常關(guān)鍵,實(shí)驗(yàn)可能對(duì)系統(tǒng)造成過(guò)度危害,影響用戶。有足夠的報(bào)警機(jī)制,能實(shí)時(shí)獲取關(guān)鍵指標(biāo)是不是超出了正常狀態(tài)范圍了。
分析試驗(yàn)結(jié)果
那實(shí)驗(yàn)指標(biāo)數(shù)據(jù)來(lái)驗(yàn)證之前的假設(shè)是否成立,系統(tǒng)對(duì)于注入的事件是否具備足夠的彈性,有沒(méi)有任何預(yù)期外的事情發(fā)生。
實(shí)驗(yàn)暴露出來(lái)的問(wèn)題會(huì)牽涉多方服務(wù)交互,要把結(jié)果反饋給所有的相關(guān)團(tuán)隊(duì),一同從整體上來(lái)消除隱患。
擴(kuò)大試驗(yàn)范圍
逐步擴(kuò)大,為了進(jìn)一步暴露小范圍實(shí)驗(yàn)無(wú)法發(fā)現(xiàn)的問(wèn)題。
自動(dòng)化試驗(yàn)
當(dāng)有信心手動(dòng)執(zhí)行混沌工程實(shí)驗(yàn)后,可以開(kāi)始周期性自動(dòng)化運(yùn)行試驗(yàn),持續(xù)從中獲得更大價(jià)值。
混沌工程成熟度模型
有標(biāo)準(zhǔn)來(lái)判斷這個(gè)項(xiàng)目做得是好是壞,以及如何可以做得更好。
熟練度
等級(jí)說(shuō)明
入門(mén)? 未在生產(chǎn)環(huán)境中運(yùn)行實(shí)驗(yàn);
? 全人工流程;
? 實(shí)驗(yàn)結(jié)果只反映系統(tǒng)指標(biāo),而不是業(yè)務(wù)指標(biāo);
? 只對(duì)實(shí)驗(yàn)對(duì)象注入一些簡(jiǎn)單事件,如“關(guān)閉節(jié)點(diǎn)”。
簡(jiǎn)單? 用復(fù)制的生產(chǎn)流量來(lái)運(yùn)行實(shí)驗(yàn);
? 自助式創(chuàng)建實(shí)驗(yàn),自動(dòng)運(yùn)行實(shí)驗(yàn),但需要手動(dòng)監(jiān)控和停止實(shí)驗(yàn); ? 實(shí)驗(yàn)結(jié)果反映聚合的業(yè)務(wù)指標(biāo);
? 對(duì)實(shí)驗(yàn)對(duì)象注入較高級(jí)的事件,如網(wǎng)絡(luò)延遲;
? 實(shí)驗(yàn)結(jié)果是手動(dòng)整理的;
? 實(shí)驗(yàn)是預(yù)先定義好的;
? 有工具支持歷史實(shí)驗(yàn)組和控制組之間的比較。
高級(jí)? 在生產(chǎn)環(huán)境中運(yùn)行實(shí)驗(yàn);
? 自動(dòng)結(jié)果分析,自動(dòng)終止實(shí)驗(yàn);
? 實(shí)驗(yàn)框架和持續(xù)發(fā)布工具集成;
? 在實(shí)驗(yàn)組和控制組之間比較業(yè)務(wù)指標(biāo)差異;
? 對(duì)實(shí)驗(yàn)組引入如服務(wù)級(jí)別的影響和組合式的故障事件;
? 持續(xù)收集實(shí)驗(yàn)結(jié)果;
? 有工具支持交互式的比對(duì)實(shí)驗(yàn)組和控制組。
熟練開(kāi)發(fā)流程中的每個(gè)環(huán)節(jié)和任意環(huán)境都可以運(yùn)行實(shí)驗(yàn);
全自動(dòng)的設(shè)計(jì)、執(zhí)行和終止實(shí)驗(yàn);
實(shí)驗(yàn)框架和 A/B 測(cè)試以及其他測(cè)試工具集成以最小化影響;
可以注入如對(duì)系統(tǒng)的不同使用模式、返回結(jié)果和狀態(tài)的更改等類型的事件;
實(shí)驗(yàn)具有動(dòng)態(tài)可調(diào)整的范圍以找尋系統(tǒng)拐點(diǎn);
實(shí)驗(yàn)結(jié)果可以用來(lái)預(yù)測(cè)收入損失;
實(shí)驗(yàn)結(jié)果分析可以用來(lái)做容量規(guī)劃;
實(shí)驗(yàn)結(jié)果可以區(qū)分出不同服務(wù)實(shí)際的關(guān)鍵程度。
應(yīng)用度
等級(jí)說(shuō)明
暗中進(jìn)行? 重要項(xiàng)目不采用;
? 只覆蓋了少量系統(tǒng);
? 組織內(nèi)部基本沒(méi)有感知;
? 早期使用者偶爾進(jìn)行混沌工程實(shí)驗(yàn)。
適當(dāng)投入度? 實(shí)驗(yàn)獲得正式批準(zhǔn);
? 工程師兼職進(jìn)行混沌工程實(shí)驗(yàn);
? 多個(gè)團(tuán)隊(duì)有興趣并參與;
? 少數(shù)重要服務(wù)也會(huì)不定期進(jìn)行混沌工程實(shí)驗(yàn)。
正式采用? 有專門(mén)的混沌工程團(tuán)隊(duì);
? 所有故障的復(fù)盤(pán)都會(huì)進(jìn)入混沌工程框架來(lái)創(chuàng)建回歸實(shí)驗(yàn);
? 大多數(shù)關(guān)鍵服務(wù)都會(huì)定期進(jìn)行混沌工程實(shí)驗(yàn);
? 偶爾執(zhí)行實(shí)驗(yàn)性的故障復(fù)盤(pán)驗(yàn)證,例如“比賽日”的形式。
成為文化? 所有關(guān)鍵服務(wù)都高頻率進(jìn)行混沌實(shí)驗(yàn);
? 多數(shù)非關(guān)鍵服務(wù)高頻率進(jìn)行混沌實(shí)驗(yàn);
? 混沌工程實(shí)驗(yàn)是工程師日常工作的一部分;
? 所有系統(tǒng)組件默認(rèn)要參與混沌工程實(shí)驗(yàn),不參與需要特殊說(shuō)明。
CMM 的兩個(gè)坐標(biāo)軸分別是“熟練度”和“應(yīng)用度”。缺乏熟練度時(shí),實(shí)驗(yàn)會(huì)比較危險(xiǎn)、不可靠、且有可能是無(wú)效的。缺乏應(yīng)用度時(shí),所做的實(shí)驗(yàn)就不會(huì)有什么意義和影響。要在適當(dāng)?shù)臅r(shí)候變換在兩個(gè)不同維度的投入,因?yàn)樵谌魏我粋€(gè)時(shí)期,要發(fā)揮混沌工程項(xiàng)目的最大效果需要在這兩個(gè)維度上保持一定的平衡。
閉環(huán)實(shí)驗(yàn)
實(shí)驗(yàn)可行性評(píng)估
從多個(gè)維度對(duì)實(shí)驗(yàn)技術(shù)的成熟度做了定性分析
架構(gòu)抵御故障的能力:通過(guò)對(duì)實(shí)驗(yàn)對(duì)象的架構(gòu)高可用性的分析和評(píng)估,找出潛在的系統(tǒng)單點(diǎn)風(fēng)險(xiǎn),確定合 理的實(shí)驗(yàn)范圍。
實(shí)驗(yàn)指標(biāo)設(shè)計(jì):評(píng)估目前實(shí)驗(yàn)對(duì)象判定業(yè)務(wù)正常運(yùn)行所需的業(yè)務(wù)指標(biāo)、應(yīng)用健康狀況指標(biāo)和其他系統(tǒng)指 標(biāo)。
實(shí)驗(yàn)環(huán)境選擇:選擇實(shí)驗(yàn)對(duì)象可以應(yīng)用的實(shí)驗(yàn)環(huán)境:開(kāi)發(fā)、測(cè)試、預(yù)生產(chǎn)、生產(chǎn)。
實(shí)驗(yàn)工具使用:評(píng)估目前實(shí)驗(yàn)對(duì)象對(duì)實(shí)驗(yàn)工具的熟悉程度。
故障注入場(chǎng)景及爆炸半徑:討論和選擇可行的故障注入場(chǎng)景,并評(píng)估每個(gè)場(chǎng)景的爆炸半徑。
實(shí)驗(yàn)自動(dòng)化能力:衡量目前實(shí)驗(yàn)對(duì)象的平臺(tái)自動(dòng)化實(shí)施能力。
環(huán)境恢復(fù)能力:根據(jù)選定的故障注入場(chǎng)景,評(píng)估實(shí)驗(yàn)對(duì)象對(duì)環(huán)境的清理和恢復(fù)能力。
實(shí)驗(yàn)結(jié)果整理:根據(jù)實(shí)驗(yàn)需求,討論確定實(shí)驗(yàn)結(jié)果和解讀分析報(bào)告的內(nèi)容項(xiàng)。
觀測(cè)指標(biāo)設(shè)計(jì)和對(duì)照
觀測(cè)指標(biāo)設(shè)計(jì)
觀測(cè)指標(biāo)的設(shè)計(jì)是整個(gè)混沌工程實(shí)驗(yàn)成功與否的關(guān)鍵之一,良好的系統(tǒng)可觀測(cè)性會(huì)給混沌工程實(shí)驗(yàn)帶來(lái)一個(gè)強(qiáng)有力的數(shù)據(jù)支撐,為后續(xù)的實(shí)驗(yàn)結(jié)果解讀、 問(wèn)題追蹤和最終解決提供了堅(jiān)實(shí)的基礎(chǔ)。
??業(yè)務(wù)性指標(biāo):價(jià)值最大,探測(cè)難度最大
? 應(yīng)用健康指標(biāo):反映應(yīng)用的健康狀況
? 其他系統(tǒng)指標(biāo):較易獲取,反映基礎(chǔ)設(shè)施和系統(tǒng)的運(yùn)行狀況
觀測(cè)指標(biāo)對(duì)照
趨勢(shì)隨時(shí)間的 變化可以預(yù)期。如無(wú)法準(zhǔn)確定義一個(gè)穩(wěn)定狀態(tài), 那么我們也可以退而求其次,使用多個(gè)指標(biāo)進(jìn)行聯(lián)合分析來(lái)對(duì)照。具體的聯(lián)合分析方法包括:?靜態(tài)閾值、指數(shù)平滑、雙指數(shù)平滑、貝葉斯檢測(cè)、馬爾可夫鏈蒙特卡羅方法(MCMC)、魯棒主成分分析(PCA)等。
實(shí)驗(yàn)場(chǎng)景和環(huán)境的設(shè)計(jì)
實(shí)驗(yàn)場(chǎng)景和環(huán)境的設(shè)計(jì)要努力遵循以下三大設(shè)計(jì)目標(biāo):
? 在生產(chǎn)環(huán)境運(yùn)行實(shí)驗(yàn)
? 持續(xù)自動(dòng)化運(yùn)行實(shí)驗(yàn)
? 最小化實(shí)驗(yàn)場(chǎng)景的“爆炸半徑”
故障注入場(chǎng)景
具體描述
依賴型故障
AWS 托管服務(wù)異常:ELB/S3 / DynamoDB/Lambda,...
主機(jī)型故障
EC2 實(shí)例異常終止,EC2 實(shí)例異常關(guān)閉,EBS 磁盤(pán)卷異常卸載,容器異常終止,容器異常 關(guān)閉,RDS 數(shù)據(jù)庫(kù)實(shí)例故障切換,ElastiCache 實(shí)例故障切換,...
操作系統(tǒng)內(nèi)故障
CPU、內(nèi)存、磁盤(pán)空間、IOPS 占滿或突發(fā)過(guò)高占用,大文件,只讀系統(tǒng),系統(tǒng)重啟,熵耗 盡,...
網(wǎng)絡(luò)故障
網(wǎng)絡(luò)延遲,網(wǎng)絡(luò)丟包,DNS 解析故障,DNS 緩存毒化,VIP 轉(zhuǎn)移,網(wǎng)絡(luò)黑洞,...
服務(wù)層故障
不正常關(guān)閉連接,進(jìn)程被殺死,暫停/啟用進(jìn)程,內(nèi)核奔潰,...
請(qǐng)求攔截型故障
異常請(qǐng)求,請(qǐng)求處理延遲,...
為了體現(xiàn)實(shí)驗(yàn)對(duì)照的效果,在生產(chǎn)環(huán)境 進(jìn)行的混沌實(shí)驗(yàn)可以通過(guò)真實(shí)生產(chǎn)流量分支的方式,組建控制組和對(duì)照組,以此區(qū)分故障注入的影響,從一定程 度上控制了爆炸半徑。
聯(lián)合分析
聯(lián)合分析方法包括:?靜態(tài)閾值、指數(shù)平滑、雙指數(shù)平滑、貝葉斯檢測(cè)、馬爾可夫鏈蒙特卡羅方法(MCMC)、魯棒主成分分析(PCA)等
場(chǎng)景
故障演練可適用于以下典型場(chǎng)景:
衡量微服務(wù)的容錯(cuò)能力
通過(guò)模擬調(diào)用延遲、服務(wù)不可用、機(jī)器資源滿載等,查看發(fā)生故障的節(jié)點(diǎn)或?qū)嵗欠癖蛔詣?dòng)隔離、下線,流量調(diào)度是否正確,預(yù)案是否有效,同時(shí)觀察系統(tǒng)整體的 QPS 或 RT 是否受影響。在此基礎(chǔ)上可以緩慢增加故障節(jié)點(diǎn)范圍,驗(yàn)證上游服務(wù)限流降級(jí)、熔斷等是否有效。最終故障節(jié)點(diǎn)增加到請(qǐng)求服務(wù)超時(shí),估算系統(tǒng)容錯(cuò)紅線,衡量系統(tǒng)容錯(cuò)能力。
驗(yàn)證容器編排配置是否合理
通過(guò)模擬殺服務(wù) Pod、殺節(jié)點(diǎn)、增大 Pod 資源負(fù)載,觀察系統(tǒng)服務(wù)可用性,驗(yàn)證副本配置、資源限制配置以及 Pod 下部署的容器是否合理。
測(cè)試 PaaS 層是否健壯
通過(guò)模擬上層資源負(fù)載,驗(yàn)證調(diào)度系統(tǒng)的有效性;模擬依賴的分布式存儲(chǔ)不可用,驗(yàn)證系統(tǒng)的容錯(cuò)能力;模擬調(diào)度節(jié)點(diǎn)不可用,測(cè)試調(diào)度任務(wù)是否自動(dòng)遷移到可用節(jié)點(diǎn);模擬主備節(jié)點(diǎn)故障,測(cè)試主備切換是否正常。
驗(yàn)證監(jiān)控告警的時(shí)效性
通過(guò)對(duì)系統(tǒng)注入故障,驗(yàn)證監(jiān)控指標(biāo)是否準(zhǔn)確,監(jiān)控維度是否完善,告警閾值是否合理,告警是否快速,告警接收人是否正確,通知渠道是否可用等,提升監(jiān)控告警的準(zhǔn)確和時(shí)效性。
定位與解決問(wèn)題的應(yīng)急能力
通過(guò)故障突襲,隨機(jī)對(duì)系統(tǒng)注入故障,考察相關(guān)人員對(duì)問(wèn)題的應(yīng)急能力,以及問(wèn)題上報(bào)、處理流程是否合理,達(dá)到以戰(zhàn)養(yǎng)戰(zhàn),鍛煉人定位與解決問(wèn)題的能力。
什么是架構(gòu)和架構(gòu)組件?
架構(gòu)分為水平和垂直兩個(gè)維度:
水平架構(gòu):進(jìn)程拓?fù)洹⑷萜魍負(fù)?、主機(jī)拓?fù)?/p>
垂直架構(gòu):進(jìn)程、容器和主機(jī)之間的依賴關(guān)系
架構(gòu)組件是指架構(gòu)的組成部分,包含進(jìn)程(應(yīng)用進(jìn)程、第三方組件進(jìn)程、云服務(wù))、容器、主機(jī)。
什么是熔斷降級(jí)?
熔斷降級(jí)是分布式服務(wù)中不可缺少的一種防護(hù)手段。其原理是當(dāng)應(yīng)用不穩(wěn)定時(shí),通常表現(xiàn)為響應(yīng)時(shí)間或異常比例升高,則將不穩(wěn)定應(yīng)用降級(jí)甚至熔斷,防止關(guān)聯(lián)應(yīng)用被不穩(wěn)定的應(yīng)用拖垮。
什么是系統(tǒng)防護(hù)?
系統(tǒng)防護(hù)是從系統(tǒng)表現(xiàn),例如 Load、RT、QPS 和線程數(shù)四個(gè)維度出發(fā),對(duì)應(yīng)用的入口流量進(jìn)行控制,讓系統(tǒng)盡可能跑在最大吞吐量的同時(shí)保證系統(tǒng)穩(wěn)定性。

功能特性
秒級(jí)流量分析功能,動(dòng)態(tài)規(guī)則實(shí)時(shí)推送。
專業(yè)多樣化的防護(hù)手段:
入口流量控制:按照服務(wù)容量進(jìn)行流量控制,常用于應(yīng)用入口,例如: Gateway、前端應(yīng)用、服務(wù)提供方等。
熱點(diǎn)隔離:將熱點(diǎn)和普通流量隔離出來(lái),避免無(wú)效熱點(diǎn)搶占正常流量的容量。
對(duì)依賴方隔離 / 降級(jí):對(duì)應(yīng)用和應(yīng)用之間、應(yīng)用內(nèi)部采用隔離 / 降級(jí)手段,將不穩(wěn)定的依賴的對(duì)應(yīng)用的影響減至最小,從而保證應(yīng)用的穩(wěn)定性。
系統(tǒng)防護(hù):AHAS 應(yīng)用流控降級(jí)可以根據(jù)系統(tǒng)的能力(例如 Load、CPU 使用率等)來(lái)動(dòng)態(tài)調(diào)節(jié)入口的流量,保證系統(tǒng)穩(wěn)定性。
實(shí)時(shí)的單機(jī)監(jiān)控能力,強(qiáng)大的聚合監(jiān)控和歷史監(jiān)控查詢能力。
流量控制
流量塑形
流量清洗
風(fēng)控
分流、切流量