持續(xù)可用和快速容災(zāi)切換的能力遭贸,是技術(shù)人員追求的極致目標(biāo)。在架構(gòu)設(shè)計(jì)中耳高,容災(zāi)設(shè)計(jì)強(qiáng)調(diào)的是系統(tǒng)對(duì)外界環(huán)境影響具備快速響應(yīng)能力,節(jié)點(diǎn)級(jí)別的快速恢復(fù)能力喊废,保障系統(tǒng)的持續(xù)可用祝高。
去年12月18日,全球架構(gòu)師峰會(huì)上污筷,阿里巴巴高級(jí)系統(tǒng)工程師曾歡(善衡)結(jié)合互聯(lián)網(wǎng)金融業(yè)務(wù)及系統(tǒng)特性工闺,分享了在支付寶系統(tǒng)架構(gòu)演進(jìn)中,每個(gè)階段的高可用和容災(zāi)能力建設(shè)的解決思路瓣蛀。
高可用和容災(zāi)架構(gòu)的意義
企業(yè)服務(wù)陆蟆、云計(jì)算、移動(dòng)互聯(lián)網(wǎng)領(lǐng)域中惋增,高可用的分布式技術(shù)為支撐平臺(tái)正常運(yùn)作提供著關(guān)鍵性的技術(shù)支撐叠殷。從用戶角度,特別是作為主要收入來(lái)源的企業(yè)用戶的角度出發(fā)诈皿,保證業(yè)務(wù)處理的正確性和服務(wù)不中斷(高可用性)是支撐用戶信心的重要來(lái)源林束。高性能像棘,高可用的分布式架構(gòu)就成了訪問(wèn)量高峰期時(shí),網(wǎng)站得以成功運(yùn)維的關(guān)鍵壶冒。
在當(dāng)今信息時(shí)代缕题,數(shù)據(jù)和信息逐漸成為各行各業(yè)的業(yè)務(wù)基礎(chǔ)和命脈。當(dāng)企業(yè)因?yàn)樾畔⒒瘞?lái)快捷的服務(wù)決策和方便管理時(shí)胖腾,也必須面對(duì)著數(shù)據(jù)丟失的危險(xiǎn)烟零。
容災(zāi)系統(tǒng),作為為計(jì)算機(jī)信息系統(tǒng)提供的一個(gè)能應(yīng)付各種災(zāi)難的環(huán)境咸作,尤其是計(jì)算機(jī)犯罪锨阿、計(jì)算機(jī)病毒、掉電记罚、網(wǎng)絡(luò)/通信失敗墅诡、硬件/軟件錯(cuò)誤和人為操作錯(cuò)誤等人為災(zāi)難時(shí),容災(zāi)系統(tǒng)將保證用戶數(shù)據(jù)的安全性(數(shù)據(jù)容災(zāi))毫胜,甚至书斜,一個(gè)更加完善的容災(zāi)系統(tǒng),還能提供不間斷的應(yīng)用服務(wù)(應(yīng)用容災(zāi))酵使〖黾可以說(shuō),容災(zāi)系統(tǒng)是數(shù)據(jù)存儲(chǔ)備份的最高層次口渔。
每年的“雙11”样屠、“雙12”都是全球購(gòu)物者的狂歡節(jié),今年的雙11有232個(gè)國(guó)家參與進(jìn)來(lái)缺脉,成為名副其實(shí)的全球瘋狂購(gòu)物節(jié)痪欲。11月11日,全天的交易額達(dá)到912.17億元攻礼,其中在移動(dòng)端交易額占比68%今年每秒的交易峰值達(dá)到14萬(wàn)筆业踢,螞蟻金服旗下的支付寶交易峰值達(dá)到8.59萬(wàn)筆/秒,這一系列的數(shù)字礁扮,考驗(yàn)的是支付寶背后強(qiáng)大的IT支持能力知举。而持續(xù)可用和快速容災(zāi)切換的能力,是支付寶技術(shù)人員追求的極致目標(biāo)太伊。
在架構(gòu)設(shè)計(jì)中雇锡,作為系統(tǒng)高可用性技術(shù)的重要組成部分,容災(zāi)設(shè)計(jì)強(qiáng)調(diào)的是系統(tǒng)對(duì)外界環(huán)境影響具備快速響應(yīng)能力僚焦,尤其是當(dāng)發(fā)生災(zāi)難性事件并對(duì)IDC節(jié)點(diǎn)產(chǎn)生影響時(shí)锰提,能夠具備節(jié)點(diǎn)級(jí)別的快速恢復(fù)能力贪薪,保障系統(tǒng)的持續(xù)可用挣菲。2015年12月18日枪芒,年度高端技術(shù)盛會(huì):“全球架構(gòu)師峰會(huì)——ArchSummit”在北京國(guó)際會(huì)議中心隆重召開(kāi)野蝇,會(huì)上,阿里巴巴高級(jí)系統(tǒng)工程師:善衡(曾歡)結(jié)合互聯(lián)網(wǎng)金融業(yè)務(wù)及系統(tǒng)特性谅年,分享了在支付寶系統(tǒng)架構(gòu)演進(jìn)中惩嘉,每個(gè)階段的高可用和容災(zāi)能力建設(shè)的解決思路。本文由其演講內(nèi)容整理而成踢故。
支付寶的系統(tǒng)架構(gòu),其發(fā)展歷程可以分為清晰的3個(gè)階段惹苗,每一個(gè)階段都有自己獨(dú)特的特點(diǎn)和架構(gòu)上相應(yīng)的痛點(diǎn)殿较。在每一個(gè)階段的發(fā)展過(guò)程中,支付寶的技術(shù)人員針對(duì)不同的問(wèn)題進(jìn)行諸多的思考桩蓉,在解決這些問(wèn)題的過(guò)程中也做了諸多的嘗試淋纲。
純真:童年時(shí)期2004年~2011年
在此階段,支付寶的系統(tǒng)架構(gòu)相對(duì)比較簡(jiǎn)化院究,如圖1所示洽瞬,通過(guò)商用LB讓用戶的流量進(jìn)到入口網(wǎng)關(guān)系統(tǒng),支付寶的系統(tǒng)服務(wù)暴露也通過(guò)商用設(shè)備掛在VIP下业汰,每個(gè)提供服務(wù)的應(yīng)用機(jī)器通過(guò)VIP來(lái)進(jìn)行負(fù)載均衡伙窃。早期支付寶的核心系統(tǒng)庫(kù)都在一個(gè)數(shù)據(jù)庫(kù)上(后期拆為多個(gè)數(shù)據(jù)庫(kù)),即每個(gè)核心系統(tǒng)都只用單獨(dú)的數(shù)據(jù)庫(kù)样漆。在這樣一個(gè)“物理上多機(jī)房为障,邏輯上單機(jī)房”的架構(gòu)背后,每天的業(yè)務(wù)量?jī)H僅為數(shù)十萬(wàn)級(jí)放祟,應(yīng)用系統(tǒng)也只有數(shù)十個(gè)鳍怨,容災(zāi)能力相對(duì)較低:例如單應(yīng)用出現(xiàn)問(wèn)題時(shí)無(wú)法及時(shí)有效地切換、主機(jī)和備用機(jī)進(jìn)行切換時(shí)跪妥,一定程度上會(huì)導(dǎo)致業(yè)務(wù)中斷鞋喇,甚至有時(shí)會(huì)有不得不進(jìn)行停機(jī)維護(hù)的情況,使得整個(gè)系統(tǒng)面對(duì)數(shù)據(jù)故障時(shí)顯得十分被動(dòng)眉撵。
隨著業(yè)務(wù)量的不斷增長(zhǎng)侦香,該架構(gòu)發(fā)展到2011年,出現(xiàn)了一些比較典型的問(wèn)題执桌。如下圖所示:由于系統(tǒng)內(nèi)部使用的都是LB設(shè)備鄙皇,商用LB的瓶頸就尤其明顯,由于業(yè)務(wù)的發(fā)展累計(jì)仰挣,VIP及其上面發(fā)布的服務(wù)越堆越多伴逸,設(shè)備如果出現(xiàn)抖動(dòng)或者宕機(jī)會(huì)對(duì)業(yè)務(wù)造成嚴(yán)重影響,這即是架構(gòu)上的單點(diǎn)膘壶。第二個(gè)問(wèn)題就是數(shù)據(jù)庫(kù)的單點(diǎn)瓶頸错蝴。隨著業(yè)務(wù)量的不斷增加洲愤,單一的核心數(shù)據(jù)庫(kù)一旦出現(xiàn)異常,比如硬件故障顷锰、負(fù)載異常等等柬赐,進(jìn)而會(huì)導(dǎo)致整個(gè)核心鏈路上的業(yè)務(wù)都不可用。
如何消除系統(tǒng)架構(gòu)當(dāng)中存在的單點(diǎn)問(wèn)題官紫,優(yōu)雅解決未來(lái)1-3年之間業(yè)務(wù)量增長(zhǎng)(數(shù)百萬(wàn)級(jí)/天)和機(jī)器數(shù)量增長(zhǎng)(數(shù)百個(gè)系統(tǒng))肛宋,是首先要解決的問(wèn)題,于是帶來(lái)了下一代架構(gòu)革新束世。
懵懂:少年時(shí)期2011年~2012年
鑒于第一階段支付寶碰到的這些痛點(diǎn)酝陈,在第二個(gè)階段,它將邏輯上的單個(gè)機(jī)房拆分成為多個(gè)機(jī)房毁涉,通過(guò)把硬負(fù)載轉(zhuǎn)換成為軟負(fù)載沉帮,以實(shí)現(xiàn)分布式的服務(wù)調(diào)用,如下圖所示贫堰。下圖為基于常見(jiàn)的消費(fèi)者和生產(chǎn)者模型來(lái)構(gòu)建的業(yè)務(wù)模型穆壕,其中配置中心負(fù)責(zé)服務(wù)注冊(cè)以及對(duì)應(yīng)服務(wù)提供方可用狀態(tài)變化的通知,從而將信息實(shí)時(shí)推送到消費(fèi)方的訂閱關(guān)系上其屏。值得注意的是喇勋,支付寶對(duì)原有架構(gòu)做了一個(gè)較大的改進(jìn):它將普通的一體化配置中心分拆成兩個(gè)模塊,一個(gè)Session模塊漫玄,用于管理消費(fèi)者和生產(chǎn)者的長(zhǎng)連接保持茄蚯;一個(gè)Data模塊,用于注冊(cè)服務(wù)時(shí)存儲(chǔ)相關(guān)睦优。通過(guò)這兩個(gè)模塊的深度解耦渗常,進(jìn)一步提高整個(gè)配置中心的性能。
除此之外汗盘,支付寶還做了數(shù)據(jù)的水平擴(kuò)展皱碘。其實(shí)早在2011年之前,支付寶就已經(jīng)開(kāi)始從事此項(xiàng)工作隐孽,根據(jù)用戶的UID癌椿,將一個(gè)交易庫(kù)水平拆分為多個(gè)庫(kù),如下圖所示菱阵。在此期間踢俄,需要解決的問(wèn)題就是“對(duì)應(yīng)用透明”,如何通過(guò)“應(yīng)用無(wú)感知”的方式進(jìn)行用戶數(shù)據(jù)庫(kù)的拆分晴及,是水平擴(kuò)展實(shí)施時(shí)首先要考慮的都办;其次,如何通過(guò)一個(gè)數(shù)據(jù)中間件來(lái)管理數(shù)據(jù)分片的規(guī)則,也是數(shù)據(jù)水平擴(kuò)展過(guò)程中的關(guān)鍵問(wèn)題琳钉。
通過(guò)上述兩個(gè)比較典型的優(yōu)化势木,支付寶的整個(gè)系統(tǒng)架構(gòu)如圖5所示。從應(yīng)用層面上來(lái)說(shuō)每個(gè)機(jī)房都是一個(gè)節(jié)點(diǎn)歌懒;從數(shù)據(jù)層面上啦桌,每個(gè)機(jī)房有特定的幾個(gè)數(shù)據(jù)分片在里面。在部署模式上及皂,當(dāng)支付寶擴(kuò)張到3個(gè)或4個(gè)機(jī)房的時(shí)候甫男,需要全局考慮數(shù)據(jù)分片部署,每個(gè)機(jī)房都有可能不可用验烧,這些備庫(kù)們應(yīng)當(dāng)分散到不同的多個(gè)機(jī)房里面查剖,從而達(dá)到多機(jī)房備災(zāi)的目的。
這種多機(jī)房多活的第二代架構(gòu)體系噪窘,其優(yōu)勢(shì)在于:
1.進(jìn)行了數(shù)據(jù)的水平拆分,從而理論上可以無(wú)限擴(kuò)展數(shù)據(jù)/資源效扫;
2.應(yīng)用多機(jī)房獨(dú)立部署倔监,不再存在單個(gè)機(jī)房影響整體的情況;
3.服務(wù)調(diào)用機(jī)房?jī)?nèi)隔離菌仁,通過(guò)軟負(fù)載的方式去做機(jī)房?jī)?nèi)的服務(wù)本地化浩习,不再去依賴另一個(gè)機(jī)房?jī)?nèi)相同的服務(wù);
4.相較上一個(gè)階段具有更高济丘、更可靠的可用性谱秽。
雖然在此過(guò)程中自然解決了上述的單點(diǎn)問(wèn)題,但仍存在一個(gè)問(wèn)題沒(méi)有解決摹迷。即數(shù)據(jù)庫(kù)日常維護(hù)時(shí)疟赊,或因?yàn)橛布墓收蠈?dǎo)致數(shù)據(jù)庫(kù)宕機(jī)時(shí),支付寶需要進(jìn)行主備切換峡碉,在此過(guò)程中業(yè)務(wù)是有損的狀態(tài)近哟。一般情況下當(dāng)IDC出現(xiàn)問(wèn)題的時(shí)候,工程師們會(huì)通過(guò)前端的流量管控系統(tǒng)先把用戶的流量從出現(xiàn)異常的機(jī)房切換到正常的機(jī)房中鲫寄,然后進(jìn)行數(shù)據(jù)庫(kù)的主備切換吉执,即將備用負(fù)載替換主用負(fù)載。
在這個(gè)過(guò)程中地来,有兩個(gè)比較大的痛點(diǎn):
1.主備切換時(shí)數(shù)據(jù)“一致性”的問(wèn)題戳玫,即主備切換時(shí),如何在把影響時(shí)間降至最低的情況下未斑,保證數(shù)據(jù)不被丟失咕宿,完完整整地拷貝至備用數(shù)據(jù)庫(kù)。
2.主備切換時(shí)數(shù)據(jù)存取不可用導(dǎo)致的業(yè)務(wù)暫停問(wèn)題。
一旦數(shù)據(jù)庫(kù)發(fā)生故障荠列,我們需要進(jìn)行主備切換時(shí)类浪,因?yàn)榍袚Q過(guò)程中的數(shù)據(jù)不可寫,部分用戶操作后的狀態(tài)不對(duì)肌似,對(duì)用戶來(lái)說(shuō)是會(huì)擔(dān)心的费就。為了解決這個(gè)問(wèn)題,我們制定了一個(gè)Failover方案川队。該方案主要通過(guò)業(yè)務(wù)層進(jìn)行改造力细,例如針對(duì)流水型的業(yè)務(wù)數(shù)據(jù),我們是這么來(lái)做的:正常進(jìn)行數(shù)據(jù)流量存取的時(shí)候固额,只有主庫(kù)提供路線服務(wù)眠蚂,主庫(kù)和備庫(kù)之間進(jìn)行正常的數(shù)據(jù)同步,但是Failover庫(kù)不進(jìn)行數(shù)據(jù)同步斗躏,正常狀態(tài)下對(duì)業(yè)務(wù)系統(tǒng)不可見(jiàn)逝慧。即正常情況下,沒(méi)有數(shù)據(jù)流經(jīng)過(guò)Failover庫(kù)啄糙,而且Failover庫(kù)是空的笛臣,沒(méi)有任何歷史數(shù)據(jù),如下圖所示:
一旦故障發(fā)生隧饼,主庫(kù)發(fā)生宕機(jī)沈堡,支付寶人員將通過(guò)容災(zāi)切換將所有數(shù)據(jù)的讀寫放置在FailOver數(shù)據(jù)層中進(jìn)行。因?yàn)槭菍?shí)時(shí)流水型的數(shù)據(jù)燕雁,所以不會(huì)對(duì)歷史數(shù)據(jù)產(chǎn)生任何依賴和影響诞丽。切換完成后,整個(gè)核心鏈路上的業(yè)務(wù)就已經(jīng)全面恢復(fù)起來(lái)了拐格。通過(guò)這種方式僧免,使得支付寶可以將數(shù)據(jù)庫(kù)在短短5分鐘內(nèi)進(jìn)行切換,一旦故障解除捏浊,隨時(shí)可以將數(shù)據(jù)讀寫重新切換到主存儲(chǔ)庫(kù)上來(lái)猬膨。
FailOver方案上線后,支付寶基本上所有的核心業(yè)務(wù)都基于此進(jìn)行了方案改造呛伴,并針對(duì)不同的業(yè)務(wù)(不僅限于應(yīng)用層)都會(huì)有不同的FailOver方案〔眨現(xiàn)在,支付寶在原有的方案基礎(chǔ)上再多準(zhǔn)備一個(gè)Failover數(shù)據(jù)庫(kù)(如圖8中藍(lán)色圖形所示)热康,與之前提到的容災(zāi)設(shè)計(jì)一樣沛申,如果需要進(jìn)一步保證Failover庫(kù)的可用性,還可以增加Failover庫(kù)的備庫(kù)姐军。此外Failover庫(kù)需要與主庫(kù)分開(kāi)铁材,可以與主庫(kù)尖淘、備庫(kù)都不放在同一個(gè)機(jī)房。
成熟:青年時(shí)期2012年~2015年
通過(guò)“多機(jī)房多活”的架構(gòu)改造以及FailOver方案的實(shí)施著觉,滿以為未來(lái)三年都無(wú)需為IDC資源去發(fā)愁的支付寶研發(fā)團(tuán)隊(duì)村生,在順利支撐完2012年的“雙11”,為下一年做規(guī)劃時(shí)卻發(fā)現(xiàn)夢(mèng)想破滅了饼丘。因?yàn)樗麄冇龅搅藝?yán)峻的新問(wèn)題:
1.DB連接數(shù)不夠趁桃。由于一個(gè)機(jī)房中的應(yīng)用系統(tǒng)就是一個(gè)節(jié)點(diǎn),沒(méi)有分片的概念肄鸽,僅僅只有數(shù)據(jù)的分片卫病。用戶進(jìn)入任意應(yīng)用節(jié)點(diǎn)時(shí),系統(tǒng)需要根據(jù)用戶的UID分片查用戶應(yīng)該去往哪個(gè)數(shù)據(jù)庫(kù)典徘,這時(shí)候每個(gè)應(yīng)用節(jié)點(diǎn)都會(huì)與所有數(shù)據(jù)庫(kù)節(jié)點(diǎn)保持連接蟀苛。而傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的連接數(shù)是十分寶貴的,當(dāng)支付寶面對(duì)不斷增長(zhǎng)的用戶擴(kuò)容需求時(shí)逮诲,因?yàn)镈B連接數(shù)資源無(wú)法繼續(xù)擴(kuò)充帜平,導(dǎo)致應(yīng)用也不能繼續(xù)擴(kuò)容了,不僅無(wú)法滿足日常增長(zhǎng)需求梅鹦,更別提“雙11”這樣短時(shí)間爆發(fā)式增長(zhǎng)的用戶需求罕模。
2.城市IDC資源限制問(wèn)題。2012年夏天帘瞭,杭州經(jīng)歷了長(zhǎng)時(shí)間高溫天氣,由于機(jī)房運(yùn)行的耗電較高蒿讥,市政為了緩解電力供應(yīng)壓力蝶念,下達(dá)了一紙通文,隨時(shí)可能關(guān)閉掉支付寶的某些機(jī)房供電芋绸。
3.機(jī)房間高流量問(wèn)題媒殉。由于一個(gè)業(yè)務(wù)請(qǐng)求與后端數(shù)據(jù)讀取之間的比例為1:N(其中N可能是幾十甚至上百),在“雙11”高流量的沖擊下摔敛,跨機(jī)房的流量會(huì)變得非常的大廷蓉,因此對(duì)于網(wǎng)絡(luò)帶寬和網(wǎng)絡(luò)質(zhì)量也有著非常高的要求。
4.跨IDC網(wǎng)絡(luò)延時(shí)問(wèn)題马昙。由于業(yè)務(wù)請(qǐng)求和后端數(shù)據(jù)讀取1:N配比問(wèn)題桃犬,導(dǎo)致同城機(jī)房之間距離稍微遠(yuǎn)一些,就會(huì)產(chǎn)生1行楞、2毫秒的同城機(jī)房延時(shí)攒暇,被擴(kuò)大后就會(huì)成為困擾用戶的網(wǎng)絡(luò)延時(shí)問(wèn)題。
新的問(wèn)題進(jìn)而帶來(lái)對(duì)新一代架構(gòu)的要求:
1.徹底解決DB連接數(shù)的問(wèn)題子房。
2.徹底解決IDC資源限制的問(wèn)題形用。需要支付寶走出杭州就轧,不能單單在杭州進(jìn)行機(jī)房的擴(kuò)張和建設(shè)。
3.保證業(yè)務(wù)的連續(xù)性田度。去減少故障發(fā)生的時(shí)候?qū)τ谟脩舻拇驍_妒御、對(duì)于業(yè)務(wù)的中斷。
4.藍(lán)綠發(fā)布镇饺。在日常發(fā)布時(shí)乎莉,會(huì)通過(guò)線下的發(fā)布測(cè)試,預(yù)發(fā)布兰怠,最終到線上的發(fā)布過(guò)程梦鉴。線上發(fā)布通常采用的是金絲雀模式,應(yīng)用分成多組進(jìn)行發(fā)布揭保,每一組的用戶不固定肥橙,可能會(huì)影響到大部分乃至全站的用戶。因此支付寶團(tuán)隊(duì)希望日常發(fā)布時(shí)秸侣,能夠最小限度影響用戶(可能是1%甚至1‰)存筏,新代碼上線之后最小力度來(lái)驗(yàn)證新代碼符合預(yù)期。因此需要一種新的發(fā)布方式來(lái)支持味榛。
5.高可用-異地多活椭坚。對(duì)于支付寶來(lái)說(shuō),傳統(tǒng)的“兩地三中心”要求:機(jī)房分屬兩個(gè)不同地區(qū)搏色,同城當(dāng)中兩個(gè)機(jī)房是“雙活”善茎,即活躍的主機(jī)房,異地機(jī)房通過(guò)復(fù)制數(shù)據(jù)來(lái)做“冷備”频轿,即備用機(jī)房垂涯。若同城兩個(gè)機(jī)房都出現(xiàn)問(wèn)題,一旦需要切換異地機(jī)房航邢,由于不知道異地冷備機(jī)房運(yùn)行起來(lái)是什么情況耕赘,因此很難決策。支付寶希望異地的機(jī)房也能實(shí)時(shí)進(jìn)行流量的讀寫膳殷,以便數(shù)據(jù)流量可以來(lái)回切換操骡,而不用擔(dān)心在切換后無(wú)法知道數(shù)據(jù)將是什么狀態(tài)。
6.????單元化赚窃〔嵴校基于上述幾個(gè)問(wèn)題的思考,支付寶走到了單元化的一步勒极。如圖9所示跨细,傳統(tǒng)的服務(wù)化架構(gòu)下每一次調(diào)用服務(wù)時(shí),系統(tǒng)都會(huì)隨機(jī)選擇一臺(tái)機(jī)器或一個(gè)節(jié)點(diǎn)完成整次的調(diào)用河质。而單元化之后支付寶可以把任何一個(gè)節(jié)點(diǎn)固定到一個(gè)單獨(dú)的單元內(nèi)冀惭,即固定的節(jié)點(diǎn)對(duì)應(yīng)一條固定的鏈路震叙,再基于數(shù)據(jù)分片的方法完成將節(jié)點(diǎn)“單元化”的設(shè)置。
單元化的核心思想包括核心剝離以及長(zhǎng)尾獨(dú)立散休。核心剝離指的是將核心業(yè)務(wù)進(jìn)行剝離媒楼;將業(yè)務(wù)數(shù)據(jù)按照UserID進(jìn)行拆分,從而實(shí)現(xiàn)多機(jī)房部署戚丸;在此基礎(chǔ)上將每一個(gè)機(jī)房的調(diào)用進(jìn)行封閉式設(shè)置划址;每一個(gè)單元中的業(yè)務(wù)數(shù)據(jù)無(wú)需和其它單元進(jìn)行同步。長(zhǎng)尾獨(dú)立則針對(duì)非核心的應(yīng)用限府,這些業(yè)務(wù)數(shù)據(jù)并不按照UID進(jìn)行拆分夺颤,核心業(yè)務(wù)并不依賴于長(zhǎng)尾應(yīng)用。
支付寶單元化架構(gòu)實(shí)現(xiàn)的主要思想有兩點(diǎn)胁勺,如下圖所示:
數(shù)據(jù)水平拆分世澜,即將所有線上核心業(yè)務(wù)分離開(kāi)來(lái)。由于核心業(yè)務(wù)集合都能按照用戶ID去做水平切片署穗,支付寶團(tuán)隊(duì)將數(shù)據(jù)切片后按照機(jī)房進(jìn)行分布寥裂,然后通過(guò)循序漸進(jìn)的方式逐步將每個(gè)單元之間的調(diào)用完整地封閉掉。每一個(gè)單元的數(shù)據(jù)都是經(jīng)過(guò)分片的數(shù)據(jù)案疲,不需和其它單元進(jìn)行同步封恰。
上層單元化改造,即將歷史的褐啡、不能拆分的業(yè)務(wù)獨(dú)立出來(lái)诺舔。2013年,支付寶實(shí)現(xiàn)了兩個(gè)單元:?jiǎn)卧狝放置核心業(yè)務(wù)备畦,例如核心鏈路的支付低飒、交易等;單元B放置無(wú)法拆分的歷史業(yè)務(wù)萍恕,例如某些不重要的業(yè)務(wù)等。
支付寶單元化架構(gòu)于2013年完成车要,幫助支付寶順利支撐過(guò)了2013年的“雙11”允粤。而2014年~2015年,支付寶一直在嘗試解決異地延時(shí)的問(wèn)題:即如果不去對(duì)全局?jǐn)?shù)據(jù)進(jìn)行分割或是本地化的話翼岁,當(dāng)把業(yè)務(wù)單元搬到異地時(shí)类垫,由于每一次業(yè)務(wù)的發(fā)生基本上都會(huì)依賴全局?jǐn)?shù)據(jù),且會(huì)對(duì)應(yīng)多次數(shù)據(jù)訪問(wèn)琅坡,而每一次數(shù)據(jù)訪問(wèn)都會(huì)產(chǎn)生異地所帶來(lái)的延時(shí)悉患,積少成多,時(shí)間延遲就會(huì)達(dá)到秒級(jí)榆俺,用戶體驗(yàn)大幅度下降售躁∥牖矗基于這個(gè)問(wèn)題的考慮,支付寶研發(fā)團(tuán)隊(duì)做了一個(gè)很大的決定:他們引入了單元C陪捷,通過(guò)將無(wú)法拆分的全量數(shù)據(jù)進(jìn)行全局復(fù)制(異地機(jī)房之間的復(fù)制)回窘,以便于支撐核心業(yè)務(wù)本地調(diào)用,進(jìn)而實(shí)現(xiàn)讀寫分離市袖,將跨城市的調(diào)用減少到最小力度啡直。如下圖所示。
由于數(shù)據(jù)的寫入操作會(huì)在每一個(gè)數(shù)據(jù)單元上進(jìn)行苍碟,而單元C的數(shù)據(jù)讀取是要求全量的酒觅,所以進(jìn)行這一項(xiàng)改造的時(shí)候需要底層的支持,從而解決架構(gòu)改造時(shí)數(shù)據(jù)一致性和時(shí)效性的問(wèn)題微峰。為了解決這個(gè)問(wèn)題舷丹,支付寶團(tuán)隊(duì)提出了兩種解決方案:
1.基于DB同步的數(shù)據(jù)復(fù)制。針對(duì)某些對(duì)于延時(shí)并非十分敏感的業(yè)務(wù)县忌,單就基于主備同步來(lái)做數(shù)據(jù)的同步掂榔。
2.基于消息系統(tǒng)的數(shù)據(jù)復(fù)制。由于異地?cái)?shù)據(jù)同步比較耗時(shí)症杏,對(duì)于延時(shí)非常敏感的業(yè)務(wù)來(lái)說(shuō)装获,支付寶基于可靠的消息系統(tǒng)做一個(gè)數(shù)據(jù)復(fù)制(內(nèi)部稱為數(shù)據(jù)總線),通過(guò)它將上層基于應(yīng)用去做數(shù)據(jù)的復(fù)制厉颤,大概時(shí)間位于毫秒級(jí)穴豫。底層DB主備同步同時(shí)進(jìn)行。
通過(guò)本地化調(diào)用逼友,支付寶有效地解決了DB連接數(shù)問(wèn)題精肃、機(jī)房間流量限制問(wèn)題、跨IDC的延時(shí)問(wèn)題帜乞;通過(guò)異地的單元部署以及不斷的容災(zāi)演練和數(shù)據(jù)切換司抱,支付寶有效地解決了城市IDC資源限制和異地IDC容災(zāi)問(wèn)題。另外還有一個(gè)訴求——“藍(lán)綠發(fā)布”黎烈,支付寶是這么實(shí)現(xiàn)的习柠。
如下圖所示,藍(lán)綠發(fā)布即每個(gè)單元里面分為一個(gè)Blue組和一個(gè)Green組照棋,日常模式下兩個(gè)組各承擔(dān)50%的用戶流量资溃;發(fā)布前將Green組中的50%流量移到Blue組中,然后對(duì)Green進(jìn)行兩批無(wú)序發(fā)布烈炭;新代碼發(fā)布上去后溶锭,將Blue組中的流量先切換1%~2%到Green組中進(jìn)行驗(yàn)證,以最大程度減少對(duì)用戶的打擾符隙,驗(yàn)證完畢后趴捅,再逐步將100%的流量全部切換至新的Green組垫毙,重復(fù)前面的步驟發(fā)布Blue組,驗(yàn)證完畢后切回每個(gè)組各50%流量的日常模式驻售。
至此露久,支付寶單元化全局架構(gòu)如下圖所示。每一個(gè)機(jī)房單元中有單元A和單元C欺栗,單元A中按邏輯分為了兩個(gè)組毫痕,單元C之間進(jìn)行全局的數(shù)據(jù)復(fù)制;每個(gè)單元中部署了一套分布式的容災(zāi)管控系統(tǒng)迟几,使得支付寶能在單個(gè)機(jī)房故障的時(shí)候去做更加快速的應(yīng)對(duì)消请。
總結(jié)
通過(guò)單元化的系統(tǒng)配置,使得支付寶整個(gè)系統(tǒng)架構(gòu)具有很強(qiáng)的高可用性和容災(zāi)能力类腮。具體來(lái)說(shuō)有三點(diǎn):
1.更靈活的流量管控臊泰,可以實(shí)現(xiàn)以更小的力度和更快的速度來(lái)進(jìn)行數(shù)據(jù)切換。
2.自定義化的數(shù)據(jù)流量分配蚜枢。由于每一個(gè)數(shù)據(jù)單元需要多少資源缸逃、需要支撐多少交易量可以前期確定,因此支付寶可以按照實(shí)際的需求量進(jìn)行單元維度的擴(kuò)展厂抽。
3.快速恢復(fù)的容災(zāi)能力需频。通過(guò)單元化之后,不僅使得數(shù)據(jù)單元內(nèi)Blue組和Green組之間可以切換流量筷凤,再向上一個(gè)級(jí)別昭殉,單元和單元之間、機(jī)房和機(jī)房之間藐守、同城內(nèi)數(shù)據(jù)中心之間甚至城市和城市之間也可以自如地進(jìn)行故障發(fā)生時(shí)的應(yīng)急切換挪丢。