接收程序員的技術(shù)早餐 天翼電子商務(wù)有限公子(簡(jiǎn)稱“甜橙金融”)是中國(guó)電信的全資子公司,2011 年 3 月成立于北京,現(xiàn)賬戶用戶已突破 1.5 億,成為國(guó)內(nèi)最大的民生繳費(fèi)平臺(tái)、移動(dòng)支付領(lǐng)域 5 強(qiáng)、互聯(lián)網(wǎng)金融領(lǐng)域 16 強(qiáng)。甜橙金融技術(shù)團(tuán)隊(duì)在經(jīng)歷 2016 年成功“上云”后,便開始著手建設(shè)新華南機(jī)房。新華南機(jī)房的設(shè)計(jì)目標(biāo)是與當(dāng)前的兩個(gè)華東機(jī)房一起,形成符合甜橙金融業(yè)務(wù)快速發(fā)展需要兼顧迎檢要求的“兩地三中心”異地雙活架構(gòu)。 本文系統(tǒng)介紹了我們?cè)跇I(yè)務(wù)需求驅(qū)動(dòng)下的數(shù)據(jù)中心建設(shè)的演進(jìn)過程,以及我們?cè)诖嘶A(chǔ)上進(jìn)行的 “ 異地雙活 ” 探索和驗(yàn)證,其中“ 異地雙活 ”主要是基于數(shù)據(jù)訪問層( Data Access Layer,DAL )和數(shù)據(jù)層庫(kù)( Database )兩個(gè)方面展開介紹, 希望在雙活建設(shè)上能給大家?guī)硇碌乃悸贰?/p> 圖 1. 甜橙金融 IDC 機(jī)房架構(gòu)演進(jìn) 1. 本地?cái)?shù)據(jù)中心階段(2011 年 -2013 年) 最初的機(jī)房架構(gòu)比較單一。華東、華南兩地各有一個(gè)本地機(jī)房,且各本地機(jī)房主要負(fù)責(zé)華東、華南兩個(gè)研發(fā)中心自身的發(fā)展需求。兩個(gè)本地機(jī)房之間通過 CN2 和 DCN 直連。 圖 2. 甜橙金融本地?cái)?shù)據(jù)中心架構(gòu) 在發(fā)展初期,這樣的 IDC 機(jī)房架構(gòu)加上兩地研發(fā)中心,使得我們的業(yè)務(wù)在短時(shí)間內(nèi)得以快速開發(fā)迭代、部署落地,一定程度上滿足了當(dāng)時(shí)的業(yè)務(wù)需求。 架構(gòu)痛點(diǎn):2013 年后期,在經(jīng)歷了幾次大型促銷活動(dòng)引發(fā)的一系列故障后,本地機(jī)房架構(gòu)的短板逐漸浮現(xiàn),如業(yè)務(wù)沒有跨機(jī)房冗余,在出現(xiàn)緊急事件時(shí)無(wú)法繼續(xù)提供必要服務(wù)等。因此,經(jīng)過內(nèi)部討論評(píng)估,我們初步制定了 IDC 機(jī)房架構(gòu)的演進(jìn)策略,開始著手建設(shè)同城機(jī)房。 2. 同城冷備階段(2014 年 -2015 年) 這一階段我們?cè)谌A東地區(qū)規(guī)劃并建設(shè)了兩個(gè)同城機(jī)房,兩個(gè)華東數(shù)據(jù)中心均可以為華東研發(fā)中心提供業(yè)務(wù)相關(guān)服務(wù)。之所以依舊定義為同城冷備主要還是基于數(shù)據(jù)層面,因?yàn)閺臄?shù)據(jù)層面上說這種機(jī)房架構(gòu)仍屬于冷備架構(gòu)。雖然兩個(gè)數(shù)據(jù)中心的應(yīng)用服務(wù)都可以接受并處理用戶請(qǐng)求,但用戶對(duì)數(shù)據(jù)的請(qǐng)求則同一時(shí)間只在固定的數(shù)據(jù)中心中讀寫。由于同城機(jī)房的網(wǎng)絡(luò)延時(shí)基本可以忽略,兩個(gè)數(shù)據(jù)中心則通過數(shù)據(jù)庫(kù)層面進(jìn)行異步數(shù)據(jù)同步。 圖 3. 甜橙金融同城冷備數(shù)據(jù)中心架構(gòu) 同城冷備架構(gòu)讓我們的個(gè)人賬戶等核心業(yè)務(wù)有了必要的業(yè)務(wù)容災(zāi)條件,同時(shí)由于兩個(gè)數(shù)據(jù)中心都可以處理正常業(yè)務(wù)請(qǐng)求,所以數(shù)據(jù)中心整體的資源處理能力也成倍擴(kuò)充。 架構(gòu)痛點(diǎn): 添加新的數(shù)據(jù)中心除了帶來 IDC、線路、維護(hù)成本上的增加外,并沒有解決我們?nèi)A南數(shù)據(jù)中心業(yè)務(wù)無(wú)冗余的困境,且由于其中一個(gè)數(shù)據(jù)中心的數(shù)據(jù)是冷備數(shù)據(jù),當(dāng)出現(xiàn)嚴(yán)重故障時(shí),冷備數(shù)據(jù)是否可以直接拉起使用也因業(yè)務(wù)差異而定。 隨著甜橙金融業(yè)務(wù)的發(fā)展,我們認(rèn)為華東數(shù)據(jù)中心同城冷備架構(gòu)已無(wú)法滿足我們業(yè)務(wù)發(fā)展的需求,但是受限于當(dāng)時(shí)的基礎(chǔ)技術(shù)儲(chǔ)備能力,因此我們計(jì)劃進(jìn)行全業(yè)務(wù)改造,逐步滿足建立異地雙活機(jī)房條件。 3. 同地區(qū)冷備階段(2016 年 10 月 -2017 年 4 月) 為了逐步建立異地雙活機(jī)房架構(gòu),我們?cè)?2015 年底便首先啟動(dòng)全業(yè)務(wù)的上云改造。到 2016 年 10 月底,在經(jīng)過 1 年多的業(yè)務(wù)改造及數(shù)據(jù)中心基礎(chǔ)建設(shè)后,甜橙金融將原有的兩個(gè)華東同城百公里內(nèi)數(shù)據(jù)中心改造為兩個(gè)同地區(qū)四百公里內(nèi)數(shù)據(jù)中心。這樣做的目的是為了進(jìn)一步驗(yàn)證同城冷備架構(gòu)在異地是否繼續(xù)可行,并且對(duì)遠(yuǎn)距離數(shù)據(jù)同步中出現(xiàn)的問題進(jìn)行調(diào)研。 兩個(gè)同地區(qū)數(shù)據(jù)中心的地位和之前也有區(qū)別:在保持原同城冷備方案的前提下,華東新數(shù)據(jù)中心定位為主數(shù)據(jù)中心,主要負(fù)責(zé)處理甜橙金融核心業(yè)務(wù);華東容災(zāi)數(shù)據(jù)中心則負(fù)責(zé)生產(chǎn)數(shù)據(jù)的異地容災(zāi)備份。 在這一階段,我們的新華南數(shù)據(jù)中心也通過調(diào)研,加緊建設(shè)中。 圖 4. 甜橙金融同地區(qū)冷備數(shù)據(jù)中心架構(gòu) 4. 異地冷備階段(2017 年 4 月至今) 新華南數(shù)據(jù)中心建成后,我們開始將同地區(qū)數(shù)據(jù)中心的冷備架構(gòu)下線,并同期建設(shè)為數(shù)據(jù)容災(zāi)中心。新的華南數(shù)據(jù)中心則規(guī)劃為可以承載部分公共業(yè)務(wù)的應(yīng)用級(jí)異地雙活。 在這一階段建設(shè)初期,我們繼續(xù)沿用已經(jīng)比較成熟的應(yīng)用級(jí)雙活經(jīng)驗(yàn),將華東、華南兩個(gè)數(shù)據(jù)中心的數(shù)據(jù)訪問全部集中在華東主數(shù)據(jù)中心。業(yè)務(wù)上則針對(duì)跨千公里的網(wǎng)絡(luò)環(huán)境進(jìn)行相應(yīng)改造。畢竟在原有的應(yīng)用設(shè)計(jì)時(shí),一些業(yè)務(wù)判斷會(huì)強(qiáng)依賴數(shù)據(jù)返回時(shí)延,跨千公里網(wǎng)絡(luò)時(shí)延一般在 20-50ms 內(nèi),這個(gè)對(duì)某些業(yè)務(wù)會(huì)產(chǎn)生較大影響。 圖 5. 甜橙金融異地冷備數(shù)據(jù)中心架構(gòu) 架構(gòu)痛點(diǎn): 在跨千公里數(shù)據(jù)中心數(shù)據(jù)同步方面,由于華南副中心的數(shù)據(jù)只是冷備數(shù)據(jù),所以設(shè)計(jì)之初我們便定義其數(shù)據(jù)可用級(jí)別為 T 1 日。當(dāng)然,這樣的設(shè)計(jì)在數(shù)據(jù)恢復(fù)上存在一定問題,比如華南的副中心由于網(wǎng)絡(luò)擁堵導(dǎo)致數(shù)據(jù)同步延遲較大,這時(shí)如果華東主數(shù)據(jù)中心出現(xiàn)災(zāi)難性故障,則副中心只能有限接管業(yè)務(wù)——數(shù)據(jù)時(shí)延最大可能一天。 故障的恢復(fù)會(huì)采用以下兩種方案:
不管采用哪種方案,這樣的數(shù)據(jù)恢復(fù)時(shí)長(zhǎng)對(duì)于核心業(yè)務(wù)來說是無(wú)法忍受的,這也是我們當(dāng)前只在公共業(yè)務(wù)里采用異地應(yīng)用級(jí)雙活架構(gòu)的原因。 在數(shù)據(jù)中心建設(shè)告一段落后,我們將重點(diǎn)轉(zhuǎn)移到如何實(shí)現(xiàn)真正的異地雙活上來,在實(shí)現(xiàn)異地雙活架構(gòu)時(shí)所面臨的問題主要包括以下幾個(gè):
其中,跨千公里數(shù)據(jù)異地同步的難度在業(yè)內(nèi)有著廣泛共識(shí),受限于現(xiàn)在市面中的主流關(guān)系型數(shù)據(jù)庫(kù)都是基于 CAP 理論做底層設(shè)計(jì)(注:CAP 理論是指一款數(shù)據(jù)產(chǎn)品在數(shù)據(jù)一致性、可用性和分區(qū)耐受性三者中只能同時(shí)滿足其中任意兩者。),因此數(shù)據(jù)異地同步就需要對(duì) CAP 理論進(jìn)行規(guī)避。 針對(duì)上述的問題,我們制定了兩種類型方案并著手進(jìn)行方案驗(yàn)證:
采用消息進(jìn)行異地?cái)?shù)據(jù)同步在業(yè)內(nèi)已有很多成功案例。在我們的技術(shù)方案里,首先要做的是將被選定進(jìn)行異地雙活改造的應(yīng)用入口逐漸收攏,從多入口(域名)訪問改造為統(tǒng)一的入口路由。這樣,入口級(jí)應(yīng)用 MAPI 應(yīng)運(yùn)而生,它上線后將之前相對(duì)零散的業(yè)務(wù)訪問統(tǒng)一起來,這也為后面我們針對(duì) MAPI 做流量分發(fā)及控制提供了必要條件。 圖 6. 甜橙金融異地雙活方案之消息分發(fā) & DAL 層改造 MAPI 通過 DNS 解析將入口流量進(jìn)行多機(jī)房分發(fā),業(yè)務(wù)請(qǐng)求生成的消息會(huì)寫入到兩地的機(jī)房中。接下來本地機(jī)房的消費(fèi)者會(huì)通過 DAL 層將落盤數(shù)據(jù)分發(fā)到相應(yīng)的數(shù)據(jù)分片里,然后通過數(shù)據(jù)庫(kù)自身的復(fù)制機(jī)制,有延時(shí)的將本地?cái)?shù)據(jù)中心的數(shù)據(jù)同步一份到異地?cái)?shù)據(jù)中心。這樣既可保證每個(gè)數(shù)據(jù)中心都會(huì)保留一份全量數(shù)據(jù),也可以保證以華東主數(shù)據(jù)中心為主,向華東容災(zāi)數(shù)據(jù)中心。 Consumer 和 DAL 的改造是該方案的難點(diǎn)。在實(shí)施時(shí),我們根據(jù)業(yè)務(wù)的性質(zhì)進(jìn)行了單元化劃分,這也是業(yè)內(nèi)實(shí)現(xiàn)雙活架構(gòu)的常用方案。將不能進(jìn)行單元化的業(yè)務(wù)以全局區(qū)域存放,而可以單元化處理的業(yè)務(wù)模塊則放入本地區(qū)域。 圖 7. Global Zone 和 Local Zone 如前文所述,面對(duì)異地雙活最大的技術(shù)難點(diǎn)數(shù)據(jù)一致性問題,其實(shí)主要還是受限于關(guān)系型數(shù)據(jù)及 CAP 原理。因此,通過一些技術(shù)手段對(duì) CAP 原理進(jìn)行規(guī)避也能夠達(dá)到滿足業(yè)務(wù)的數(shù)據(jù)一致性要求。 這里,我有兩個(gè)數(shù)據(jù)層改造的思路分享給大家: 1. 基于 MongoDB 副本集的異地雙活架構(gòu): MongoDB 是天然提供分片的 NoSQL 數(shù)據(jù)庫(kù),這樣的天然分片被稱為副本集。副本集的存在為每個(gè) MongoDB 的分片節(jié)點(diǎn)提供了相應(yīng)的高可用。 它在寫入持久性和讀取一致性上提供了更強(qiáng)的處理能力。比如,通過 write concern 來指定寫入副本的數(shù)量,無(wú)論采用應(yīng)答式寫入還是非應(yīng)答式寫入,均可保證跨數(shù)據(jù)中心的集群發(fā)生故障時(shí),總會(huì)有相應(yīng)的副本存在以保證寫安全。另外,MongoDB 是滿足 BASE 理論設(shè)計(jì)的,因此可以從一定程度上規(guī)避 CAP 理論帶來的問題。 圖 8. 基于 MongoDB 副本集的雙活架構(gòu) MongoDB 還有一個(gè)適合多數(shù)據(jù)中心部署的特征是其故障自動(dòng) Failover。這一特性對(duì)于異地雙活有重要意義,數(shù)據(jù)庫(kù)運(yùn)維人員可以不用太在意各數(shù)據(jù)中心的數(shù)據(jù)庫(kù)節(jié)點(diǎn)的狀態(tài)。我們?cè)谶M(jìn)行的方案驗(yàn)證時(shí),當(dāng)集群中的節(jié)點(diǎn)發(fā)生故障或出現(xiàn)網(wǎng)絡(luò)中斷,MongoDB 基本可以在 5 秒內(nèi)完成故障的 Failover 過程,這主要依賴集群對(duì)整個(gè)副本集的配置,發(fā)生故障后可以在剩余的副本集中選擇一個(gè)新的主 shards。 2. 基于分布式數(shù)據(jù)庫(kù)(NewSQL)的異地雙活架構(gòu): 從 Google 的 Spanner & F1 論文放出后,業(yè)內(nèi)對(duì)于如何打造一套跨數(shù)據(jù)中心的強(qiáng)一致性分布式數(shù)據(jù)庫(kù)的工程實(shí)踐方法有了深刻的認(rèn)識(shí)和理解。 在開源數(shù)據(jù)庫(kù)領(lǐng)域,目前有兩個(gè)受 Google Spanner & F1 影響并建立發(fā)展的分布式關(guān)系數(shù)據(jù)庫(kù) (NewSQL) 尤其引人矚目。他們分別是來自國(guó)內(nèi)的 PingCAP 團(tuán)隊(duì)做的 TiDB 分布式關(guān)系數(shù)據(jù)庫(kù)項(xiàng)目和美國(guó)團(tuán)隊(duì)的 CockroachDB 分布式關(guān)系數(shù)據(jù)庫(kù)項(xiàng)目。這兩個(gè)根據(jù) Spanner & F1 體系打造的分布式關(guān)系數(shù)據(jù)庫(kù) (NewSQL) 目前在全球頂級(jí)開源分布式數(shù)據(jù)庫(kù)領(lǐng)域展開了直接的競(jìng)爭(zhēng)。 我們?cè)谔剿鞫嘀行碾p活數(shù)據(jù)中心架構(gòu)演進(jìn)的時(shí)候,考慮到開源社區(qū)的穩(wěn)定及活躍程度,重點(diǎn)調(diào)研和關(guān)注 TiDB 在多中心架構(gòu)多活模式中的技術(shù)價(jià)值和架構(gòu)探討。TiDB 在數(shù)據(jù)庫(kù)領(lǐng)域?qū)儆谧钚碌牡谌植际疥P(guān)系數(shù)據(jù)庫(kù),其具備如下 NewSQL 核心特性:
TiDB 整個(gè)項(xiàng)目和產(chǎn)品的運(yùn)作方式以標(biāo)準(zhǔn)的國(guó)際開源項(xiàng)目在運(yùn)營(yíng)和發(fā)展,這點(diǎn)也是我們重點(diǎn)圍繞 TiDB 做探索性研究論證的主要?jiǎng)右颍粋€(gè)健康發(fā)展的開源項(xiàng)目能夠使得我們?cè)趹?yīng)用其到比如多中心多活這樣的業(yè)務(wù)場(chǎng)景中,更有信心和保障。 TiDB 數(shù)據(jù)庫(kù)的主要架構(gòu)如下: 圖 9.TiDB 架構(gòu)(圖出自 TiDB 官網(wǎng)) TiDB Server (分布式計(jì)算集群):TiDB Server 負(fù)責(zé)接收 SQL 請(qǐng)求,處理 SQL 相關(guān)的邏輯,并通過 PD 找到存儲(chǔ)計(jì)算所需數(shù)據(jù)的 TiKV 地址,與 TiKV 交互獲取數(shù)據(jù)。 TiKV Server (數(shù)據(jù)分布式存儲(chǔ)集群):TiKV Server 負(fù)責(zé)存儲(chǔ)數(shù)據(jù),從外部看 TiKV 是一個(gè)分布式的提供事務(wù)的 Key-Value 存儲(chǔ)引擎。 PD Server (管理集群):Placement Driver (簡(jiǎn)稱 PD) 是整個(gè)集群的管理模塊,其主要工作有三個(gè): 一是存儲(chǔ)集群的元信息(某個(gè) Key 存儲(chǔ)在哪個(gè) TiKV 節(jié)點(diǎn));二是對(duì) TiKV 集群進(jìn)行調(diào)度和負(fù)載均衡(如數(shù)據(jù)的遷移、Raft group leader 的遷移等);三是分配全局唯一且遞增的事務(wù) ID。 結(jié)合我們?nèi)A東主數(shù)據(jù)中心、容災(zāi)數(shù)據(jù)中心和華南數(shù)據(jù)的三中心布局,在異地多活的場(chǎng)景中,我們?cè)O(shè)計(jì)的甜橙金融基于 TiDB 數(shù)據(jù)庫(kù)的雙活架構(gòu)如下所示: 圖 10. 甜橙金融異地雙活架構(gòu) TiDB 分布式數(shù)據(jù)庫(kù)在多中心多活的部署和運(yùn)行模式下,依靠其核心調(diào)度 PD 對(duì)跨 1000 公里以上集群的調(diào)度管理。我們?cè)趯?shí)驗(yàn)后,總結(jié)了以下重要特點(diǎn):
下面就 整個(gè)多中心多活的具體可用性實(shí)現(xiàn)做一個(gè)拆解分析,我們的雙活架構(gòu)如下圖所示: 圖 11. 基于 TiDB 的異地雙活架構(gòu) 業(yè)務(wù)應(yīng)用接入層高可用設(shè)計(jì) 業(yè)務(wù)應(yīng)用通過 F5 , HAProxy , LVS 之類常規(guī)提供 4-7 層的負(fù)載均衡設(shè)備接入,負(fù)載均衡器通過流量接入后,通過流量轉(zhuǎn)發(fā),直接發(fā)往 TiDB 分布式 SQL 引擎層進(jìn)行業(yè)務(wù)計(jì)算。接入層的高可用,可以通過常規(guī)負(fù)載均衡的后向服務(wù)探測(cè),完成檢測(cè)和流量切換。對(duì)業(yè)務(wù)應(yīng)用透明。 TiDB 分布式 SQL 引擎計(jì)算層高可用設(shè)計(jì) TiDB 分布式 SQL 引擎為無(wú)狀態(tài)服務(wù),即任意一個(gè)集群節(jié)點(diǎn)不保留狀態(tài)數(shù)據(jù)??梢噪S時(shí)增加節(jié)點(diǎn)和減少節(jié)點(diǎn)。節(jié)點(diǎn)發(fā)生故障后,通過前向服務(wù)探測(cè)和感知,可以自動(dòng)隔離故障節(jié)點(diǎn),剩余的 SQL 引擎服務(wù)實(shí)例可以正常的工作不受影響。對(duì)業(yè)務(wù)透明。 TiKV 分布式存儲(chǔ)引擎層高可用設(shè)計(jì) 圖 12.TiDB 底層 Region 設(shè)計(jì)原理 TiKV 分布式存儲(chǔ)引擎層也是高可用集群架構(gòu),內(nèi)置多種高可用底層保障機(jī)制,最核心的 Raft 機(jī)制確保位于每臺(tái)服務(wù)器上的每個(gè) TiKV 服務(wù)實(shí)例中都有數(shù)據(jù)的副本存在,整個(gè) TiKV 集群 如同 RAID 磁盤陣列,每個(gè)節(jié)點(diǎn)上都有業(yè)務(wù)數(shù)據(jù),同時(shí)也有部分的校驗(yàn)數(shù)據(jù) (在 TiDB 中為數(shù)據(jù)副本)。 默認(rèn)副本配置為 3 個(gè),低于 50% 的節(jié)點(diǎn)故障都可以透明容忍,對(duì)業(yè)務(wù)應(yīng)用的訪問沒有任何影響。 故障節(jié)點(diǎn)被新節(jié)點(diǎn)替換或修復(fù)后重新上線后,集群調(diào)度器會(huì)自動(dòng)建立數(shù)據(jù)的重平衡分配任務(wù)。這個(gè)過程對(duì)業(yè)務(wù)完全透明。 PD 集群調(diào)度器高可用設(shè)計(jì) 圖 13.PD 設(shè)計(jì)原理 PD 集群調(diào)度器是整個(gè)集群的管理節(jié)點(diǎn),自身也是一套高可用集群的設(shè)計(jì)。PD 集群保存有整個(gè)集群的管理元數(shù)據(jù),PD 節(jié)點(diǎn)之間通過 Raft 建立強(qiáng)一致性數(shù)據(jù)復(fù)制,任意 PD 的損壞或故障均可通過內(nèi)部的高可用機(jī)制重新選舉 Leader 對(duì)外繼續(xù)提供服務(wù)。Leader 選舉過程非常短暫,且選舉過程本身對(duì)業(yè)務(wù)應(yīng)用無(wú)影響,PD 所在節(jié)點(diǎn)的存儲(chǔ)設(shè)備(如磁盤)物理?yè)p壞,既不會(huì)影響 PD 中集群元數(shù)據(jù)的安全(Raft 復(fù)制機(jī)制保證),也不會(huì)影響真實(shí)的業(yè)務(wù)數(shù)據(jù)的安全性。 在新技術(shù)的嘗試和引入時(shí),甜橙金融內(nèi)部采取更包容的心態(tài),以期待新技術(shù)可以帶給業(yè)務(wù)更可靠、便捷的基礎(chǔ)服務(wù),以應(yīng)對(duì)更快速的業(yè)務(wù)增長(zhǎng)和更嚴(yán)峻的技術(shù)挑戰(zhàn)。甜橙金融成立 7 年來,從數(shù)據(jù)中心演進(jìn)建設(shè)到數(shù)據(jù)層雙活探索,過程中的探索和思考是我最想和大家分享的。希望我們正在做的一些嘗試,能給正在進(jìn)行“兩地三中心”建設(shè)的同學(xué)在數(shù)據(jù)中心建設(shè)、應(yīng)用級(jí)雙活和數(shù)據(jù)級(jí)雙活上帶來一些新的思路,歡迎業(yè)內(nèi)有此方面研究的朋友一起交流。 作者介紹張小虎,現(xiàn)任甜橙金融技術(shù)總監(jiān),運(yùn)維技術(shù)中心負(fù)責(zé)人,在數(shù)據(jù)庫(kù)內(nèi)核、云高可用架構(gòu)以及 Devops 上有深入研究。當(dāng)前負(fù)責(zé)甜橙金融運(yùn)維體系設(shè)計(jì)及前沿基礎(chǔ)技術(shù)研究。目前主要工作集中在異地多活架構(gòu)實(shí)施及 AIOPS 上。 |
|