新聞中心
一、背景
從 2010 年 Netflix 上線 Chaos Mokey 的第一個(gè)版本到現(xiàn)在,雖然混沌工程發(fā)展已歷時(shí)十年,但其實(shí)只在少數(shù)大廠里面有較成熟的落地,對(duì)絕大部分研發(fā)同學(xué)來說,混沌工程還是一個(gè)比較陌生的領(lǐng)域。

分布式和微服務(wù)化已經(jīng)成為主流的系統(tǒng)架構(gòu)設(shè)計(jì)方案,大規(guī)模分布式系統(tǒng)的可用性保障能力越來越成為關(guān)注的重點(diǎn)?;煦绻こ桃查_始如雨后春筍般在各大企業(yè)內(nèi)部萌芽生長,但大部分還處于初期的探索階段,在實(shí)踐過程中也遇到了這樣或那樣的問題,有技術(shù)上也有認(rèn)知層面上的,這些問題難免會(huì)對(duì)混沌工程的快速落地產(chǎn)生阻力。
下面介紹一下字節(jié)跳動(dòng)在混沌工程實(shí)踐過程中的一個(gè)關(guān)鍵階段:場(chǎng)景化主動(dòng)實(shí)驗(yàn)。希望本文可以幫助大家加深對(duì)混沌工程價(jià)值的了解,對(duì)設(shè)計(jì)混沌工程實(shí)驗(yàn)、落地混沌工程建設(shè)提供更多的思路。
二、什么是場(chǎng)景化主動(dòng)實(shí)驗(yàn)
混沌工程的高級(jí)原則要求能夠在生產(chǎn)環(huán)境自動(dòng)的運(yùn)行實(shí)驗(yàn),這個(gè)目標(biāo)并不是一蹴而就的。
根據(jù)混沌工程成熟度模型(CMM)[4]說明,要分別從“熟練度”和“應(yīng)用度”兩個(gè)維度同時(shí)進(jìn)行建設(shè)。其中,“熟練度”體現(xiàn)了混沌工程系統(tǒng)的有效性和安全性,“應(yīng)用度”衡量了混沌工程實(shí)驗(yàn)覆蓋的廣度和深度。在混沌工程建設(shè)的中前期,這兩點(diǎn)都是混沌工程成功落地的關(guān)鍵路徑。
在混沌工程的初級(jí)階段,通常都會(huì)建設(shè)一個(gè)故障注入測(cè)試平臺(tái)(FIT,F(xiàn)ault Inject Testing),集成一些常見的故障場(chǎng)景或異常事件的模擬能力,由業(yè)務(wù)或 QA 同學(xué)設(shè)計(jì)并執(zhí)行實(shí)驗(yàn)來驗(yàn)證系統(tǒng)的韌性能力。
在這個(gè)階段,基礎(chǔ)架構(gòu)和業(yè)務(wù)系統(tǒng)的實(shí)現(xiàn)都可能處于比較粗放狀態(tài),混沌工程平臺(tái)的故障注入能力需要兼容各種業(yè)務(wù)架構(gòu)的實(shí)現(xiàn)方案和軟硬件環(huán)境,執(zhí)行實(shí)驗(yàn)時(shí),業(yè)務(wù)同學(xué)不僅要設(shè)計(jì)實(shí)驗(yàn)的故障場(chǎng)景(機(jī)房網(wǎng)絡(luò)故障、下游服務(wù)宕機(jī)等)、配置演練環(huán)境(目標(biāo)服務(wù)、實(shí)驗(yàn)集群等控制實(shí)驗(yàn)的爆炸半徑),還要找到能夠描述實(shí)驗(yàn)時(shí)服務(wù)狀態(tài)的穩(wěn)定性的指標(biāo)(如 metrics、日志或告警等),然后手動(dòng)啟動(dòng)實(shí)驗(yàn),執(zhí)行人還要不停的觀察穩(wěn)定性指標(biāo)的變化,判斷系統(tǒng)的容災(zāi)邏輯或彈性策略是否被正確觸發(fā)、業(yè)務(wù)系統(tǒng)的表現(xiàn)是否符合預(yù)期等等。如果在執(zhí)行過程中發(fā)現(xiàn)異常,需要立刻終止實(shí)驗(yàn),收斂實(shí)驗(yàn)影響。
整個(gè)實(shí)驗(yàn)過程的人力成本較高,實(shí)驗(yàn)的操作門檻也較高,再加上這個(gè)階段業(yè)務(wù)同學(xué)對(duì)混沌工程價(jià)值和理念的認(rèn)知還處于較初級(jí)水平,很難會(huì)主動(dòng)對(duì)自己的服務(wù)設(shè)計(jì)實(shí)驗(yàn),更無法保證實(shí)驗(yàn)的常態(tài)化執(zhí)行。因此,混沌工程實(shí)驗(yàn)的時(shí)效性和業(yè)務(wù)系統(tǒng)的彈性容災(zāi)策略持續(xù)有效就比較難以保證了。
如何突破這個(gè)階段、成功抵達(dá)混沌工程的終極目標(biāo)呢?
通過不斷的思考,我們認(rèn)為混沌工程建設(shè)需要一個(gè)過渡階段,即場(chǎng)景化主動(dòng)演練。
所謂場(chǎng)景化主動(dòng)演練,就是在明確混沌工程的終極建設(shè)目標(biāo)的前提下,以終為始,分階段去設(shè)計(jì)混沌工程的實(shí)驗(yàn)標(biāo)準(zhǔn)、定義技術(shù)規(guī)范,搭配工程化能力,逐步將人和業(yè)務(wù)引導(dǎo)到混沌工程建設(shè)的高速公路上,共同推進(jìn) CMM 模型的熟練度和應(yīng)用度。
所以,場(chǎng)景化主動(dòng)實(shí)驗(yàn)是通向混沌工程自動(dòng)化建設(shè)的關(guān)鍵路徑。
混沌工程演變圖
三、如何建設(shè)場(chǎng)景化主動(dòng)實(shí)驗(yàn)
首先需要明確混沌工程的最終目標(biāo),以終為始,反推當(dāng)前階段應(yīng)該建設(shè)什么樣的技術(shù)規(guī)范和標(biāo)準(zhǔn)能力。
然后,根據(jù)業(yè)務(wù)當(dāng)前的基礎(chǔ)架構(gòu)現(xiàn)狀和實(shí)驗(yàn)訴求構(gòu)建一個(gè)通用的實(shí)驗(yàn)場(chǎng)景,由混沌工程平臺(tái)方在保證實(shí)驗(yàn)風(fēng)險(xiǎn)可控的條件下主動(dòng)對(duì)業(yè)務(wù)系統(tǒng)進(jìn)行實(shí)驗(yàn)。這樣,在滿足業(yè)務(wù)需要的同時(shí)又可以推動(dòng)相關(guān)技術(shù)規(guī)范和基礎(chǔ)能力的建設(shè),而且對(duì)業(yè)務(wù)同學(xué)的資源依賴較少。
以字節(jié)跳動(dòng)為例,要實(shí)現(xiàn)在生產(chǎn)環(huán)境自動(dòng)的執(zhí)行可控的混沌工程實(shí)驗(yàn),當(dāng)前階段應(yīng)該具備的能力包括:
- 能夠在生產(chǎn)環(huán)境持續(xù)的運(yùn)行實(shí)驗(yàn)并具備實(shí)驗(yàn)爆炸半徑的控制能力
- 選定一個(gè)命中業(yè)務(wù)痛點(diǎn)且通用的實(shí)驗(yàn)場(chǎng)景,構(gòu)建通用的自動(dòng)化執(zhí)行實(shí)驗(yàn)?zāi)芰?/li>
- 能夠描述服務(wù)穩(wěn)定性的通用指標(biāo)
- 自動(dòng)檢測(cè)穩(wěn)定性指標(biāo)的變化
- 自動(dòng)終止實(shí)驗(yàn)【在實(shí)驗(yàn)爆炸半徑可控的情況下,非必須】
場(chǎng)景主動(dòng)實(shí)驗(yàn)?zāi)芰ν負(fù)鋱D
四、主動(dòng)實(shí)驗(yàn)
FIT 平臺(tái)需要業(yè)務(wù)同學(xué)分析業(yè)務(wù)容災(zāi)場(chǎng)景并制定實(shí)驗(yàn),然后執(zhí)行實(shí)驗(yàn)進(jìn)行驗(yàn)證,混沌工程平臺(tái)方只是給予一些技術(shù)支持和建議。在業(yè)務(wù)同學(xué)對(duì)混沌工程認(rèn)知度不高情況下,實(shí)驗(yàn)的主動(dòng)性、覆蓋率、時(shí)效性都很難保證,如果再想讓業(yè)務(wù)同學(xué)去配合建設(shè)一些混沌工程的基礎(chǔ)能力難度就可想而知。
轉(zhuǎn)換一下思路,將業(yè)務(wù)主動(dòng)改為平臺(tái)主動(dòng)!由混沌平臺(tái)針對(duì)業(yè)務(wù)系統(tǒng)的某個(gè)場(chǎng)景主動(dòng)執(zhí)行混動(dòng)實(shí)驗(yàn)來驗(yàn)證服務(wù)的彈性能力,業(yè)務(wù)同學(xué)只需關(guān)注實(shí)驗(yàn)結(jié)果。只要實(shí)驗(yàn)場(chǎng)景契合業(yè)務(wù)痛點(diǎn)、實(shí)驗(yàn)結(jié)果對(duì)業(yè)務(wù)構(gòu)建彈性系統(tǒng)有意義,業(yè)務(wù)同學(xué)自然會(huì)認(rèn)可混沌工程的價(jià)值,也會(huì)更加積極的參與混沌工程實(shí)驗(yàn)和混沌工程的基礎(chǔ)建設(shè)。
五、實(shí)驗(yàn)場(chǎng)景
混沌工程的價(jià)值是發(fā)現(xiàn)業(yè)務(wù)系統(tǒng)中潛在薄弱環(huán)節(jié),提升業(yè)務(wù)系統(tǒng)韌性能力,即服務(wù)可用性和穩(wěn)定性,所以主動(dòng)實(shí)驗(yàn)場(chǎng)景也應(yīng)該滿足這個(gè)前提。
在字節(jié)跳動(dòng),主動(dòng)實(shí)驗(yàn)落地的第一個(gè)場(chǎng)景是驗(yàn)證服務(wù)調(diào)用鏈的強(qiáng)弱依賴關(guān)系。所謂強(qiáng)弱依賴關(guān)系,就是當(dāng)訪問的下游服務(wù)異常(服務(wù)宕機(jī)、響應(yīng)超時(shí)、接口返回失敗等)時(shí),調(diào)用方的穩(wěn)定性和可用性是否會(huì)受到影響。例如,查詢緩存 miss 或失敗后可以繼續(xù)回源訪問數(shù)據(jù)庫,緩存的問題并不會(huì)影響服務(wù)可用性,這個(gè)緩存就是個(gè)弱依賴。
為什么要選擇這個(gè)場(chǎng)景呢?公司的很多線上運(yùn)營事故都是因?yàn)椴缓侠淼囊蕾囮P(guān)系導(dǎo)致的。字節(jié)跳動(dòng)有很多高 QPS 的海量服務(wù)系統(tǒng),為了保證用戶體驗(yàn),對(duì)高可用高穩(wěn)定性的要求很高,會(huì)通過各種緩存、服務(wù)兜底、數(shù)據(jù)兜底等容災(zāi)策略來減少強(qiáng)依賴服務(wù)的數(shù)量。另外,在字節(jié)跳動(dòng)的服務(wù)治理體系中,會(huì)根據(jù)服務(wù)間的強(qiáng)弱依賴調(diào)用關(guān)系為某些故障場(chǎng)景預(yù)設(shè)自動(dòng)容災(zāi)降級(jí)的策略。比如,當(dāng)服務(wù)治理系統(tǒng)檢測(cè)到系統(tǒng)負(fù)載過高時(shí),能夠自動(dòng)對(duì)弱依賴的下游執(zhí)行降級(jí),通過 FailFast 來緩解系統(tǒng)的負(fù)載。因此,業(yè)務(wù)負(fù)責(zé)人通常都會(huì)比較關(guān)注服務(wù)的強(qiáng)弱依賴關(guān)系。
服務(wù)依賴調(diào)用鏈
六、自動(dòng)化
主動(dòng)設(shè)計(jì)和執(zhí)行實(shí)驗(yàn)意味著將業(yè)務(wù)側(cè)的人力成本轉(zhuǎn)嫁給了混沌平臺(tái),混沌平臺(tái)必須要借助通用化、自動(dòng)化的執(zhí)行能力來降低人力成本。需要強(qiáng)調(diào)的是,這里的通用化和自動(dòng)化一定是和混沌工程的終極目標(biāo)一致的,能夠承載過渡階段的職責(zé)。
可以從混沌工程的高級(jí)原則[2]進(jìn)行剖析:
- 服務(wù)的穩(wěn)定狀態(tài)假設(shè):找出能夠描述服務(wù)穩(wěn)定狀態(tài)的通用指標(biāo),可以是 metrics、告警等。執(zhí)行實(shí)驗(yàn)前,這些穩(wěn)定狀態(tài)指標(biāo)應(yīng)處于穩(wěn)定狀態(tài);執(zhí)行實(shí)驗(yàn)時(shí),如果服務(wù)的可用性或穩(wěn)定性受到影響時(shí),穩(wěn)定性指標(biāo)會(huì)發(fā)生變化,比如 metrics 曲線的劇烈波動(dòng)、觸發(fā)告警等;當(dāng)實(shí)驗(yàn)結(jié)束后,穩(wěn)定性指標(biāo)又會(huì)恢復(fù)到之前的穩(wěn)定狀態(tài)。如果執(zhí)行實(shí)驗(yàn)時(shí),穩(wěn)定狀態(tài)假設(shè)發(fā)生了變化,說明這是個(gè)強(qiáng)依賴。
- 生產(chǎn)環(huán)境運(yùn)行實(shí)驗(yàn):在風(fēng)險(xiǎn)可控的條件下推薦在生產(chǎn)環(huán)境運(yùn)行實(shí)驗(yàn),因?yàn)橄到y(tǒng)的行為會(huì)根據(jù)環(huán)境和流量模式的不同而有所不同,系統(tǒng)用戶也不會(huì)像你所預(yù)期的那樣與你的系統(tǒng)進(jìn)行交互。當(dāng)然,在生產(chǎn)環(huán)境執(zhí)行混沌工程實(shí)驗(yàn)很可能是有損的,為了避免對(duì)用戶體驗(yàn)產(chǎn)生較大影響,一定要控制好實(shí)驗(yàn)的爆炸半徑,比如篩選出少量的實(shí)驗(yàn)流量,這就要求混沌平臺(tái)具備實(shí)驗(yàn)流量篩選與調(diào)度的能力。
- 多樣化現(xiàn)實(shí)世界事件:也就是各種故障的模擬能力。因?yàn)槭菆?chǎng)景化實(shí)驗(yàn),所以對(duì)多樣化的訴求倒不像 FIT 那樣強(qiáng)烈。
- 最小化“爆炸半徑”:如果選擇在線上環(huán)境執(zhí)行實(shí)驗(yàn),需要具備篩選實(shí)驗(yàn)流量的能力,即篩選出滿足實(shí)驗(yàn)所需的最小流量即可,嚴(yán)格控制“爆炸”的影響范圍。
- 持續(xù)自動(dòng)化運(yùn)行實(shí)驗(yàn):通過工程化能力將實(shí)驗(yàn)?zāi)繕?biāo)過濾、實(shí)驗(yàn)流量篩選、執(zhí)行實(shí)驗(yàn)、穩(wěn)定狀態(tài)檢測(cè)、生成實(shí)驗(yàn)報(bào)表、實(shí)驗(yàn)結(jié)果反饋收集等流程串聯(lián)成自動(dòng)化的執(zhí)行流,減少人力依賴。另外,混沌工程實(shí)驗(yàn)從來都不是一錘子買賣,應(yīng)該通過常態(tài)化的運(yùn)行實(shí)驗(yàn)來持續(xù)的保證服務(wù)的高可用和彈性機(jī)制符合預(yù)期。
混沌工程高級(jí)原則
七、服務(wù)標(biāo)準(zhǔn)與技術(shù)規(guī)范
一個(gè)公司內(nèi)部通常會(huì)有很多條產(chǎn)品線,每個(gè)產(chǎn)品又會(huì)包含很多微服務(wù),還會(huì)依賴到中臺(tái)服務(wù)或基礎(chǔ)組件,這些不同模塊的開發(fā)語言、服務(wù)框架、技術(shù)棧等可能五花八門。要想實(shí)現(xiàn)混沌工程通用化與自動(dòng)化的能力,就必須制定一些通用的服務(wù)標(biāo)準(zhǔn)和技術(shù)規(guī)范。
混沌工程不僅需要了解業(yè)務(wù)系統(tǒng)當(dāng)前的技術(shù)棧,還要能夠預(yù)測(cè)未來的技術(shù)發(fā)展趨勢(shì),幫助業(yè)務(wù)提前規(guī)劃切實(shí)可行的技術(shù)規(guī)范并協(xié)助進(jìn)行建設(shè)。
舉個(gè)例子,如何定義服務(wù)的穩(wěn)定狀態(tài)?
在字節(jié)跳動(dòng),我們以調(diào)用方視角定義了一個(gè)服務(wù)級(jí)別的 metrics 指標(biāo)來描述服務(wù)的穩(wěn)定性狀態(tài):
- 被調(diào)方在響應(yīng)包中添加一個(gè)通用的 stability 字段來標(biāo)識(shí)本次請(qǐng)求的處理結(jié)果是否成功
- 調(diào)用方從響應(yīng)包中解析出 stability 字段并上報(bào) metrics。某些異常場(chǎng)景(如被調(diào)方無響應(yīng))導(dǎo)致調(diào)用方無法解析出 stability 字段,會(huì)上報(bào)一個(gè)特殊的不穩(wěn)定值。
之所以要在響應(yīng)包中單獨(dú)定義一個(gè) stability 字段是為了區(qū)分開系統(tǒng)錯(cuò)誤和業(yè)務(wù)錯(cuò)誤。因?yàn)闃I(yè)務(wù)錯(cuò)誤并不表示服務(wù)出現(xiàn)了問題,所以我們更關(guān)注系統(tǒng)錯(cuò)誤。舉個(gè)例子,刪除好友時(shí)被調(diào)方返回好友不存在的錯(cuò)誤,這個(gè)錯(cuò)誤并不表示系統(tǒng)的穩(wěn)定性出現(xiàn)了問題。
這個(gè)規(guī)范最開始只在字節(jié)跳動(dòng)的少數(shù)核心服務(wù)中使用,其他服務(wù)通常都有自己的穩(wěn)定性指標(biāo),有些服務(wù)可能需要多個(gè) metrics 指標(biāo)一起來描述服務(wù)的穩(wěn)定性。因?yàn)榛煦绻こ痰耐ㄓ眯砸髴?yīng)該具備一種通用的指標(biāo)來描述所有服務(wù)的穩(wěn)定性狀態(tài),經(jīng)過評(píng)估,我們將 stability metrics 作為了混沌工程的服務(wù)通用穩(wěn)定性描述指標(biāo),并計(jì)劃將其推廣到全公司的業(yè)務(wù),無論什么服務(wù)框架和開發(fā)語言都可以低成本的快速實(shí)現(xiàn)。
八、字節(jié)跳動(dòng)的混沌工程概況
字節(jié)跳動(dòng)的混沌工程體系主要包括場(chǎng)景化主動(dòng)實(shí)驗(yàn)平臺(tái)、FIT 平臺(tái)和紅藍(lán)對(duì)抗平臺(tái)。
- 場(chǎng)景化主動(dòng)實(shí)驗(yàn)平臺(tái):以平臺(tái)視角主動(dòng)對(duì)業(yè)務(wù)發(fā)起混沌實(shí)驗(yàn),在驗(yàn)證業(yè)務(wù)系統(tǒng)的高可用和彈性能力的同時(shí)推動(dòng)服務(wù)標(biāo)準(zhǔn)化和技術(shù)標(biāo)準(zhǔn)化建設(shè),提升混沌工程價(jià)值產(chǎn)出和影響力,為實(shí)現(xiàn)混沌工程的終極目標(biāo)做好鋪墊。
- FIT 平臺(tái):業(yè)務(wù)同學(xué)自助驗(yàn)證服務(wù)容災(zāi)機(jī)制的正確性,具備各種異常事件和故障模擬能力,提供了靈活的可視化實(shí)驗(yàn)編排能力。
- 紅藍(lán)對(duì)抗平臺(tái):以第三方視角,用系統(tǒng)化、隨機(jī)化的對(duì)抗實(shí)驗(yàn)方式來驗(yàn)證業(yè)務(wù)系統(tǒng)的高可用水平、監(jiān)控和告警的有效性,以及異常情況下人工介入時(shí)機(jī)、故障定位和故障恢復(fù)時(shí)間是否達(dá)標(biāo)等。
字節(jié)跳動(dòng)混沌工程整體架構(gòu)圖
九、字節(jié)跳動(dòng)的場(chǎng)景化主動(dòng)實(shí)驗(yàn)建設(shè)方案
場(chǎng)景化主動(dòng)實(shí)驗(yàn)的流程圖
1. 實(shí)驗(yàn)?zāi)繕?biāo)
同時(shí)推進(jìn)混沌工程建設(shè)的“熟練度”和“應(yīng)用度”,以生產(chǎn)環(huán)境自動(dòng)執(zhí)行混沌工程實(shí)驗(yàn)為目標(biāo)構(gòu)建場(chǎng)景化主動(dòng)實(shí)驗(yàn)的流程和標(biāo)準(zhǔn),實(shí)驗(yàn)場(chǎng)景選定為驗(yàn)證服務(wù)間的強(qiáng)弱依賴調(diào)用關(guān)系,可自動(dòng)化運(yùn)行實(shí)驗(yàn),具備實(shí)驗(yàn)爆炸半徑控制能力。
通過驗(yàn)證強(qiáng)弱依賴調(diào)用關(guān)系的正確性反推服務(wù)的穩(wěn)定性指標(biāo)是否規(guī)范,推動(dòng)穩(wěn)定性指標(biāo)的規(guī)范落地。
2. 實(shí)驗(yàn)對(duì)象
優(yōu)先在字節(jié)跳動(dòng)的核心服務(wù)落地,樹立模范標(biāo)桿,然后擴(kuò)展到更大范圍。
3. 穩(wěn)定性指標(biāo)&波動(dòng)自動(dòng)化檢測(cè)
穩(wěn)定指標(biāo):
因?yàn)?stability metrics 已經(jīng)被多數(shù)核心服務(wù)當(dāng)做通用的穩(wěn)定性描述指標(biāo),所以場(chǎng)景化主動(dòng)演練將 stability metrics 作為穩(wěn)定性描述的核心指標(biāo),同時(shí)輔助判斷接口成功 qps、失敗 qps、調(diào)用下游成功 qps、失敗 qps、pct99 等指標(biāo)。
指標(biāo)波動(dòng)檢測(cè)方案:
自動(dòng)化執(zhí)行實(shí)驗(yàn)要求混沌平臺(tái)能夠自動(dòng)檢測(cè)穩(wěn)定性指標(biāo)的變動(dòng),因?yàn)椴煌?wù)的指標(biāo)曲線是不一樣的,同一服務(wù)的不同時(shí)刻的指標(biāo)曲線也是不一樣的,所以預(yù)置曲線波動(dòng)的閾值上限的效果肯定不會(huì)太好。因此,在項(xiàng)目啟動(dòng)階段我們就直接探索自動(dòng)化的動(dòng)態(tài)檢測(cè) metrics 曲線波動(dòng)的方案:
- 一種是 Netflix 介紹的 AB test 方案,對(duì)比實(shí)驗(yàn)曲線和樣本曲線的差異
- 一種是實(shí)時(shí)計(jì)算曲線的變化趨勢(shì)
由于方案一要求具備更靈活的流量篩選能力和實(shí)驗(yàn)環(huán)境隔離能力,當(dāng)前階段的建設(shè)難度和成本較高,所以我們選擇了方案二。
自動(dòng)化波動(dòng)檢測(cè):
- 起初我們參考線上報(bào)警的檢測(cè)方案:在執(zhí)行主動(dòng)演練時(shí),先通過機(jī)器學(xué)習(xí)為穩(wěn)定性指標(biāo)實(shí)時(shí)訓(xùn)練檢測(cè)模型,然后用模型實(shí)時(shí)檢測(cè)指標(biāo)曲線的變化。但是,因?yàn)橹鲃?dòng)實(shí)驗(yàn)的時(shí)間較短(一個(gè)實(shí)驗(yàn)節(jié)點(diǎn)只有 60~120 秒)、metrics 數(shù)據(jù)點(diǎn)稀疏(一個(gè)節(jié)點(diǎn)的實(shí)驗(yàn)時(shí)間只能采集到 2~4 個(gè)數(shù)據(jù)點(diǎn))、實(shí)驗(yàn)流量較低(爆炸半徑控制在 5~10 QPS),所以基于機(jī)器學(xué)習(xí)的檢測(cè)效果并不理想。
于是,我們改成組合多種統(tǒng)計(jì)規(guī)則的檢測(cè)算法,根據(jù)最近一段時(shí)間的歷史數(shù)據(jù)動(dòng)態(tài)生成曲線的合理波動(dòng)范圍閾值,然后在實(shí)驗(yàn)過程中實(shí)時(shí)檢測(cè)增量數(shù)據(jù)點(diǎn)的波動(dòng)范圍。如果數(shù)據(jù)點(diǎn)超出了波動(dòng)范圍閾值,就被判定為不穩(wěn)定。
經(jīng)過不斷調(diào)優(yōu),最終把這個(gè)場(chǎng)景下的指標(biāo)檢測(cè)效果優(yōu)化到了預(yù)期水平。
優(yōu)化方案:
- 在實(shí)踐中,我們發(fā)現(xiàn)單個(gè)穩(wěn)定性指標(biāo)的曲線會(huì)偶現(xiàn)非預(yù)期的波動(dòng)噪音,這些噪音會(huì)影響曲線檢測(cè)結(jié)果的準(zhǔn)確率。
于是,我們?cè)黾恿艘粋€(gè)噪音過濾策略:通過對(duì)比有相關(guān)性的多條穩(wěn)定性指標(biāo)曲線的波動(dòng)相似度來過濾噪音。舉個(gè)例子,對(duì)下游依賴服務(wù)注入故障后,調(diào)用下游服務(wù)失敗的 metrics 曲線會(huì)上升,如果穩(wěn)定性指標(biāo)曲線也上升,而且這兩個(gè)曲線的變化趨勢(shì)也相似時(shí),才會(huì)認(rèn)為曲線變化是受實(shí)驗(yàn)的影響。這個(gè)策略能夠比較有效的過濾掉偶現(xiàn)的曲線波動(dòng)噪音。
具備了穩(wěn)定狀態(tài)的檢測(cè)能力,在場(chǎng)景化主動(dòng)實(shí)驗(yàn)時(shí)就可以根據(jù)穩(wěn)定狀態(tài)的檢測(cè)結(jié)果自動(dòng)推斷下游依賴服務(wù)是強(qiáng)依賴還是弱依賴。
4. 最小化爆炸半徑控制
為了保證實(shí)驗(yàn)的通用性和降低構(gòu)造實(shí)驗(yàn)流量的成本,我們選定在生產(chǎn)環(huán)境執(zhí)行實(shí)驗(yàn),因此最小化爆炸半徑控制能力就非常重要了。
字節(jié)跳動(dòng)的生產(chǎn)環(huán)境有個(gè)用于服務(wù)灰度上線的金絲雀集群,在服務(wù)上線時(shí)會(huì)先升級(jí)這個(gè)集群來驗(yàn)證服務(wù)的正確性。這個(gè)集群的實(shí)例比較少,且支持通過修改集群權(quán)重來調(diào)整進(jìn)入集群流量。
經(jīng)過驗(yàn)證,實(shí)驗(yàn)流量在 5~10QPS 時(shí)就可以保證穩(wěn)定性 metrics 指標(biāo)檢測(cè)的準(zhǔn)確率。所以,執(zhí)行實(shí)驗(yàn)時(shí),先從服務(wù)的金絲雀集群中隨機(jī)選擇一個(gè)實(shí)例作為實(shí)驗(yàn)?zāi)繕?biāo),計(jì)算實(shí)例流量與預(yù)期流量的偏差重新生成權(quán)重值,然后通過修改集群權(quán)重來調(diào)整實(shí)例流量。
5. 驗(yàn)證方式
字節(jié)跳動(dòng)的微服務(wù)管理平臺(tái)通過聚合服務(wù)的 Trace 日志生成了服務(wù)間的調(diào)用拓?fù)鋱D,通過 OpenAPI 可以查詢到某個(gè)服務(wù)的所有一級(jí)下游依賴服務(wù)列表。
然后,逐個(gè)對(duì)下游依賴服務(wù)注入一段時(shí)間的宕機(jī)故障,同時(shí)檢測(cè)服務(wù)的穩(wěn)定性指標(biāo)是否出現(xiàn)異常波動(dòng)來推斷下游依賴服務(wù)是強(qiáng)依賴還是弱依賴。
需要注意的是,因?yàn)槭侵饌€(gè)對(duì)下游依賴服務(wù)執(zhí)行實(shí)驗(yàn),為了避免前一個(gè)實(shí)驗(yàn)對(duì)下一個(gè)實(shí)驗(yàn)產(chǎn)生干擾,我們?cè)趦纱螌?shí)驗(yàn)間增加了一個(gè)間隔時(shí)間,具體的間隔時(shí)長依賴所使用的指標(biāo)檢測(cè)算法。
6. 實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)執(zhí)行結(jié)束,平臺(tái)會(huì)將下游依賴服務(wù)的強(qiáng)弱依賴推斷結(jié)果、執(zhí)行上下文、穩(wěn)態(tài)指標(biāo)監(jiān)控視圖和檢測(cè)結(jié)果等匯總成一個(gè)實(shí)驗(yàn)報(bào)告發(fā)送給服務(wù)負(fù)責(zé)人。
服務(wù)負(fù)責(zé)人確認(rèn)實(shí)驗(yàn)報(bào)告,如果發(fā)現(xiàn)實(shí)驗(yàn)結(jié)果不符合預(yù)期,可以通過執(zhí)行上下文和監(jiān)控視圖等信息來輔助定位問題。同時(shí),可以在實(shí)驗(yàn)報(bào)告中備注不符合預(yù)期原因、問題修復(fù)方案和修復(fù)進(jìn)度等,平臺(tái)會(huì)定時(shí)跟進(jìn)修復(fù)進(jìn)度并提醒服務(wù)負(fù)責(zé)人更新結(jié)果。
如果實(shí)驗(yàn)結(jié)果符合預(yù)期或問題已完成修復(fù),實(shí)驗(yàn)報(bào)告會(huì)進(jìn)入結(jié)單狀態(tài),同時(shí)記錄服務(wù)的強(qiáng)弱依賴推斷結(jié)果,并輸出給服務(wù)治理平臺(tái),應(yīng)用于服務(wù)在線治理。
7. 實(shí)驗(yàn)結(jié)果自動(dòng)保準(zhǔn)
業(yè)務(wù)系統(tǒng)是持續(xù)迭代的,下游依賴關(guān)系也是動(dòng)態(tài)變化的。如果非預(yù)期的引入了強(qiáng)依賴,會(huì)給系統(tǒng)增加可用性風(fēng)險(xiǎn),因此場(chǎng)景化主動(dòng)實(shí)驗(yàn)也需要常態(tài)化執(zhí)行。
已完成的主動(dòng)實(shí)驗(yàn)都可以開啟試驗(yàn)結(jié)果自動(dòng)保準(zhǔn),每隔一定時(shí)間會(huì)自動(dòng)執(zhí)行實(shí)驗(yàn)驗(yàn)證下游依賴服務(wù)的強(qiáng)弱依賴關(guān)系,并與歷史實(shí)驗(yàn)結(jié)果進(jìn)行對(duì)比,并將變動(dòng)的部分通過實(shí)驗(yàn)報(bào)告發(fā)送給服務(wù)負(fù)責(zé)人。
經(jīng)過服務(wù)負(fù)責(zé)人確認(rèn)后,新的驗(yàn)證結(jié)果會(huì)被更新到存儲(chǔ)和發(fā)送給服務(wù)治理平臺(tái)。
8. 完整的實(shí)驗(yàn)流程
場(chǎng)景化主動(dòng)實(shí)驗(yàn)流程圖
十、場(chǎng)景化主動(dòng)實(shí)驗(yàn)的價(jià)值
我們的驗(yàn)證范圍從核心服務(wù)開始、逐漸向外圍服務(wù)擴(kuò)張。
核心服務(wù)的驗(yàn)證結(jié)果基本符合預(yù)期,但還是有少數(shù)個(gè)案存在穩(wěn)定性指標(biāo)不規(guī)范、容災(zāi)邏輯不符合預(yù)期的情況。通過實(shí)驗(yàn)結(jié)果自動(dòng)保準(zhǔn)機(jī)制,也多次及時(shí)發(fā)現(xiàn)因代碼變更所導(dǎo)致的容災(zāi)邏輯失效情況。
外圍服務(wù)驗(yàn)證出來的問題就比較多了,穩(wěn)定性指標(biāo)嚴(yán)重不規(guī)范導(dǎo)致無法評(píng)估服務(wù)的穩(wěn)定性、容災(zāi)邏輯覆蓋率低導(dǎo)致過多的強(qiáng)依賴使得服務(wù)可用性風(fēng)險(xiǎn)較高等等。需要持續(xù)的推動(dòng)業(yè)務(wù)進(jìn)行優(yōu)化升級(jí),并給予一些高可用彈性系統(tǒng)的建設(shè)思路或參考方案。
十一、場(chǎng)景化主動(dòng)實(shí)驗(yàn)近期工作
最近,我們新上線了在結(jié)果保準(zhǔn)時(shí)自動(dòng)對(duì)弱依賴服務(wù)注入隨機(jī)故障來進(jìn)一步探索弱依賴的抗風(fēng)險(xiǎn)能力。我們認(rèn)為弱依賴服務(wù)在任何故障場(chǎng)景下都不應(yīng)該影響服務(wù)的可用性。
另外,場(chǎng)景化主動(dòng)實(shí)驗(yàn)還接入了服務(wù)的上線流程,在服務(wù)灰度上線時(shí)就觸發(fā)實(shí)驗(yàn),讓服務(wù)負(fù)責(zé)人能夠更及時(shí)的發(fā)現(xiàn)不符合預(yù)期的系統(tǒng)變更,如果有必要可立刻終止或回滾上線變更。
十二、場(chǎng)景化主動(dòng)實(shí)驗(yàn)的未來規(guī)劃
通過場(chǎng)景化主動(dòng)實(shí)驗(yàn),我們已具備持續(xù)保障字節(jié)跳動(dòng)核心服務(wù)的穩(wěn)定性、指標(biāo)規(guī)范性、強(qiáng)弱依賴正確性,以及弱依賴的抗風(fēng)險(xiǎn)能力等等。
接下來,我們會(huì)把場(chǎng)景化主動(dòng)實(shí)驗(yàn)擴(kuò)展到更大服務(wù)范圍和更多業(yè)務(wù)場(chǎng)景,讓場(chǎng)景化主動(dòng)實(shí)驗(yàn)發(fā)揮出更大的價(jià)值。
另外,我們也在思考打通服務(wù)上下游,從點(diǎn)到線再到面,以更高維度的系統(tǒng)視角來探索啟發(fā)式的智能混沌實(shí)驗(yàn)。
當(dāng)前名稱:迄今見過最易懂的混沌工程落地實(shí)踐,針不戳!
標(biāo)題來源:http://www.dlmjj.cn/article/ccehooc.html


咨詢
建站咨詢
