混沌工程的陷阱
點(diǎn)擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)”
后臺(tái)回復(fù)”1024“獲取公眾號(hào)專屬1024GB資料
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/chaos/chaos-engineering-8-traps/
本文來(lái)自Nora Jones于2019年3月28日在第4屆混沌工程大會(huì)上的分享,原文地址參考資料2。
Nora Jones 是《Chaos Enginering》一書的作者之一,曾在Netflix、Jet.com、Slack等公司實(shí)施和落地混沌工程,同時(shí)她也在Lund University攻讀人因工程及系統(tǒng)安全專業(yè)的碩士學(xué)位,這也恰好給了她關(guān)于混沌工程結(jié)合人因相關(guān)的觀點(diǎn)。
我花了幾天時(shí)間去分析和理解這篇文章。原文是一篇ppt的講稿,很多內(nèi)容都是口語(yǔ)化的的表述,我在翻譯的時(shí)候盡量將其轉(zhuǎn)換成文章的形式來(lái)進(jìn)行陳述。
混沌工程雖然不是一個(gè)太過(guò)新鮮的詞匯,但是就目前國(guó)內(nèi)而言,熟知的人也并不會(huì)太多。對(duì)于絕大多數(shù)人而言,有點(diǎn)超前,如果對(duì)于混沌工程不太了解,可以先看看我之前寫的這篇《混沌工程初識(shí)篇》。
正文
首先我們以一個(gè)史上著名混沌實(shí)驗(yàn)做一個(gè)開場(chǎng)白——阿波羅1號(hào)。
阿波羅1號(hào)是美國(guó)阿波羅計(jì)劃中的第一個(gè)載人飛行任務(wù)。當(dāng)時(shí)計(jì)劃將阿波羅1號(hào)的發(fā)射演習(xí)作為對(duì)阿波羅控制及服務(wù)模塊的首次測(cè)試,并計(jì)劃于1967年2月21日進(jìn)行載人發(fā)射,而事實(shí)上并未成功。真實(shí)的情形是:在1967年1月27日發(fā)射演習(xí)測(cè)試期間,指揮艙中的一場(chǎng)大火燒死了全部在場(chǎng)的三名機(jī)組成員,于此同時(shí),阿波羅1號(hào)的控制模塊也被摧毀。3個(gè)月之后,阿波羅1號(hào)被NASA正式退役。
最終調(diào)查結(jié)果得出:艙內(nèi)起火是由承載航天器動(dòng)力的線路缺陷以及裝有易燃和腐蝕性冷卻劑的管道缺陷而引起的。起火之后,艙內(nèi)內(nèi)部壓強(qiáng)較大,致使原本為了確保他們?cè)陲w行過(guò)程中安全的艙門無(wú)法打開,最終也就使得艙內(nèi)機(jī)組人員并沒有能夠及時(shí)撤離。
當(dāng)時(shí),航天火箭并沒有裝載飛行燃料,參與人員錯(cuò)誤地認(rèn)為此項(xiàng)演習(xí)是相對(duì)安全的,即錯(cuò)誤地認(rèn)為“爆炸半徑”(混沌工程的5項(xiàng)原則之一——最小化爆炸半徑)能夠得到有效地控制。因此,本應(yīng)該具備的標(biāo)準(zhǔn)應(yīng)急準(zhǔn)備也沒有實(shí)施,諸如消防、救援以及醫(yī)療小組也并沒有到位。
這次事件的結(jié)局是悲慘的,同時(shí)也令NASA蒙羞。這無(wú)疑是一場(chǎng)失敗的實(shí)驗(yàn),我們?cè)趫?zhí)行此類實(shí)驗(yàn)的時(shí)候應(yīng)該保持高度的重視和警惕。這次事件之后,航天器的設(shè)計(jì)也被完全改變了。下面所要講述的內(nèi)容中也會(huì)多次提及阿波羅這個(gè)案例。
我們所從事的軟件行業(yè)一般不會(huì)直接影響到人的生命安全,不過(guò)我們所服務(wù)的企業(yè)會(huì)從事一些商業(yè)活動(dòng),以此來(lái)獲得盈利,而各式各樣的事故會(huì)讓企業(yè)承受不同程度的損失。事實(shí)上,這也就是為什么我們要在軟件行業(yè)中踐行混沌工程,并以此來(lái)構(gòu)建我們對(duì)事故處理能力的信心的原因之一。
陷阱1、通過(guò)發(fā)現(xiàn)系統(tǒng)缺陷的數(shù)量來(lái)衡量混沌實(shí)驗(yàn)的成功與否
這是衡量混沌工程的ROI(投入產(chǎn)出比)的一個(gè)非常普遍的方式,很遺憾,這招用在混沌工程領(lǐng)域上并不怎么奏效。
援引 Dr. Robert L. Wears的一篇文章《The Error of Counting Errors》(鏈接見參考資料1), 其中就有這么一句話:You don't know much about safety simply by counting erros。在這句話中,我們可以簡(jiǎn)單的把“錯(cuò)誤”這個(gè)詞替換成“在混沌工程中發(fā)現(xiàn)的缺陷”,道理是一樣的。僅僅是通過(guò)統(tǒng)計(jì)我們所負(fù)責(zé)的工具、產(chǎn)品或者團(tuán)隊(duì)自身中所發(fā)現(xiàn)的缺陷,是無(wú)法評(píng)判混沌工程是否成功的。
在《The Error of Counting Errors》(鏈接見參考資料1)這篇文章中還有這么一句話:Error counts are measures of ignorance, ranther than risk。直譯為:錯(cuò)誤數(shù)統(tǒng)計(jì)是用來(lái)衡量無(wú)知的,而不是用來(lái)衡量風(fēng)險(xiǎn)的。
“哇哦,混沌工程收獲頗豐,僅上個(gè)季度我們團(tuán)隊(duì)就發(fā)現(xiàn)了200多個(gè)缺陷”。如果你們也正在推行混沌工程,也許你會(huì)發(fā)現(xiàn)領(lǐng)導(dǎo)層樂(lè)意把“發(fā)現(xiàn)更多的缺陷”作為OKR中的目標(biāo)之一,我(Nora Jones)以前的團(tuán)隊(duì)就設(shè)定過(guò)類似的目標(biāo)。我還和其它團(tuán)隊(duì)的同事討論過(guò)這個(gè)目標(biāo),也對(duì)此有點(diǎn)躊躇,當(dāng)時(shí)我那位同事說(shuō)了這樣一番話:你們是通過(guò)系統(tǒng)缺陷的數(shù)量來(lái)做評(píng)估的?如果你們?cè)诩径瓤煲Y(jié)束的時(shí)候還沒有找到足夠多的缺陷數(shù)量來(lái)完成OKR的話,我想我可以幫助你完成,我知道一個(gè)特別拽的Javascript項(xiàng)目。。(本文來(lái)自公眾號(hào):朱小廝的博客,ID: hiddenkafka)
統(tǒng)計(jì)系統(tǒng)缺陷的數(shù)量并不能真正地評(píng)估混沌工程項(xiàng)目的成功與否,反而還可能會(huì)引導(dǎo)你太過(guò)注重優(yōu)化次優(yōu)路徑而導(dǎo)致錯(cuò)過(guò)混沌工程可以給你帶來(lái)的其它正向收益。
上圖所示的是由 Darrell Huff 于1954年寫的一本書,至今仍然很受歡迎。書中闡述了有關(guān)解釋統(tǒng)計(jì)數(shù)據(jù)的錯(cuò)誤,以及這些錯(cuò)誤如何讓我們產(chǎn)生了偏離實(shí)際的錯(cuò)誤結(jié)論。推薦閱讀。
混沌工程的目標(biāo)不僅僅是簡(jiǎn)單地通過(guò)一些工具來(lái)發(fā)現(xiàn)系統(tǒng)缺陷,而是通過(guò)所找到的系統(tǒng)缺陷來(lái)引導(dǎo)我們走上彈性系統(tǒng)之路。
彈性是指系統(tǒng)的調(diào)節(jié)適應(yīng)能力,它可以以此在面對(duì)各種變化和干擾時(shí)維持自身的關(guān)鍵功能。我這里所說(shuō)的“系統(tǒng)”并不單指工具、服務(wù)等,還包括人,學(xué)會(huì)如何處理遇到的各類問(wèn)題也是混沌工程的一部分。我們所處事的態(tài)度,以及在面對(duì)壓力時(shí)的權(quán)衡抉擇都會(huì)影響系統(tǒng)的運(yùn)行行為。
讓我們來(lái)架起混沌工程與彈性工程之間的橋梁,更多地討論我們所進(jìn)行的混沌實(shí)驗(yàn)的成功之處。并且我們也應(yīng)該專注于學(xué)習(xí)那些我們所擅長(zhǎng)的東西,而不僅僅是發(fā)現(xiàn)漏洞并指出系統(tǒng)風(fēng)險(xiǎn)。理解系統(tǒng)如何正確的運(yùn)行會(huì)有助于我們更深入的找出和理解系統(tǒng)出問(wèn)題的原因。
陷阱2、沒必要系統(tǒng)相關(guān)的所有人都來(lái)參與實(shí)驗(yàn)的籌備和執(zhí)行
讓所有相關(guān)人員都到場(chǎng),這一點(diǎn)執(zhí)行起來(lái)確實(shí)比較困難。但是,如果團(tuán)隊(duì)里的所有成員能夠坐在一起,然后一塊探討實(shí)驗(yàn)過(guò)程中系統(tǒng)潛在的變化,并且盡可能多表達(dá)關(guān)于系統(tǒng)的不同思考和想法,那么將會(huì)受益匪淺。
援引阿波羅1號(hào)的例子,這個(gè)陷阱二就存在了,當(dāng)時(shí)認(rèn)為沒必要所有部門都參與這個(gè)演習(xí)測(cè)試,譬如急救和醫(yī)療援助隊(duì)。
陷阱4、混沌工程應(yīng)該是強(qiáng)制性的
(譯者注:沒有看錯(cuò),這里就是陷阱4)
人為參與不可避免地會(huì)遇到種種協(xié)作問(wèn)題,建立良好的人際關(guān)系也是混沌工程成功的一部分,我們需要去嘗試?yán)斫鈩e人在壓力下如何權(quán)衡,以及如何發(fā)展專業(yè)知識(shí)和如何提煉專業(yè)知識(shí)等。
在混沌實(shí)驗(yàn)執(zhí)行之后,強(qiáng)制要求相關(guān)人員把所找到的系統(tǒng)缺陷全部修復(fù)的行為,通常結(jié)局都不怎么好,反而還會(huì)損害與同事之間的關(guān)系。(譯者注:混沌工程的推行者和混沌工程的受眾并不隸屬上下層關(guān)系,且后者更熟悉執(zhí)行混沌實(shí)驗(yàn)系統(tǒng)的細(xì)節(jié),發(fā)現(xiàn)的缺陷對(duì)于后者而言也有輕重緩急,應(yīng)該尊重他們的意見和處理方式,而不是通過(guò)一種強(qiáng)制性的手段。)當(dāng)我們像一個(gè)運(yùn)維團(tuán)隊(duì)做事時(shí)候很容易陷入這樣的一個(gè)陷阱。一味地追求發(fā)現(xiàn)更多的系統(tǒng)缺陷,并將這些缺陷添加到相關(guān)團(tuán)隊(duì)的代辦事項(xiàng)中,且要求他們盡快完成這樣的做法沒什么太大的意義,也不會(huì)產(chǎn)生什么幫助。相反,你應(yīng)該提供足夠多的與系統(tǒng)缺陷有關(guān)的上下文信息,以便讓此系統(tǒng)相關(guān)的負(fù)責(zé)人去更好地理解系統(tǒng),以此權(quán)衡利弊類抉擇去修復(fù)缺陷或者是忽略它而專注去做對(duì)業(yè)務(wù)更有利的事情。
于此同時(shí),這里還有一個(gè)延伸的陷阱——應(yīng)當(dāng)把發(fā)現(xiàn)的系統(tǒng)缺陷都修復(fù)掉,而且最好是自動(dòng)化修復(fù)的。我們需要明確的是:在使用混沌平臺(tái)或者工具時(shí)的最佳實(shí)踐是把系統(tǒng)缺陷的上下文信息提供給服務(wù)所有者,而不是自動(dòng)執(zhí)行修復(fù)程序或者消除系統(tǒng)缺陷。
陷阱5、在非生產(chǎn)環(huán)境中執(zhí)行的實(shí)驗(yàn)不是真正的混沌實(shí)驗(yàn)
在生產(chǎn)環(huán)境中執(zhí)行混沌實(shí)驗(yàn)或者自動(dòng)化執(zhí)行混沌實(shí)驗(yàn)之前,在非生產(chǎn)環(huán)境中執(zhí)行混沌實(shí)驗(yàn)或者練習(xí) GameDay 是非常有價(jià)值的、也是完全有必要的。
回想我在Netflix時(shí),我們想要自動(dòng)化混沌實(shí)驗(yàn)的配置和執(zhí)行。但是,自動(dòng)化配置混沌實(shí)驗(yàn)是一個(gè)很漫長(zhǎng)的過(guò)程,我們不得不從多個(gè)不同的數(shù)據(jù)源收集大量的與服務(wù)配置有關(guān)的數(shù)據(jù)。當(dāng)我們收集了所有的這些信息并進(jìn)行了相關(guān)匯總之后,我們將其通過(guò)UI(被稱之為 Monocle 的一個(gè)系統(tǒng))的形式進(jìn)行呈現(xiàn),這樣相關(guān)服務(wù)的負(fù)責(zé)人員可以從其中發(fā)現(xiàn)其潛藏的價(jià)值。Monocle的創(chuàng)建完全是一個(gè)意外,起初我們并沒有想要?jiǎng)?chuàng)建它,我們只是想要實(shí)現(xiàn)自動(dòng)化實(shí)驗(yàn)配置。這也驗(yàn)證了一個(gè)觀點(diǎn)——與實(shí)際自動(dòng)化實(shí)驗(yàn)相比,你可以在自動(dòng)化實(shí)驗(yàn)過(guò)程中獲得更多的價(jià)值。
陷阱6、執(zhí)行實(shí)驗(yàn)是混沌工程中最重要的部分
創(chuàng)建和分享經(jīng)驗(yàn)的過(guò)程才是踐行混沌工程的最高收益。一旦我們能夠通過(guò) Monocle 發(fā)現(xiàn)系統(tǒng)缺陷并向服務(wù)的相關(guān)負(fù)責(zé)人展示時(shí),那么我們從創(chuàng)建實(shí)驗(yàn)中獲得的收益其實(shí)就已經(jīng)超過(guò)了我們實(shí)際執(zhí)行時(shí)所能獲得的收益(其中一些我們甚至不需要運(yùn)行,我們可能已經(jīng)發(fā)現(xiàn)了存在的缺陷)。
實(shí)驗(yàn)執(zhí)行前、實(shí)驗(yàn)執(zhí)行時(shí)、實(shí)驗(yàn)執(zhí)行之后所有的這些階段都應(yīng)平等和特定的關(guān)注。
由于篇幅關(guān)系,這里我只詳細(xì)介紹一下在實(shí)驗(yàn)執(zhí)行前的準(zhǔn)備階段的收益。
這里說(shuō)一個(gè)有關(guān) Consul 的故事。事故能夠給我們提供一個(gè)這樣的機(jī)會(huì):讓我們可以坐下來(lái)一起看看 A (Josie) 和 B (Javi) 在關(guān)于系統(tǒng)怎樣運(yùn)行的理解上有什么偏差。Josie,作為某個(gè)服務(wù)的負(fù)責(zé)人,覺得 Consul 的可用性可以達(dá)到100%, 即使出現(xiàn)問(wèn)題,Consul 團(tuán)隊(duì)也會(huì)解決。同時(shí),Javi 作為Consul 的架構(gòu)師,認(rèn)為用戶不會(huì)做出這種可用性100%的假設(shè)。顯然 Josie 和 Javi 從未明確對(duì)齊過(guò)關(guān)于 Consul 的各自預(yù)期,因?yàn)樗麄兌技僭O(shè)對(duì)方應(yīng)該知道這些認(rèn)知。
Javi 擁有長(zhǎng)期一線運(yùn)維的經(jīng)驗(yàn),他覺得不會(huì)有用戶會(huì)認(rèn)為一個(gè)服務(wù)可以提供 100% 的可用性,而且在用 Consul 的時(shí)候也肯定會(huì)配置相關(guān)的重試策略。因此,他也從未把這一點(diǎn)寫入文檔里,也沒有提示給用戶有關(guān)假定可用性為100%的任何風(fēng)險(xiǎn)。Josie 非常喜歡 Consul,因?yàn)槭褂肅onsul可以方便快捷地存儲(chǔ)和變更鍵值對(duì),省時(shí)又省力,并且他也確實(shí)在很多地方都用上了 Consul。正常情況下,事情也確實(shí)如 Josie 所預(yù)期的那樣,直到有一次發(fā)生了大規(guī)模停機(jī)。。。對(duì)于這次事故,顯然有部分原因是因?yàn)楦髯灶A(yù)期的不匹配,且也缺乏交流相關(guān)內(nèi)容的機(jī)會(huì)。不過(guò)話又說(shuō)回來(lái),除非真的遇到一次事故,否則類似的交流不會(huì)發(fā)生,因?yàn)榇蠹也粫?huì)因?yàn)橐患舜苏J(rèn)為認(rèn)知一致的事情而作任何交流。
這就是為什么要引入混沌工程原因。混沌工程就提供了一個(gè)機(jī)會(huì)——可以讓我們?nèi)ヌ剿飨到y(tǒng)的缺陷,更重要的是,可以讓我們一起交流各自關(guān)于系統(tǒng)運(yùn)作的思考和認(rèn)知。
混沌實(shí)驗(yàn)的設(shè)計(jì)者/組織者(理想情況下)應(yīng)該是來(lái)自團(tuán)隊(duì)外部的人,他們需要引導(dǎo)并理解團(tuán)隊(duì)成員對(duì)于系統(tǒng)的可能的偏見。他們的任務(wù)是主持和引導(dǎo)團(tuán)隊(duì)內(nèi)部人員進(jìn)行對(duì)話、提問(wèn)以及表達(dá)各自的觀點(diǎn),以期最終能夠總結(jié)歸納出關(guān)于系統(tǒng)的假定。他們通過(guò)所尋求的團(tuán)隊(duì)中各個(gè)成員的反饋來(lái)構(gòu)建后續(xù)的實(shí)驗(yàn)。(本文來(lái)自公眾號(hào):朱小廝的博客,ID: hiddenkafka)
盡管這個(gè)過(guò)程很費(fèi)時(shí)間,但是非常重要(至少在混沌實(shí)驗(yàn)設(shè)計(jì)階段)。團(tuán)隊(duì)中的各個(gè)成員需要發(fā)表各自對(duì)于系統(tǒng)的不同觀點(diǎn)認(rèn)知,最終能夠整和出系統(tǒng)的一個(gè)假定。通常而言,這個(gè)假定不應(yīng)該來(lái)自于實(shí)驗(yàn)的設(shè)計(jì)者/組織者。實(shí)驗(yàn)的設(shè)計(jì)者/組織者把大家聚到一起(30 - 60分鐘),讓每個(gè)成員有機(jī)會(huì)表達(dá)自己對(duì)系統(tǒng)的理解、當(dāng)遇到某些故障時(shí)系統(tǒng)會(huì)發(fā)生什么。當(dāng)來(lái)自不同團(tuán)隊(duì)的各自成員在一個(gè)屋子里一起參與實(shí)驗(yàn)的設(shè)計(jì)、一起討論關(guān)于系統(tǒng)的期望時(shí),你將會(huì)受益良多。提取你在這個(gè)階段所獲得的有效信息和接下來(lái)的實(shí)驗(yàn)執(zhí)行同等重要。
搞清楚具體要做什么樣的實(shí)驗(yàn)也是混沌工程的價(jià)值之一。
設(shè)計(jì)混沌實(shí)驗(yàn)的目標(biāo)是讓團(tuán)隊(duì)成員練習(xí)如何在問(wèn)題的引導(dǎo)下討論關(guān)于系統(tǒng)的不同認(rèn)知,第二個(gè)目標(biāo)是如何以結(jié)構(gòu)化的方式設(shè)定實(shí)驗(yàn)策略。
陷阱7、晚點(diǎn)再擔(dān)心(安全),最重要的是制造混沌
在阿波羅1號(hào)事故中,艙門原本是為了保證在飛行過(guò)程中宇航員的人身安全,但卻由于內(nèi)部壓力無(wú)法打開而釀成慘劇。具有諷刺意味的是,原本旨在確保您安全的某些事情最終會(huì)導(dǎo)致災(zāi)難性的事故。Dr. Richard Cook 將這種類型的統(tǒng)稱為“脆弱的防御措施(vulnerable defenses)”。
我們需要了解已采取的防御措施并測(cè)試其缺陷。通常,防御措施的缺陷很難被發(fā)現(xiàn),而混動(dòng)工程可以幫助你來(lái)揭示它。
制造混沌很容易,但是想要確保安全卻很難。我們經(jīng)常會(huì)犯錯(cuò),總是在事情失敗之后再想怎么去修復(fù)。陷阱7是一個(gè)很平常的陷阱,當(dāng)我們還沉浸在成功制造混沌的喜悅中時(shí),卻不知可能已經(jīng)身臨險(xiǎn)鏡。
陷阱8、你可以在不了解系統(tǒng)的情況下進(jìn)行混沌實(shí)驗(yàn)
在執(zhí)行混沌實(shí)驗(yàn)之前,如果你不了解系統(tǒng)的相關(guān)信息如:軌跡、事件模型等,那么結(jié)局將會(huì)很慘。
陷阱3、踐行混沌工程可以遵循特定的公式
為什么“陷阱3”會(huì)放在最后,這也是為了強(qiáng)調(diào)一下在踐行混沌工程時(shí)并沒有特定的萬(wàn)能公式可以遵循。在實(shí)施 Game Day 或者混沌實(shí)驗(yàn)時(shí)也沒有特定的模板可用。
希望閱讀此文的你可以跳出萬(wàn)能的公式,多從全局的角度去思考,多想想如何觸達(dá)目標(biāo),而不是需要特定的“處方”。
總結(jié)
我們從混沌工程中學(xué)到的越多,我們對(duì)它的討論也就越多,我們也就能越了解它。如果我們能夠意識(shí)到這8個(gè)缺陷,那么我們可以更好地避開去更好的實(shí)踐混沌工程。
?
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/chaos/chaos-engineering-8-traps/
想知道更多?掃描下面的二維碼關(guān)注我
【混沌工程系列文章】
-
科普 | 明星公司之Netflix
-
看我如何作死 | 將CPU、IO打爆
-
看我如何作死 | 網(wǎng)絡(luò)延遲、網(wǎng)絡(luò)丟包、網(wǎng)絡(luò)中斷一個(gè)都沒落下過(guò)
-
混沌系列 | 其實(shí)制造“假死”很容易
-
干貨 | 這次我們看看阿里的人是如何蹂躪CPU的
-
阿里巴巴混沌測(cè)試工具ChaosBlade兩萬(wàn)字解讀
-
混沌工程初識(shí)篇
朕已閱?
總結(jié)
- 上一篇: MySQL亿级数据量实时同步,小米如何完
- 下一篇: 慌!还不了解Java中的分支预测?!