隨著蘇寧線下線上業(yè)務(wù)以及全產(chǎn)業(yè)、全業(yè)態(tài)規(guī)模式快速增長,特別是每年蘇寧 818 大促、雙 11 等大促節(jié)點,銷售訂單基本都呈現(xiàn)倍數(shù)級增長態(tài)勢,需要進行大量資源擴容,單個的容量有限,已經(jīng)無法支撐蘇寧業(yè)務(wù)的快速發(fā)展。同時,單數(shù)據(jù)中心在高可用上存在不足,一旦數(shù)據(jù)中心發(fā)生故障,會導(dǎo)致業(yè)務(wù)受損,用戶訪問中斷,帶來嚴(yán)重的影響。針對以上問題,蘇寧規(guī)劃建設(shè)多數(shù)據(jù)中心解決方案迫在眉睫。
1方案選擇
參考業(yè)界多數(shù)據(jù)中心實踐,目前主流的多數(shù)據(jù)中心的解決方案有如下幾個:
主備模式
同城雙活
多活模式
介紹這幾個方案前,我們先來看下相關(guān)概念:
Cell:業(yè)務(wù)可封閉收斂最小執(zhí)行分片;業(yè)務(wù)對請求空間按一定維度(比如會員、門店等)劃分分片。
LDC:邏輯數(shù)據(jù)中心,是由多個業(yè)務(wù)可封閉 cell 組成的集合單元,擁有獨立的基礎(chǔ)中間件系統(tǒng)(包括 RPC, MQ, DNS 等),以及出口網(wǎng)絡(luò)等。
PDC:物理數(shù)據(jù)中心,指物理上獨立的一棟建筑,一般每棟有好幾層, 存放一系列機柜和上千和上萬服務(wù)器, 構(gòu)成一個 PDC。
AZ(Available Zone):可用區(qū),具有獨立的故障隔離空間,擁有獨立網(wǎng)絡(luò)設(shè)施或電力設(shè)備,由相鄰的單個或多個 PDC 組成。
Region:地理區(qū)域,有多可用區(qū)所組成的集合,區(qū)域之間故障域完全隔離。
1、主備模式
主機房提供服務(wù),備用機房不提供服務(wù),當(dāng)主機房故障,服務(wù)可切換到備用機房接管。
2、同城雙活
同一個集群橫跨同城兩個不同的 AZ,兩個 AZ 同時對外提供服務(wù),同時允許跨機房訪問不同服務(wù)以及數(shù)據(jù)庫。
3、多活模式
多個機房同時提供服務(wù),業(yè)務(wù)請求盡量收斂在同一個機房,當(dāng)某個機房故障時,可以切換其它接管機房。
4、方案比較
鑒于蘇寧線上 / 線下交易業(yè)務(wù)和支付業(yè)務(wù)特性,以及異地數(shù)據(jù)中心的要求,通過技術(shù)評估和決策,最終選擇多活模式。
由于選擇了難度最大的一種方案模式,多活方案將涵蓋蘇寧所有核心業(yè)務(wù)以及基礎(chǔ)組件,需要考慮和關(guān)注的問題非常多,一旦設(shè)計發(fā)生偏差,調(diào)整的代價將非常大。為了確保方案的合理性,可實施性,首先我們討論并制定了頂層設(shè)計,包括目標(biāo)、價值和設(shè)計原則,并在設(shè)計過程中不斷的復(fù)盤,以保證設(shè)計不偏離主航道。
2頂層設(shè)計
頂層設(shè)計是多活相關(guān)的干系中心經(jīng)過充分討論,并最終達成一致的最高方針??傮w方案以及各個業(yè)務(wù)系統(tǒng)方案都必須有嚴(yán)格遵守的規(guī)范和要求,包括目標(biāo)、價值和原則。
1、目標(biāo)
機房水平擴展:單機房容量有限,業(yè)務(wù)高增長帶來大量的資源需求,多活需要具備機房水平擴展能力,為資源擴容提供保障。
機房之間同城和異地高可用:單機房存在單點故障風(fēng)險,多活需要具備機房級別的高可用能力,在一個機房出現(xiàn)故障時,能夠?qū)⒘髁靠焖偾械狡渌5臋C房,對業(yè)務(wù)的影響降低到最小。
2、價值
支持業(yè)務(wù)的快速發(fā)展:蘇寧每年的業(yè)務(wù)規(guī)模成倍數(shù)級增長,所依賴的 IT 資源也快速增長,通過機房的水平擴展,解決單機房容量不足問題,以支持業(yè)務(wù)的發(fā)展。
同城與異地容災(zāi):當(dāng)機房出現(xiàn)電源或網(wǎng)絡(luò)以及地震等機房級別故障,通過機房級別的流量切換實現(xiàn)同城與異地容災(zāi),將對業(yè)務(wù)的影響降低到可控水平。
混合云降低持有成本:由于電商業(yè)務(wù)的特殊性,大促流量與平時流量相差上百倍,大促期間將流量劃撥到公有云,在多活能力的基礎(chǔ)上,實現(xiàn)私有云與公有云混部,降低私有云長期持有成本。
灰度發(fā)布:實現(xiàn)按機房級別流量逐步灰度發(fā)布,降低業(yè)務(wù)版本故障影響面,提升版本發(fā)布質(zhì)量。
3、原則
同一用戶的交易盡量在一個數(shù)據(jù)中心內(nèi)部完成。蘇寧對于交易業(yè)務(wù)按照用戶緯度對數(shù)據(jù)分片,特定的用戶路由到特定的數(shù)據(jù)中心,保證一個用戶的交易在一個數(shù)據(jù)中心完成。
業(yè)務(wù)無需感知多數(shù)據(jù)中心。核心業(yè)務(wù)在多個數(shù)據(jù)中心部署,提供服務(wù),業(yè)務(wù)無需感知自己在哪個機房,即便數(shù)據(jù)中心發(fā)生切換,業(yè)務(wù)也無需感知。
盡量節(jié)省資源。由于多機房部署導(dǎo)致成本上升,需要通過調(diào)整高可用部署方案降低多機房部署成本。
基于頂層設(shè)計的要求,開始多活總體方案的架構(gòu)設(shè)計。
3架構(gòu)設(shè)計
1、相關(guān)概念
分片服務(wù):對應(yīng)的數(shù)據(jù)僅在某個 Cell 存在,其它 Cell 不與交叉或共享,比如會員服務(wù)、訂單服務(wù)等。
共享服務(wù):所有 Cell 擁有相同的數(shù)據(jù),相互共享,比如價格服務(wù)、商品服務(wù)等。
索引服務(wù):用于索引數(shù)據(jù)提供服務(wù),類似共享服務(wù)。
競爭 (控制) 服務(wù):各個 Cell 相互操作同一個數(shù)據(jù),為了保證數(shù)據(jù)一致性,需要在同一個數(shù)據(jù)中心進行控制,比如庫存的扣減、用戶注冊等。
競爭 Proxy 服務(wù):用于競爭服務(wù)前置服務(wù),比如庫存前置調(diào)撥服務(wù)。
2、服務(wù)架構(gòu)
按照用戶分布到不同的數(shù)據(jù)中心,多個數(shù)據(jù)中心都提供服務(wù),在一個數(shù)據(jù)中心出現(xiàn)問題時,可以隨時將流量切到另外一個正常的數(shù)據(jù)中心。
服務(wù)規(guī)劃:根據(jù)業(yè)務(wù)不同功能,將服務(wù)拆分為分片服務(wù),共享服務(wù),競爭服務(wù),索引服務(wù),控制服務(wù)以及管理服務(wù)。各服務(wù)類型單獨設(shè)置路由規(guī)則,同時支持灰度路由。
統(tǒng)一服務(wù)路由:從接入層到服務(wù)層以及最終的數(shù)據(jù)層,都遵守統(tǒng)一的路由策略,保證同一用戶的交易在一個數(shù)據(jù)中心完成。
數(shù)據(jù)高可用:多數(shù)據(jù)中心保證數(shù)據(jù)庫高可用,采用全冗余方式,數(shù)據(jù)在任何一個數(shù)據(jù)中心都是可用的,從而保證高可用,任一數(shù)據(jù)中心故障,不影響數(shù)據(jù)的可用性。
3、服務(wù)路由
流量的分布是由服務(wù)路由來決定的,而路由的功能由各組件承載并實現(xiàn),主要分成以下幾部分:
DNS:根據(jù)用戶所在位置就近路由到對應(yīng)的 CDN。
CDN:根據(jù)用戶請求信息按照一定的規(guī)則路由到對應(yīng)的數(shù)據(jù)中心。
SLB:根據(jù)用戶請求信息路由到同機房或其它機房。
RPC/MQ:根據(jù)用戶請求信息按照一定的路由規(guī)則分發(fā)到不同的數(shù)據(jù)中心。
DAL:數(shù)據(jù)接入層對用戶所處的分片進行校驗,確保不出現(xiàn)數(shù)據(jù)異?;驍?shù)據(jù)沖突。
4、服務(wù)收斂
基于服務(wù)路由的功能,為了實現(xiàn)同一用戶的交易在同一數(shù)據(jù)中心進行,減少跨數(shù)據(jù)中心網(wǎng)絡(luò)延遲,需要對用戶流量進行精準(zhǔn)分發(fā)。流量在進入數(shù)據(jù)中心前,按照一定的路由規(guī)則,確定好待分發(fā)的目標(biāo)中心,以減少數(shù)據(jù)中心之間的二次轉(zhuǎn)發(fā)。比如,蘇寧在 CDN 層進行用戶的初次路由,將用戶分發(fā)到不同的數(shù)據(jù)中心。
數(shù)據(jù)中心內(nèi)部,對服務(wù)層設(shè)置多種路由策略,比如設(shè)置接入層、RPC、DAL 等的路由方式以及業(yè)務(wù)服務(wù)拆分,使得同一個用戶所有請求盡量收斂在同一個數(shù)據(jù)中心,實現(xiàn)流量精準(zhǔn)劃撥,避免跨機房調(diào)用。
請求的收斂設(shè)計確保流量按照 Cell 級別劃撥到不同的數(shù)據(jù)中心,并在同一中心封閉收斂,這也是實現(xiàn)多數(shù)據(jù)中心部署的基礎(chǔ)。
5、數(shù)據(jù)高可用
為了確保數(shù)據(jù)高可用以及任何一個機房故障都可被接管,所有數(shù)據(jù)中心都包含全量數(shù)據(jù),當(dāng)主數(shù)據(jù)中心的變更將會實時同步到各個從數(shù)據(jù)中心。
數(shù)據(jù)中心之間延遲相對數(shù)據(jù)中心內(nèi)部延遲較大,數(shù)據(jù)中心之間的同步一般采用異步復(fù)制方式。在機房故障等極端情況,將出現(xiàn)少量數(shù)據(jù)未同步到其它數(shù)據(jù)中心,針對此類故障場景,在機房恢復(fù)后,需要對未同步的數(shù)據(jù)進行人工修復(fù)。
4技術(shù)難點
按照多活的架構(gòu)設(shè)計,并結(jié)合蘇寧的業(yè)務(wù)特點和 IT 技術(shù)現(xiàn)狀,需要優(yōu)先解決相關(guān)的技術(shù)難點。
1、高可用實現(xiàn)
高可用實現(xiàn)原則
數(shù)據(jù)中心高可用分成兩部分:
(1)單數(shù)據(jù)中心內(nèi)高可用
集群內(nèi)部高可用
無狀態(tài)服務(wù) (比如應(yīng)用服務(wù)器):采用 N+1 方式部署,任何一臺故障,流量都可被其它機器所接管。
有狀態(tài)服務(wù) (比如數(shù)據(jù)庫):采用 2N(一主一從)或 3N(一主兩從)方式部署,任何一臺故障,在秒級切換到另外一臺機器。
(2)多數(shù)據(jù)中心間高可用
單系統(tǒng)同城高可用:任何一個系統(tǒng)有計劃維修或非計劃性故障,都可切換到另外一個數(shù)據(jù)中心
全鏈路同城高可用:當(dāng)機房級別故障或維修時,可切換到另外一個機房接管。
全鏈路異地高可用:當(dāng)出現(xiàn)地震等特殊場景,異地機房可進行接管,避免同城兩個數(shù)據(jù)中心同時故障等異常場景。
其中機房級別故障切換時間一般在分鐘級別。
高可用實現(xiàn)指標(biāo)
RPO(Recovery Point Object):表示機房級別故障時,未被同步的數(shù)據(jù)時長??紤]到 MySQL 在特殊情況下復(fù)制延遲較大情況下,RPO 設(shè)置為分鐘級別,正常情況下 RPO 為秒級
RTO(Recovery Target Object):表示機房故障情況下,關(guān)鍵流程或系統(tǒng)切換恢復(fù)時間,一般為分鐘級別
WRT(Work Recovery Time):表示故障時,由于 RPO 導(dǎo)致的未同步異常數(shù)據(jù)修復(fù)完成時長,一般為小時級別。
高可用實踐
服務(wù)切換
(1)數(shù)據(jù)復(fù)制拓撲結(jié)構(gòu)
對于分片數(shù)據(jù)跨機房復(fù)制方式主要分成兩種:
單向交叉復(fù)制:兩個機房同一個分庫的兩個不同集群之間采用主備模式進行復(fù)制,僅主集群提供寫操作,如上圖所示 Cell4 的 LDC-B 做為主集群復(fù)制到 LDC-A 備集群, Cell8 的 LDC-A 主集群復(fù)制到 LDC-B 的備集群
雙向復(fù)制:兩個機房同一個分庫的兩個不同集群之間采用主 – 主模式進行復(fù)制,兩個機房的集群同時提供寫操作服務(wù)
復(fù)制拓撲結(jié)構(gòu)比較
為了確保數(shù)據(jù)的一致性和避免出錯概率以及數(shù)據(jù)存儲分布不規(guī)整,蘇寧初期采用單向交叉復(fù)制拓撲結(jié)構(gòu)。
(2)數(shù)據(jù)遷移與規(guī)整
為了實現(xiàn)按用戶分 Cell 分布到不同數(shù)據(jù)中心,并且蘇寧業(yè)務(wù)形態(tài)的多樣性以及一些歷史遺留問題,比如單表記錄過多(超過 1 億),不利于多數(shù)據(jù)中心的擴展,為此需要對數(shù)據(jù)按照一定的規(guī)則重新遷移和規(guī)整。
對原有數(shù)據(jù)做快照,然后對快照數(shù)據(jù)重新規(guī)整到新的分庫分表。
對原有集群增量數(shù)據(jù)準(zhǔn)實時抽取 Binlog 數(shù)據(jù)規(guī)整到新的集群。
通過 DAL 灰度劃撥流量寫入到新的集群,直至所有數(shù)據(jù)切換到新集群。
(3)服務(wù)切換
對于分片數(shù)據(jù)服務(wù),分片服務(wù)按照一定規(guī)則對 Cell 分組進行切換,確保應(yīng)用層的服務(wù)和數(shù)據(jù)可以同時切換,避免數(shù)據(jù)寫入異常。
跨數(shù)據(jù)鏈路切換
為了實現(xiàn)部分流量全鏈路劃撥到不同的數(shù)據(jù)中心,以及在數(shù)據(jù)中心故障時能夠快速接管業(yè)務(wù),所有多數(shù)據(jù)中心流程分發(fā)和服務(wù)調(diào)度全部由基礎(chǔ)中間件平臺完成,無需業(yè)務(wù)感知數(shù)據(jù)中心故障或流量劃撥,這樣整體切換時間會大大縮短,快速恢復(fù)業(yè)務(wù)。從而實現(xiàn)數(shù)據(jù)中心之間同城高可用以及異地高可用。
具體步驟如下:
接管機房對應(yīng)的從庫提升為主庫。
服務(wù)寫操作切換到新的接管機房。
服務(wù)(SLB/RPC/MQ)切換到新的接管機房。
CDN 流量重定向到新的接管機房。
2、灰度部署與上線
為了確保多機房部署時,拓撲結(jié)構(gòu)和配置的變化,不影響到整個業(yè)務(wù)系統(tǒng)運行,采用灰度部署方案,分以下幾個階段:
基礎(chǔ)組件部署:比如 RPC、MQ、WAF、數(shù)據(jù)庫等的部署
業(yè)務(wù)系統(tǒng)部署:比如訂單系統(tǒng)、會員系統(tǒng)、促銷系統(tǒng)、商品系統(tǒng)等的部署
組件和系統(tǒng)部署完成了,為了確保業(yè)務(wù)穩(wěn)定上線,生產(chǎn)的流量逐步劃撥,前一個步驟的完成為下一個步驟的準(zhǔn)入條件。
具體如下:
用白名單(內(nèi)部用戶)進行測試,驗證部署和配置的正確性。
進行單系統(tǒng)流量劃撥,確保每個系統(tǒng)切換的正確性。
全鏈路流量劃撥,確保端到端切換的正確性。
3、全鏈路監(jiān)控
蘇寧的業(yè)務(wù)種類繁多,為確保核心交易業(yè)務(wù)的可靠性和擴展性,現(xiàn)階段優(yōu)先對這些業(yè)務(wù)進行多活改造和多數(shù)據(jù)中心部署。
一次交易請求,落在哪個數(shù)據(jù)中心處理,請求失敗是由哪個業(yè)務(wù)節(jié)點導(dǎo)致等等,這就需要一套完善的監(jiān)控平臺,對全鏈路,多數(shù)據(jù)中心的各個環(huán)節(jié)進行全方位,高精度的監(jiān)控。
監(jiān)控平臺主要分成以下幾個部分:
日志:分別在每個機房部署日志組件,避免跨機房傳輸日志帶寬消耗,查詢通過聯(lián)邦模式匯總查詢。
指標(biāo) (metrics): 每個機房匯總到指標(biāo)數(shù)據(jù)到主機房,以便指標(biāo)在主機房匯總查詢。
調(diào)用鏈:分別在每個機房部署調(diào)用鏈,調(diào)用鏈也是通過聯(lián)邦模式查詢。
4、故障演練
為了模擬機房故障,通過混沌工程逐步提高爆炸半徑,模擬業(yè)務(wù)故障,減少對業(yè)務(wù)的影響,主要故障模擬如下:
單系統(tǒng)故障模擬:比如訂單系統(tǒng)或會員系統(tǒng)單個系統(tǒng)故障
全鏈路故障模擬:比如交易鏈路或支付鏈路多個系統(tǒng)同時故障
網(wǎng)絡(luò)故障模擬:比如交換機或路由器等故障
整個機房級別故障模擬:比如電源(市電、UPS 等)故障導(dǎo)致整個機房故障
通過混沌工程模擬可以相對真實驗證整個多活系統(tǒng)的容災(zāi)能力,整個模擬對業(yè)務(wù)的影響都相對可控,大大降低對業(yè)務(wù)的影響。
5多活拓展
在多活方案設(shè)計過程中,需要綜合考慮蘇寧 IT 基礎(chǔ)設(shè)施規(guī)劃,其中異地部署和混合云部署是多活能力的拓展和延伸。
1、異地部署
由于同城機房資源受限,并且同城部署無法解決地震等極端故障,因此需要引入異地部署。異地多數(shù)據(jù)中心相比同城多數(shù)據(jù)中心,最大的問題就是網(wǎng)絡(luò)延遲明顯增大,數(shù)據(jù)中心的寬帶相對受限,需要在架構(gòu)和整體的解決方案上進行考慮,通過技術(shù)手段實現(xiàn)異地多數(shù)據(jù)中心的高可用性,降低延遲。同時需要通過組件對傳輸數(shù)據(jù)進行壓縮和傳輸限流,確保傳輸?shù)臄?shù)據(jù)在有限的寬帶可控范圍內(nèi)。
蘇寧多活架構(gòu)從一開始就是按照異地部署架構(gòu)來設(shè)計,大大降低同城和異地部署異構(gòu)性和運維復(fù)雜性。
2、混合云部署
蘇寧業(yè)務(wù)系統(tǒng)大促流量是平時業(yè)務(wù)流量的十倍甚至上百倍,日常資源都是按照大促的峰值進行準(zhǔn)備,資源持有和運維成本較高,資源采購,上線周期較長。因此大促期間,通過將部分流量彈到公有云,利用公有云的彈性能力,為私有云進行削峰,大大降低蘇寧私有云長期持有成本,以及運維成本。
混合云相比原有多活需要做如下的能力拓展:
安全管控:公有云與私有云屬于不同的信任域,對于公有云與私有云相互訪問進行管控,確?;旌显凭W(wǎng)絡(luò)之間安全;以及公有云數(shù)據(jù)存儲安全管控。
快速部署:由于公有云是根據(jù)按量或按月 / 按年計費,快速部署能力可以降低公有云資源成本使用時長。
非對稱部署:由于公有云與私有云處理能力不一樣,可以通過非對稱部署降低公有云和私有云成本。
6總結(jié)
多數(shù)據(jù)中心多活項目作為蘇寧重大項目,經(jīng)過 3 年左右的建設(shè),已于 2019 年上線,歷經(jīng) 818 和雙 11 等大促考驗,實現(xiàn)關(guān)鍵鏈路從單機房平滑過渡到多機房的突破,支撐了業(yè)務(wù)的快速發(fā)展;并在機房出現(xiàn)真實故障時,快速實現(xiàn)業(yè)務(wù)恢復(fù),將故障影響降低到可控范圍內(nèi)。
混合云項目經(jīng)歷一年左右的建設(shè),也已初具規(guī)模,將為蘇寧后續(xù)的業(yè)務(wù)高速發(fā)展保駕護航,降低公司大促擴容成本。