首頁>科技>

隨著蘇寧多機房的成功部署,流量分流大大緩解了主機房的流量壓力。

圖片來自 Pexels

但是主機房存在規劃不合理,硬體裝置老化,基礎設施不完善等因素,短期內還無法徹底的解決,這些”達摩克利斯之劍“一直懸在蘇寧 IT 人的心頭。

如果主機房出現宕機,我們能否將流量整體切到備用機房?能否快速恢復業務?沒人給出肯定的答覆,因為誰也沒實踐過。

既然大家都沒有實踐過,那最好的方式就是在生產上來一次真實的機房宕機。經過技術調研和評估,我們選擇了混沌工程,它通過系統性實驗形式,實現整機房宕機演練。

什麼是混沌工程

我們先來了解下什麼是混沌工程,混沌工程最早是由 Netflix 在《chaos engineering》中提出的,屬於一門新興的技術學科。

按照 Netflix 的定義,混沌工程是在分散式系統上進行實驗的學科, 目的是建立對系統抵禦生產環境中失控條件的能力以及信心。

我們把它與我們熟知的故障注入測試做個對比,首先它們有著很多的重疊性,它們都是通過製造某種”故障”,來測試系統的反饋;其次,它們也有著明顯的區別。

①實施形式:故障注入測試是屬於測試領域的範疇,主要針對的是一種場景的一種特定方法。

混沌工程是一門實驗學科,可以採用多種方式探索複製系統的不良行為,是一種系統性實踐。

②實施方法:故障注入測試,主要還是針對錯誤或者故障,比如介面不通,通訊超時等破壞性行為。

而對於資源搶佔,流量激增,拜占庭失敗這些嚴格意義上無法稱之為錯誤的不良行為,就無能為力了。混沌工程正是對這些弱錯誤或者影響層面的探索非常感興趣。

測試通常是二進位制態的,並確定屬性是真還是假,它不會產生關於系統的新知識,只是將效價分配給它的已知屬性。

而混沌工程,對結果不可以預知,通過實驗產生新的知識,混沌工程是一種實驗形式,可以探索關於系統的新知識。

這也是混沌工程作為一門實驗學科的重要使命。簡而言之,混沌工程就一門探索新知識的實驗學科。

為什麼是混沌工程

整機房宕機實踐活動具有以下的特徵:

系統性,包括網路,主機,程序等,是涉及基礎設施和應用系統層面綜合性實驗工程。不可預知性,其過程中發現的部分問題是不可預知的。有序性,過程一定是有序可控的,是生產演練的基本要求。

這些活動特徵與混沌工程理念高度匹配,這就是我們選擇混沌工程的主要原因,通過設計並且進行混沌實驗,了解到系統脆弱的一面,在還沒出現對使用者造成傷害之前,我們就能主動發現這些問題。

按照混沌工程的原則,它的實施是有前提條件的,結合實施條件和蘇寧的現狀,我們對以下試驗的條件進行評估:

系統彈效能力是否滿足,健壯性是否達到要求。系統的監控能力是否滿足,各層級的監控指標是否全面覆蓋。應急措施和方案是否滿足,一旦出現不可預知的場景,能否快速的應急和回退。

近些年,蘇寧的線上流量每年成倍數級的增長,IT 基礎設施的不斷完善,在生產實踐中逐步具備這些能力。拋開蘇寧電商的業務特色,這些實施標準是具有通用性的。

混沌工程的實施原則

混沌工程並不意味是”混亂”,它的實施過程涉及到系統,設施,場景,人員等各方面資源,必須是有原則,有序的,才能組織和協調各方資源來實現最終的目的。

它的實施原則有:

①一個目標,即實施整機房宕機。混沌工程作為新興領域學科,包含的場景和內容非常豐富,我們需要結合目標進行取捨。方案和實施都必須圍繞目標,避免過度設計。

②最小爆炸半徑。生產試驗過程中,必不可少的會對線上系統造成影響,造成使用者投訴,最小爆炸半徑就是結合方案和目標,減少對使用者的影響。

爆炸半徑越小,越容易得到控制,但是暴露問題會較少;爆炸半徑越大,影響就越大,暴露的問題會更多,爆炸半徑的選擇與各階段的目標以及實施能力是相匹配的。

該過程既能積累經驗,又能給予團隊以信心,信心非常重要:

單系統應用節點,單個系統的應用層,如 Jboss,Tomcat 節點故障。單系統分庫節點,單個系統的資料層分庫,如 Redis,MySQL 的分庫節點故障。單個系統的全庫節點,單個系統的資料層全庫,如 Redis,MySQL 的全庫節點故障。元件節點,主要是指 Paas 的能力節點,如閘道器,訊息分發,服務註冊等節點故障。控制節點,是指叢集控制節點,如 etcd,Zookeeper,Sentinel 等故障。接入/匯聚/核心網,是指接入/匯聚/核心網斷網故障。物理機/機櫃斷電,是指某臺物理機或者某臺機櫃斷電故障。DCI 網路,是指 DCI(Data Center Interconnection)網路故障。機房斷電,是指整個機房斷電。

將以上各目標組合,形成以下階段性目標:

單系統故障,是指某個應用系統故障,是單系統應用和全域性故障的組合。全鏈路故障,是所有系統故障組合。機房內基礎設施故障,是接入/匯聚/核心網路以及裝置斷電故障組合。整機房基礎設施故障,是指 DCI 故障以及機房斷電組合。整機房故障,是指所有故障的整合。

通過各個階段故障的組合,最終達到整機房的目的。

混沌工程平臺實現

“工欲善其事,必先利其器”, 結合我們的目標和實施原則,研發一套混沌工程平臺。

Netflix 在《chaos engineering》中提出可以進行以下的試驗輸入:

模擬整個 IDC 宕掉選擇一部分網路連線注入特定時間的延遲隨機讓一些函式丟擲異常強制 NTP 時間不同步生成 IO 錯誤榨乾 CPU

對於系統級別的故障注入,初期並不是直接 Kill 應用程序,而是通過遮蔽虛機源目通訊埠,中斷 TCP 連線,這樣既能達到造成系統不可能的目的,又能最大程度確保系統快速恢復。

對於斷電,目前還是靠人工操作。當前階段混沌工程僅涉及全鏈路級別故障。

功能架構

混沌系統的功能架構分三層,自下而上包括:

能力層,提供各種故障注入指令庫,包括網路,儲存,虛機,應用等。功能層,主要是平臺的各種功能,其中最主要是指令管理,以及任務管理。指令管理是維護相關指令資訊和指令碼。任務管理是維護相關的任務資訊,包括單系統以及全鏈路,任務是各動作的有序集合。編排層,主要針對系統運維人員,通過一系列的配置,編排動作,單系統任務,全鏈路任務,指定執行的依賴關係和順序,使整個執行過程有序可控。

故障注入流程

故障注入流程如下:

任務編排,混沌工程平臺編排注入指令任務,並從平臺數據系統獲取目標虛機資料。下發故障注入指令,啟動故障注入任務後,下發相關指令到目標虛機。混沌平臺需要和各網路區打通。具有以下特點:安全管控,對身份和指令進行驗證,確保任務執行安全;分散式部署,承擔併發壓力,整機房系統所涉及到的虛機數有 10萬+ 臺,需要併發執行,以減少故障注入時間,降低業務影響。故障注入執行,每臺虛機上部署 Agent,收到指令後負責具體的注入操作。告警檢測,虛機注入故障後,監控系統會探測到告警資訊。流量切換,根據告警機器,告警型別,告警級別觸發流量的切換,當前階段是否需要進行流量切換,還需要人工決策。

故障恢復流程

故障注入後,需要進行恢復操作,其流程與注入類似。即下發恢復指令到 Agent,清除之前的故障指令。需要注意的是, Agent 的通訊埠作為白名單處理,否則注入後會導致混沌工程系統叢集無法連線到虛機。

自愈功能

故障注入後,為防止某種原因導致網路不通,恢復指令無法下達到虛機,導致業務無法恢復,所以需要有自愈功能,在一段時間(自定義)沒有收到新的指令,那麼 Agent 將自動執行其對應的恢復指令。

總結

混沌工程平臺上線以來,模擬各類異常場景,進行生產上各層次的流量切換演練,發現了多個關鍵性問題,為最終的整機房宕機演練成功以及機房穩定性夯實了基礎。

混沌工程作為一門領域學科,包含的內容非常豐富。由於專案的緊迫性以及資源的限制,蘇寧的混沌工程現階段還是圍繞整機房宕機演練這個目標而開展的。

在此基礎上,後續我們將逐步拓展,包括故障注入的場景覆蓋,自動化執行,流量切換和應急聯動等,整體提升蘇寧雲的災備能力。

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 乾貨分享:谷歌全球73.9TB衛星影像是如何下載完成的?