“混沌工程實驗性價比太低了。測試、研發(fā)和運維三個部門都投入了大量人力物力,在準(zhǔn)生產(chǎn)環(huán)境做了不少故障注入實驗。但發(fā)現(xiàn)的問題還是比較少。”在一次混沌工程實踐回顧會上,一位測試人員如是說。
近十幾年來,隨著企業(yè)業(yè)務(wù)不斷微服務(wù)化,并遷移到復(fù)雜分布式的云生產(chǎn)環(huán)境,云上各個微服務(wù)業(yè)務(wù)系統(tǒng)之間相互訪問的穩(wěn)定性,以及與所依賴的第三方系統(tǒng)之間相互訪問的穩(wěn)定性,都會受到錯綜復(fù)雜的云生產(chǎn)環(huán)境的未知暗債(“暗債”是 IT 系統(tǒng)中具有以下特點的漏洞——在引發(fā)故障之前,這些漏洞不為人知或不可見。"暗債“源自物理學(xué)術(shù)語“暗物質(zhì)”,兩者都能影響世界,但人們卻無法直接檢測或看到它們。)的影響,而損害業(yè)務(wù)連續(xù)性。混沌工程就是業(yè)界在應(yīng)對上述問題的過程中孕育而生的良好實踐。
通過在測試環(huán)境和生產(chǎn)環(huán)境上,注入經(jīng)過精心設(shè)計并控制好爆炸半徑的故障,進行故障注入實驗,就可以觀察和學(xué)習(xí)復(fù)雜分布式系統(tǒng)的運行模式和失效模式,從而提升團隊的系統(tǒng)穩(wěn)定性設(shè)計,讓團隊能夠快速應(yīng)對業(yè)務(wù)系統(tǒng)在云環(huán)境上的未知故障。
我們知道,要想保持業(yè)務(wù)系統(tǒng)在云環(huán)境上運行的穩(wěn)定性,離不開包括業(yè)務(wù)、研發(fā)、測試和運維部門的密切協(xié)作。這家企業(yè)的這4個部門的協(xié)作情況是怎樣的呢?
最先響應(yīng)運維部門實踐混沌工程召喚的,是測試部門。測試部門認(rèn)為混沌工程的故障注入實驗,能豐富他們的壓力測試和探索性測試的場景,從而發(fā)現(xiàn)更多軟件缺陷。
然而相比之下,研發(fā)和業(yè)務(wù)部門的一線人員對此的參與度卻不夠高。他們認(rèn)為,混沌工程的故障注入實驗,其實就是另一種測試而已。
確實,測試部門就是把混沌工程故障注入實驗,當(dāng)作探索性測試來做的?!盎煦绻こ虒嶒灒愃朴谔剿餍詼y試。實驗本身沒有明確的輸入和預(yù)期的結(jié)果,而是通過對系統(tǒng)和服務(wù)的干預(yù),來觀察系統(tǒng)的反應(yīng)?!睖y試人員在測試總結(jié)中這樣寫道。
缺乏明確的穩(wěn)態(tài)行為假說
由于測試人員使用探索性測試的方法,來實踐混沌工程故障注入實驗,所以在實驗結(jié)果報告中,找不到“系統(tǒng)穩(wěn)態(tài)行為假說”的字眼。只是在“風(fēng)險問題”的以下描述中,隱約看到穩(wěn)態(tài)行為假說的影子:“預(yù)期主節(jié)點的docker服務(wù)關(guān)閉后,kubelet/api/etcd/controllers等pod會失效,之后這些核心服務(wù)的進程會重啟,能繼續(xù)提供服務(wù)”。
隱含的穩(wěn)態(tài)行為假說沒有反映用戶價值
從上面的描述能看出,這個混沌工程實驗的穩(wěn)態(tài)行為假說,并不是沒有,而是隱含存在的,即“能繼續(xù)提供服務(wù)”。那如何才算“能繼續(xù)提供服務(wù)”呢?這一點可以從測試方案的監(jiān)控方式中,看出一點線索。即對于所有實驗,無論注入的故障是什么,測試人員只關(guān)注3類指標(biāo):
- 系統(tǒng)業(yè)務(wù)指標(biāo):如系統(tǒng)業(yè)務(wù)交易的錯誤率
- 系統(tǒng)性能指標(biāo):如系統(tǒng)業(yè)務(wù)交易的TPS(每秒事務(wù)處理量)和響應(yīng)時長的變化趨勢
- 系統(tǒng)資源指標(biāo):如系統(tǒng)的CPU、內(nèi)存、磁盤IO和網(wǎng)絡(luò)資源指標(biāo)的變化趨勢
看到這3類指標(biāo),我產(chǎn)生了一個疑問:“用戶真的在乎業(yè)務(wù)交易錯誤率和TPS變化趨勢嗎?”我相信,用戶會更在乎自己下的訂單,是否能在3秒內(nèi)成功處理。這一點所有人都能很好理解。那未能反映用戶價值的穩(wěn)態(tài)行為假說,會導(dǎo)致什么后果呢?或許這種充滿技術(shù)細(xì)節(jié)的穩(wěn)態(tài)行為假說,不便于業(yè)務(wù)人員和領(lǐng)導(dǎo)直觀感知其業(yè)務(wù)影響,吸引不了他們的注意,從而喪失了獲得他們支持的機會,并弱化了實驗的價值。
隱含的穩(wěn)態(tài)行為假說不夠量化
再看上面這個通過觀察TPS變化趨勢來判斷是否“能繼續(xù)提供服務(wù)”的例子。如果這個實驗是由測試人員手工執(zhí)行的,憑借豐富的經(jīng)驗,測試人員是能判斷系統(tǒng)是否“能繼續(xù)提供服務(wù)”的。但如果將這個實驗自動化,用工具在晚上自動執(zhí)行實驗,那么工具該如何界定系統(tǒng)是否“能繼續(xù)提供服務(wù)”呢?所以要想實現(xiàn)自動化,必須要把穩(wěn)態(tài)行為的假說進行量化,以便工具自動執(zhí)行實驗。
良好穩(wěn)態(tài)行為假說示例
這里試著給出一個能反映用戶價值,且有量化指標(biāo)的穩(wěn)態(tài)行為假說的示例:
即使在實例失效的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
這個穩(wěn)態(tài)行為假說,不僅體現(xiàn)了成功場景,也體現(xiàn)了失敗場景。
良好穩(wěn)態(tài)行為假說能節(jié)省實驗成本
如何設(shè)計一個能節(jié)省實驗成本的穩(wěn)態(tài)行為假說呢?讓我們看看發(fā)生在這家企業(yè)測試人員身上的故事。
這些測試人員正在使用一款開源工具,來進行混沌工程故障注入實驗。由于這款工具,提供了5種可供注入的原子故障,于是測試人員也就設(shè)計了5個實驗。如果用上述示例的寫法,來編寫穩(wěn)態(tài)行為假說的話,會是這個樣子:
- 實驗1的穩(wěn)態(tài)行為假說:即使在實例中止的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
- 實驗2的穩(wěn)態(tài)行為假說:即使在實例CPU爆滿的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
- 實驗3的穩(wěn)態(tài)行為假說:即使在實例內(nèi)存爆滿的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
- 實驗4的穩(wěn)態(tài)行為假說:即使在實例磁盤爆滿的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
- 實驗4的穩(wěn)態(tài)行為假說:即使在關(guān)閉實例網(wǎng)絡(luò)的條件下,系統(tǒng)仍然能在3秒之內(nèi),完成已受理的用戶的交易,否則也能在5秒之內(nèi)提示用戶業(yè)務(wù)暫時不可用。
如果手工執(zhí)行每個實驗平均花30分鐘,那么執(zhí)行這5個實驗,要花150分鐘。
等一下!我們是企業(yè)的測試人員,不是開源混沌工程工具的測試人員!這5個原子故障好比病毒,它們所導(dǎo)致的癥狀都是同一個——實例失效。而對于企業(yè)的測試人員,只要從上述5個故障中任選一個注入,就能達成讓實例失效的目的。畢竟測試人員只須關(guān)注業(yè)務(wù)系統(tǒng)在實例失效后,是否能繼續(xù)提供服務(wù)。換句話說,這5個原子故障,同屬一個等價類。對于等價類,我們只要注入一個原子故障就夠了。如果一定要全面注入這5個原子故障,那么可以在以后的各輪回歸實驗中,每輪實驗依次輪流選擇一種不同的原子故障注入即可。這樣對于“實例失效”的實驗,我們就能節(jié)省80%的實驗成本。這下你就知道上面的良好穩(wěn)態(tài)行為假說示例,為何要寫“癥狀”了——“即使在實例失效的條件下”。這也在某種程度上,揭示了文章一開頭測試人員所抱怨的混沌工程實驗“性價比太低”的原因。
這個故事給我們的啟發(fā)是,如果針對“癥狀”而不是“病毒”來設(shè)計系統(tǒng)穩(wěn)態(tài)行為假說,就能幫助我們識別等價類,從而只選擇少量的“病毒”注入,達成同樣“癥狀”的效果,進而降低實驗成本。
總結(jié)
編寫反映用戶價值、便于量化且針對“癥狀”的系統(tǒng)穩(wěn)態(tài)行為假說,能讓混沌工程實驗的價值更容易讓業(yè)務(wù)人員和領(lǐng)導(dǎo)理解,從而獲得他們的支持,也能更有利于自動化,并能通過等價類劃分,來降低實驗成本,進而達成降本增效的目的。