隨着摩爾定律的終結,單機計算性能已達到了極限,然而,咱們的軟件系統不管是規模仍是複雜度一直在增加,因此軟件系統都不約而同的朝着分佈式化方向發展。近年來,隨着雲服務、容器的出現,某些分佈式系統也更容易微服務化。拋開這些形形色色的分佈式技術,咱們對系統可靠性的述求倒是一致的:分佈式系統須要高可用,即便出現了單點或集羣故障,也但願系統具有自我恢復或優雅降級的彈性能力、容錯能力。咱們在合理的架構,高質量的代碼,完善的測試等等方面作了不少努力,然而不少分佈式系統仍舊達不到高可用、彈性化,爲了儘量發掘系統中存在的弱點,不少大型軟件公司都引入了混沌工程,如國外的谷歌、網飛,國內的京東等等。哪些能夠稱之爲系統弱點呢,好比git
經過觀察分佈式系統在受控的故障注入測試中的行爲變化發掘系統弱點,並針對性的改進,從而提升系統可靠性,創建系統抵禦失控條件的能力的信心。因此,混沌工程並非一個新概念,常見的異地容災測試也是混沌工程的一種應用。github
若是混沌工程實施下來二者的「穩定狀態」一致,則能夠認爲系統應對這種故障是彈性的,從而對系統創建更多信心。相反的,若是二者的穩定狀態不一致,那咱們就找到了一個系統弱點,從而能夠修復它,提升系統可靠性。sql
以電商下單爲例,下單系統可能包含了商品服務,交易服務,支付服務,「假設」不是着眼於各個「螺絲釘」服務的具體狀態,而是着眼於整個下單系統正常運做下的外部狀態,以下單量、成交金額、系統吞吐量、延時、錯誤率等等,這些指標通常會有大盤監控,並且除非遇到促銷活動,這些指標曲線通常不會大起大落,其變化趨勢是能夠預期的。可是有一點須要特別注意,某些問題雖然不會怎麼影響大盤數據(如緩存失效、一個CDN節點失效等等),可是咱們仍舊須要監控系統中各個節點的微觀指標(如CPU、IO等)以期發現這類問題(緩存失效可能致使Mysql集羣壓力增大,CPU/IO等壓力變大)。緩存
任何可能影響系統穩定狀態的均可以做爲事件,常見的,如服務器
咱們還能夠分析曾經引發系統故障的事件的種類和頻次,針對性的排列優先級,並實施這些事件,避免系統再次出現這種故障。網絡
根據第1條,通常只有生產環境的指標是可預測的,如新用戶日註冊量,用戶日下單量。並且,因爲測試環境和生產環境不可能如出一轍,爲了真實反映系統的可靠性,通常推薦在生產環境實施混沌工程。架構
互聯網軟件天天都在更新,因此像跑持續集成同樣實施混沌工程具備現實意義。異步
根據第3條,混沌工程可能致使線上功能不可用,甚至形成資損,因此在以找出系統弱點爲目的的前提下,須要最小化故障影響範圍,而且當出現嚴重問題時能夠迅速恢復,即故障是可控的。鑑於此,有時候能夠引入A/B測試,最小化影響範圍。tcp
上面是最理想狀況下的混沌工程,現實中咱們須要根據現有軟件成熟度有階段的實施混沌:分佈式
此外,混沌工程能夠認爲是通用型異常不定時不定目標不定異常類型的自動化實現,若是拋開這層,手動對目標機器注入特定的一種或多種異常,並輔以對應的異常恢復手段,那咱們就能夠在通用異常測試中應用。
因爲混沌工程主要是注入特定的事件並引發系統故障,既然是「幹壞事」的,因此咱們將其命名成了「威震天」(變形金剛中的反派Boss)。因爲咱們還處於第一階段,因此故障的注入主要是人爲控制,目前已實現的故障類型有:
參考文獻
PRINCIPLES OF CHAOS ENGINEERING
個人其餘博客
異步系統的兩種測試方法
個人開源項目 —— 方便產品、開發、測試三方協同自測的管理工具
捉蟲記
ps:
有贊測試組在持續招人中,大量崗位空缺,只要你來,就能幫你點亮全棧開發技能樹,有意向換工做的同窗能夠發簡歷到 sunjun@youzan.com