四步心法: 混沌工程不是靈丹妙藥 | IDCF

來源:混沌工程實踐 作者:寧遠(yuǎn)之 原文來源:Java Magazine 原文作者:Mikolaj Pawlikowski 標(biāo)題:Introduction to chaos engineering, Part 2: Four steps for disrupting complex systems
混沌工程不是靈丹妙藥,不會自動修復(fù)系統(tǒng)和解決問題。市面上有很多工具可以更輕松地實施混沌實驗,但真正的困難在于對系統(tǒng)行為的預(yù)測。添加故障很容易,困難的是知道在哪里注入以及為什么要注入。
換句話說,從混沌實驗中獲得的價值,取決于系統(tǒng)本身、對系統(tǒng)的理解深度以及建立可觀測性的程度。本文將分享有關(guān)混沌實驗的四步心法,幫助大家更快上手混沌工程。
一、混沌工程不是什么?
“混沌工程是在分布式系統(tǒng)上進(jìn)行實驗的學(xué)科, 目的是建立對系統(tǒng)抵御生產(chǎn)環(huán)境中失控條件的能力以及信心。”
但是,混沌工程不是靈丹妙藥,它不會自動修復(fù)您的系統(tǒng)。事實上,甚至可能并不適用于您的任何情況。
一個常見的誤解,混沌工程就是用來隨機(jī)破壞系統(tǒng)。
這可能和名字有關(guān)系,Chaos Monkey(混沌猴子)是第一個在該領(lǐng)域獲得業(yè)界聲譽(yù)的工具,它在很大程度上依賴于隨機(jī)性。隨機(jī)性是一種強(qiáng)大的工具,并且有時與模糊測試有重疊。
但通常,添加失敗都很容易;困難的是知道在哪里注入以及為什么要注入。
混沌工程不僅僅是 Chaos Monkey、ChaosToolkit、PowerfulSeal或 GitHub 上可用的眾多項目中的任何一個。
這些工具可以更輕松地實施某些類型的實驗,但真正的困難在于學(xué)習(xí)如何批判性地看待系統(tǒng)并預(yù)測可能存在的脆弱點(diǎn)。
另外,混沌工程不會取代已有的測試方法(例如單元或集成測試等),而是對已有測試方法的補(bǔ)充。
在碰撞測試期間,安全氣囊可單獨(dú)測試,也可與汽車的其余部件一起進(jìn)行,混沌工程可以在不同的系統(tǒng)級別上運(yùn)行和測試。
每個系統(tǒng)都不同,您需要深入了解系統(tǒng)的弱點(diǎn),才能提出有用的混沌實驗。
換句話說,您從混沌實驗中獲得的價值將取決于您的系統(tǒng)、您對系統(tǒng)的理解程度、您想要測試系統(tǒng)的深度以及您建立可觀測性的程度。
盡管混沌工程的獨(dú)特之處在于,其可應(yīng)用于生產(chǎn)系統(tǒng),但這并不是唯一場景。
網(wǎng)上很多混沌工程的內(nèi)容似乎都圍繞著“生產(chǎn)中的破壞”,很可能是因為這是您能做的最激進(jìn)的事情,但同樣,這并不是混沌工程的全部——甚至不是它的主要關(guān)注點(diǎn)。
因為,您也可以從混沌工程原理應(yīng)用在其他環(huán)境中獲得價值。
最后,混沌工程并非源于數(shù)學(xué)和物理學(xué)中的混沌理論。
二、什么是混沌實驗
混沌工程實驗(簡稱混沌實驗)是混沌工程的基本組成,也是重要的表現(xiàn)形式,即通過一系列混沌實驗進(jìn)行混沌工程實踐。
給定一個系統(tǒng)及其一定數(shù)量的系統(tǒng)特性,就可以設(shè)計實驗來觀察系統(tǒng)在發(fā)生故障時的種種表現(xiàn)。每個實驗都專注于證明或反駁實驗前對系統(tǒng)受故障影響的假設(shè)。
2.1 混沌實驗的示例
例如,假設(shè)您運(yùn)營著一個流行的網(wǎng)站,維護(hù)著整個數(shù)據(jù)中心。如何讓網(wǎng)站在斷電后仍可以正常運(yùn)行?比如,在數(shù)據(jù)中心中安裝了兩個獨(dú)立的電源。
理論上,這可以解決這個問題——但在實踐中,仍存在著很多潛在的其他問題:也許電源之間的自動切換不起作用,亦或者網(wǎng)站的規(guī)模已經(jīng)大到,單一電源無法為所有服務(wù)器提供足夠的電力。
除此之外,是否每三個月有請電力工程師進(jìn)行定期檢查?
討論到這里,您會擔(dān)心。
好在,我們有混沌工程這個技術(shù)。設(shè)計一個簡單的混沌實驗,用科學(xué)的方式,通過實驗說明當(dāng)其中一個電源出現(xiàn)故障時系統(tǒng)會發(fā)生什么。甚至整個實驗操作,可選擇新進(jìn)的實習(xí)生來執(zhí)行這些步驟。
對所有電源重復(fù)以下過程,一次一個:
檢查網(wǎng)站是否正常運(yùn)行; 打開電氣面板并關(guān)閉電源; 檢查網(wǎng)站是否仍在正常運(yùn)行; 重新打開電源。


實驗結(jié)果的可觀測性
使用觀測數(shù)據(jù)定義正常的狀態(tài)
利用觀測數(shù)據(jù)驗證直覺假設(shè)
實驗越簡單越好
通常,觀測指標(biāo)應(yīng)直接由業(yè)務(wù)需求驅(qū)動。
該進(jìn)程是否獲得了足夠的 CPU?是否被其他進(jìn)程竊取? 可能是共享機(jī)器,或者可能是cron在實驗期間啟動更新系統(tǒng)的工作? 內(nèi)核調(diào)度是否將 CPU 分配給了另一個具有更高優(yōu)先級的進(jìn)程? 管理程序決定其他進(jìn)程更需要 CPU?
系統(tǒng)會繼續(xù)工作嗎?系統(tǒng)性能會受到影響嗎?如果會,影響程度有多少?
| 類型 | 事件示例 |
|---|---|
| 外部事件 | 地震、洪水、火災(zāi)、停電等 |
| 硬件故障 | 磁盤、CPU、交換機(jī)、電纜、電源等 |
| 資源匱乏 | CPU、物理內(nèi)存、虛擬內(nèi)存、磁盤空間、網(wǎng)絡(luò)帶寬等 |
| 軟件錯誤 | 死循環(huán)、崩潰、黑客攻擊等 |
| 虛擬機(jī)故障 | 意外重啟、意外關(guān)閉、部署失敗等 |
| 硬件錯誤 | 系統(tǒng)時鐘錯誤、CMOS電池失效、內(nèi)存校驗錯誤等 |
| 人為錯誤 | 按錯按鈕、發(fā)送錯誤配置、拔錯電纜等 |
模擬其中一些事件很容易(關(guān)閉機(jī)器以模擬機(jī)器故障,或者,拔出電纜以模擬網(wǎng)絡(luò)問題),而其他事件則要難得多(為系統(tǒng)調(diào)用添加延遲)。
選擇合適的故障,需要您對自己的系統(tǒng)有很好的了解。
以下是一些示例假設(shè):
以每小時 100 公里的速度發(fā)生正面碰撞時,不會擠壓到任何假人。 如果兩個親本豌豆都是黃色的,那么所有的后代都是黃色的。 如果 30% 的服務(wù)器被關(guān)閉,API 會在 200 毫秒內(nèi)繼續(xù)為 99% 的請求提供服務(wù)。 如果其中一臺數(shù)據(jù)庫服務(wù)器出現(xiàn)故障,仍將滿足服務(wù)級別目標(biāo) (SLO)。
如果假設(shè)是對的,恭喜!您剛剛對自己的系統(tǒng)獲得了更多信心。 如果假設(shè)是錯的,恭喜!您剛剛在客戶發(fā)現(xiàn)之前,提前找到了系統(tǒng)問題,并且可以在任何人受到影響之前修復(fù)它!
三、結(jié)束語
混沌工程不會自動解決您的問題。
最后,混沌工程不需要很復(fù)雜。



