【51CTO.com原創(chuàng)稿件】隨著蘇寧多機房的成功部署,流量分流大大緩解了主機房的流量壓力。
圖片來自 Pexels
但是主機房存在規(guī)劃不合理,硬件設備老化,基礎設施不完善等因素,短期內(nèi)還無法徹底的解決,這些”達摩克利斯之劍“一直懸在蘇寧 IT 人的心頭。
如果主機房出現(xiàn)宕機,我們能否將流量整體切到備用機房?能否快速恢復業(yè)務?沒人給出肯定的答復,因為誰也沒實踐過。
既然大家都沒有實踐過,那最好的方式就是在生產(chǎn)上來一次真實的機房宕機。經(jīng)過技術調(diào)研和評估,我們選擇了混沌工程,它通過系統(tǒng)性實驗形式,實現(xiàn)整機房宕機演練。
什么是混沌工程
我們先來了解下什么是混沌工程,混沌工程最早是由 Netflix 在《chaos engineering》中提出的,屬于一門新興的技術學科。
按照 Netflix 的定義,混沌工程是在分布式系統(tǒng)上進行實驗的學科, 目的是建立對系統(tǒng)抵御生產(chǎn)環(huán)境中失控條件的能力以及信心。
我們把它與我們熟知的故障注入測試做個對比,首先它們有著很多的重疊性,它們都是通過制造某種”故障”,來測試系統(tǒng)的反饋;其次,它們也有著明顯的區(qū)別。
①實施形式:故障注入測試是屬于測試領域的范疇,主要針對的是一種場景的一種特定方法。
混沌工程是一門實驗學科,可以采用多種方式探索復制系統(tǒng)的不良行為,是一種系統(tǒng)性實踐。
②實施方法:故障注入測試,主要還是針對錯誤或者故障,比如接口不通,通訊超時等破壞性行為。
而對于資源搶占,流量激增,拜占庭失敗這些嚴格意義上無法稱之為錯誤的不良行為,就無能為力了。混沌工程正是對這些弱錯誤或者影響層面的探索非常感興趣。
③實施結(jié)果:故障測試可以對結(jié)果進行斷言,給定特定條件,系統(tǒng)將發(fā)出特定輸出。
測試通常是二進制態(tài)的,并確定屬性是真還是假,它不會產(chǎn)生關于系統(tǒng)的新知識,只是將效價分配給它的已知屬性。
而混沌工程,對結(jié)果不可以預知,通過實驗產(chǎn)生新的知識,混沌工程是一種實驗形式,可以探索關于系統(tǒng)的新知識。
這也是混沌工程作為一門實驗學科的重要使命。簡而言之,混沌工程就一門探索新知識的實驗學科。
為什么是混沌工程
整機房宕機實踐活動具有以下的特征:
- 系統(tǒng)性,包括網(wǎng)絡,主機,進程等,是涉及基礎設施和應用系統(tǒng)層面綜合性實驗工程。
 - 不可預知性,其過程中發(fā)現(xiàn)的部分問題是不可預知的。
 - 有序性,過程一定是有序可控的,是生產(chǎn)演練的基本要求。
 
這些活動特征與混沌工程理念高度匹配,這就是我們選擇混沌工程的主要原因,通過設計并且進行混沌實驗,了解到系統(tǒng)脆弱的一面,在還沒出現(xiàn)對用戶造成傷害之前,我們就能主動發(fā)現(xiàn)這些問題。
按照混沌工程的原則,它的實施是有前提條件的,結(jié)合實施條件和蘇寧的現(xiàn)狀,我們對以下試驗的條件進行評估:
- 系統(tǒng)彈性能力是否滿足,健壯性是否達到要求。
 - 系統(tǒng)的監(jiān)控能力是否滿足,各層級的監(jiān)控指標是否全面覆蓋。
 - 應急措施和方案是否滿足,一旦出現(xiàn)不可預知的場景,能否快速的應急和回退。
 
近些年,蘇寧的線上流量每年成倍數(shù)級的增長,IT 基礎設施的不斷完善,在生產(chǎn)實踐中逐步具備這些能力。拋開蘇寧電商的業(yè)務特色,這些實施標準是具有通用性的。
混沌工程的實施原則
混沌工程并不意味是”混亂”,它的實施過程涉及到系統(tǒng),設施,場景,人員等各方面資源,必須是有原則,有序的,才能組織和協(xié)調(diào)各方資源來實現(xiàn)最終的目的。
它的實施原則有:
①一個目標,即實施整機房宕機。混沌工程作為新興領域?qū)W科,包含的場景和內(nèi)容非常豐富,我們需要結(jié)合目標進行取舍。方案和實施都必須圍繞目標,避免過度設計。
②最小爆炸半徑。生產(chǎn)試驗過程中,必不可少的會對線上系統(tǒng)造成影響,造成用戶投訴,最小爆炸半徑就是結(jié)合方案和目標,減少對用戶的影響。
圖 1:爆炸半徑影響范圍
爆炸半徑越小,越容易得到控制,但是暴露問題會較少;爆炸半徑越大,影響就越大,暴露的問題會更多,爆炸半徑的選擇與各階段的目標以及實施能力是相匹配的。
③循序漸進,分解目標。圍繞最終目標,進行目標分解,由簡入繁,由小到大。
圖 2:實施目標分解
該過程既能積累經(jīng)驗,又能給予團隊以信心,信心非常重要:
- 單系統(tǒng)應用節(jié)點,單個系統(tǒng)的應用層,如 Jboss,Tomcat 節(jié)點故障。
 - 單系統(tǒng)分庫節(jié)點,單個系統(tǒng)的數(shù)據(jù)層分庫,如 Redis,MySQL 的分庫節(jié)點故障。
 - 單個系統(tǒng)的全庫節(jié)點,單個系統(tǒng)的數(shù)據(jù)層全庫,如 Redis,MySQL 的全庫節(jié)點故障。
 - 組件節(jié)點,主要是指 Paas 的能力節(jié)點,如網(wǎng)關,消息分發(fā),服務注冊等節(jié)點故障。
 - 控制節(jié)點,是指集群控制節(jié)點,如 etcd,Zookeeper,Sentinel 等故障。
 - 接入/匯聚/核心網(wǎng),是指接入/匯聚/核心網(wǎng)斷網(wǎng)故障。
 - 物理機/機柜斷電,是指某臺物理機或者某臺機柜斷電故障。
 - DCI 網(wǎng)絡,是指 DCI(Data Center Interconnection)網(wǎng)絡故障。
 - 機房斷電,是指整個機房斷電。
 
將以上各目標組合,形成以下階段性目標:
- 單系統(tǒng)故障,是指某個應用系統(tǒng)故障,是單系統(tǒng)應用和全局故障的組合。
 - 全鏈路故障,是所有系統(tǒng)故障組合。
 - 機房內(nèi)基礎設施故障,是接入/匯聚/核心網(wǎng)絡以及設備斷電故障組合。
 - 整機房基礎設施故障,是指 DCI 故障以及機房斷電組合。
 - 整機房故障,是指所有故障的整合。
 
通過各個階段故障的組合,最終達到整機房的目的。
混沌工程平臺實現(xiàn)
“工欲善其事,必先利其器”, 結(jié)合我們的目標和實施原則,研發(fā)一套混沌工程平臺。
Netflix 在《chaos engineering》中提出可以進行以下的試驗輸入:
- 模擬整個 IDC 宕掉
 - 選擇一部分網(wǎng)絡連接注入特定時間的延遲
 - 隨機讓一些函數(shù)拋出異常
 - 強制 NTP 時間不同步
 - 生成 IO 錯誤
 - 榨干 CPU
 
對于系統(tǒng)級別的故障注入,初期并不是直接 Kill 應用進程,而是通過屏蔽虛機源目通訊端口,中斷 TCP 連接,這樣既能達到造成系統(tǒng)不可能的目的,又能最大程度確保系統(tǒng)快速恢復。
對于斷電,目前還是靠人工操作。當前階段混沌工程僅涉及全鏈路級別故障。
功能架構(gòu)
圖 3:平臺功能架構(gòu)
混沌系統(tǒng)的功能架構(gòu)分三層,自下而上包括:
- 能力層,提供各種故障注入指令庫,包括網(wǎng)絡,存儲,虛機,應用等。
 - 功能層,主要是平臺的各種功能,其中最主要是指令管理,以及任務管理。指令管理是維護相關指令信息和腳本。任務管理是維護相關的任務信息,包括單系統(tǒng)以及全鏈路,任務是各動作的有序集合。
 - 編排層,主要針對系統(tǒng)運維人員,通過一系列的配置,編排動作,單系統(tǒng)任務,全鏈路任務,指定執(zhí)行的依賴關系和順序,使整個執(zhí)行過程有序可控。
 
故障注入流程
圖 4:故障注入流程
故障注入流程如下:
- 任務編排,混沌工程平臺編排注入指令任務,并從平臺數(shù)據(jù)系統(tǒng)獲取目標虛機數(shù)據(jù)。
 - 下發(fā)故障注入指令,啟動故障注入任務后,下發(fā)相關指令到目標虛機。混沌平臺需要和各網(wǎng)絡區(qū)打通。
 - 具有以下特點:安全管控,對身份和指令進行驗證,確保任務執(zhí)行安全;分布式部署,承擔并發(fā)壓力,整機房系統(tǒng)所涉及到的虛機數(shù)有 10萬+ 臺,需要并發(fā)執(zhí)行,以減少故障注入時間,降低業(yè)務影響。
 - 故障注入執(zhí)行,每臺虛機上部署 Agent,收到指令后負責具體的注入操作。
 - 告警檢測,虛機注入故障后,監(jiān)控系統(tǒng)會探測到告警信息。
 - 流量切換,根據(jù)告警機器,告警類型,告警級別觸發(fā)流量的切換,當前階段是否需要進行流量切換,還需要人工決策。
 
故障恢復流程
故障注入后,需要進行恢復操作,其流程與注入類似。即下發(fā)恢復指令到 Agent,清除之前的故障指令。需要注意的是, Agent 的通訊端口作為白名單處理,否則注入后會導致混沌工程系統(tǒng)集群無法連接到虛機。
自愈功能
故障注入后,為防止某種原因?qū)е戮W(wǎng)絡不通,恢復指令無法下達到虛機,導致業(yè)務無法恢復,所以需要有自愈功能,在一段時間(自定義)沒有收到新的指令,那么 Agent 將自動執(zhí)行其對應的恢復指令。
總結(jié)
混沌工程平臺上線以來,模擬各類異常場景,進行生產(chǎn)上各層次的流量切換演練,發(fā)現(xiàn)了多個關鍵性問題,為最終的整機房宕機演練成功以及機房穩(wěn)定性夯實了基礎。
混沌工程作為一門領域?qū)W科,包含的內(nèi)容非常豐富。由于項目的緊迫性以及資源的限制,蘇寧的混沌工程現(xiàn)階段還是圍繞整機房宕機演練這個目標而開展的。
在此基礎上,后續(xù)我們將逐步拓展,包括故障注入的場景覆蓋,自動化運行,流量切換和應急聯(lián)動等,整體提升蘇寧云的災備能力。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】




















 
 
 










 
 
 
 