<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          真·異地多活架構(gòu)怎么實(shí)現(xiàn)?使用PolarDB-X!

          共 1469字,需瀏覽 3分鐘

           ·

          2021-12-17 13:07

          點(diǎn)擊下方“IT牧場(chǎng)”,選擇“設(shè)為星標(biāo)”

          來源:https://zhuanlan.zhihu.com/p/364240552

          異地多活是近幾年比較熱門的一種系統(tǒng)架構(gòu)。一般來講,要做到異地多活,是一個(gè)系統(tǒng)性的事情,需要接入層、應(yīng)用層、數(shù)據(jù)層都做一些事情。

          同時(shí)有一些場(chǎng)合我們可能會(huì)把兩地三中心等容災(zāi)架構(gòu)也算作了異地多活(單純的應(yīng)用層多活),本文所講的異地多活,是指所有數(shù)據(jù)中心的數(shù)據(jù)庫都會(huì)承擔(dān)寫流量的"真·異地多活"。

          今天我們這篇文章重點(diǎn)來說一下,對(duì)于一個(gè)分布式數(shù)據(jù)庫,在異地多活架構(gòu)中,起到了一個(gè)什么樣的角色;對(duì)于其中的問題,解法是什么。

          淘寶的異地多活

          從國(guó)內(nèi)互聯(lián)網(wǎng)上能找到的資料來看,淘寶網(wǎng)是提出異地多活這個(gè)概念比較早的公司,所以我們先簡(jiǎn)單了解下淘寶的異地多活。

          誕生

          先看動(dòng)機(jī),淘寶做異地多活的架構(gòu)的動(dòng)機(jī)是比較明確的:

          • 杭州機(jī)房容量開始不足
          • 13年杭州出現(xiàn)過限電,讓人開始擔(dān)心杭州機(jī)房整體無法服務(wù)的情況

          從容量與容災(zāi)兩個(gè)角度考慮,自然提出了將整個(gè)系統(tǒng)部署到異地的多個(gè)機(jī)房中,并且多個(gè)機(jī)房能同時(shí)提供服務(wù)。

          從動(dòng)機(jī)出發(fā),可以提出主要兩個(gè)需求:

          1. 機(jī)房之間要有足夠遠(yuǎn)的距離,例如目前淘寶的深圳、張家口機(jī)房之間相距1000公里以上(代表30-60ms的網(wǎng)絡(luò)延遲)。但是,整個(gè)系統(tǒng)的響應(yīng)時(shí)間要得到保證,不能因?yàn)闄C(jī)房之間的距離而增加系統(tǒng)的響應(yīng)時(shí)間。下圖是在淘寶的張家口機(jī)房ping深圳機(jī)房,41ms的延遲:?

          2. 每個(gè)機(jī)房平時(shí)都要承擔(dān)業(yè)務(wù)流量,處于“活”的狀態(tài)。同時(shí),每個(gè)機(jī)房要能按照百分比承擔(dān)業(yè)務(wù)流量,并且能夠動(dòng)態(tài)的進(jìn)行調(diào)整

          不能是一個(gè)冷備的狀態(tài),這樣才能提供1+1>1的容量 一個(gè)時(shí)刻活著的機(jī)房,出問題的時(shí)候才敢去切 切流是一個(gè)日常性的操作,例如對(duì)機(jī)房進(jìn)行的大規(guī)模運(yùn)維、升級(jí)等操作,都會(huì)先將流量切走

          單元封閉

          對(duì)于淘寶來說,我們選擇將買家的響應(yīng)時(shí)間作為第一優(yōu)先級(jí)考慮的問題。如果買家的操作,例如查看商品詳情、查看訂單、下單等操作,需要跨越多個(gè)機(jī)房,那響應(yīng)時(shí)間是無法接受的。淘寶的下單操作,實(shí)際上,涉及到上百次的服務(wù)調(diào)用。

          因此我們需要考慮,將買家的操作,能夠“封閉”在一個(gè)機(jī)房?jī)?nèi),這也是淘寶提的“單元封閉”的概念。

          要做到單元封閉,業(yè)務(wù)系統(tǒng)是要做很多改造的,需要確保這些服務(wù)調(diào)用都能夠在本機(jī)房?jī)?nèi)完成。對(duì)于無狀態(tài)的服務(wù)來說,相對(duì)簡(jiǎn)單,但是對(duì)于有狀態(tài)的服務(wù),例如數(shù)據(jù)庫、消息隊(duì)列、緩存等等,就會(huì)需要做一些事情。

          單元切分的維度

          從數(shù)據(jù)庫角度來看,要實(shí)現(xiàn)單元封閉,就要將數(shù)據(jù)按照一個(gè)特定的維度進(jìn)行劃分,部署在該單元的服務(wù)盡可能的只訪問部署在該單元的數(shù)據(jù)庫。

          因此,一個(gè)異地多活的系統(tǒng),一定少不了一個(gè)“單元維度”的概念。所謂單元維度,簡(jiǎn)言之就是用來劃分一個(gè)業(yè)務(wù)請(qǐng)求屬于哪個(gè)單元的依據(jù),對(duì)于數(shù)據(jù)庫來說,就是某個(gè)表的某個(gè)列。

          在淘寶,買家(交易、訂單)、賣家(商品由于是賣家發(fā)布的,因此和商品相關(guān)的庫存、評(píng)價(jià),也是賣家維度的數(shù)據(jù))是兩大最主要的數(shù)據(jù)維度,一個(gè)下單操作,會(huì)涉及這兩大維度的數(shù)據(jù)(查商品、下訂單、減庫存)。為了最大限度的保證買家的響應(yīng)時(shí)間,淘寶選擇了使用買家id來作為單元維度。

          與用戶地理位置無關(guān)的異地多活

          淘寶將買家的操作按照買家id,分到不同的單元去。實(shí)際上,淘寶的具體做法是,將userid對(duì)10000取模,不同的區(qū)間屬于不同的單元,例如:

          0< userid % 10000 <=999 屬于單元1,代表單元1包含了

          999< userid % 10000 <=1999 屬于單元2 非常簡(jiǎn)單的一個(gè)劃分。

          這里能看出淘寶在國(guó)內(nèi)業(yè)務(wù)的一個(gè)特點(diǎn),用戶所在的地理位置和他的下單操作在哪個(gè)機(jī)房處理是無關(guān)的,并不存在一個(gè)就近的關(guān)系。例如,如果你的userid取模后落到了深圳機(jī)房的區(qū)間內(nèi),那么即使你在上海,你離上海機(jī)房更近,你的下單操作都由深圳機(jī)房完成。

          為什么這樣,這也是和淘寶的業(yè)務(wù)特點(diǎn)相關(guān),下單是一個(gè)比較重的業(yè)務(wù)邏輯,上面提到過內(nèi)部有上百次的服務(wù)調(diào)用,這些服務(wù)調(diào)用加起來的耗時(shí),要遠(yuǎn)高于客戶端到機(jī)房的網(wǎng)絡(luò)延遲。所以只要保證這些服務(wù)調(diào)用內(nèi)部都在一個(gè)機(jī)房?jī)?nèi)完成即可,至于客戶端在哪里,其實(shí)并不重要(我們這里不涉及靜態(tài)的在CDN中的內(nèi)容)。

          所以在這種異地多活方案里,切流操作是與用戶的地理位置無關(guān)的。它只需要按百分比將一大批userid進(jìn)行切換即可,并不需要關(guān)注他們實(shí)際的地理位置在哪。

          淘寶異地多活的特點(diǎn)

          我們簡(jiǎn)單總結(jié)下淘寶風(fēng)格的異地多活有哪些特點(diǎn),以及響應(yīng)的,對(duì)數(shù)據(jù)庫有哪些要求。

          需要能隨時(shí)按比例進(jìn)行切流。如果我們采用類似這樣的架構(gòu),每個(gè)單元各有一套數(shù)據(jù)庫,但他們之間的數(shù)據(jù)毫無重疊,那當(dāng)需要切流的時(shí)候,再去遷移數(shù)據(jù)嗎?這個(gè)顯然是不對(duì)的,所以這一點(diǎn)實(shí)際上要求每個(gè)單元的數(shù)據(jù)庫必須有全量的數(shù)據(jù),這樣才有切流的基礎(chǔ)。

          業(yè)務(wù)響應(yīng)時(shí)間要求高。既然每個(gè)單元都要有全量的數(shù)據(jù),那就涉及到一個(gè)問題,如何去做單元之間數(shù)據(jù)的復(fù)制?拋開具體的實(shí)現(xiàn)方式不談(通過binlog也好,通過paxos也好),簡(jiǎn)單分為同步和異步兩種類型。

          同步復(fù)制的方式(例如PAXOS的LEADER-FOLLOWER這種復(fù)制),我們有機(jī)會(huì)做到?RPO=0,但這樣數(shù)據(jù)庫的寫入響應(yīng)時(shí)間會(huì)非常的高(想想我們前面說到的,間距1000公里的機(jī)房代表30-60ms的的延遲),除非業(yè)務(wù)做全面的異步化改造,不然是很難接受如此高的響應(yīng)時(shí)間的。

          異步復(fù)制的方式(例如使用binlog,或者PAXOS的LEADER-LEARNER間的復(fù)制),可以完全不受機(jī)房之間距離的影響,響應(yīng)時(shí)間可以做的很低。但相應(yīng)的代價(jià)是, 機(jī)房之間數(shù)據(jù)是一種不一致的狀態(tài)。這種不一致在計(jì)劃內(nèi)的切流數(shù)據(jù)庫層是可以直接解決的,但如果是災(zāi)難下(機(jī)房掛掉)的切流,單純數(shù)據(jù)庫層是無法處理這種問題的,這就需要業(yè)務(wù)層做一些手段(例如對(duì)賬),來保證數(shù)據(jù)的一致性。

          從淘寶的業(yè)務(wù)特點(diǎn)來說,響應(yīng)時(shí)間是第一優(yōu)先級(jí),選擇的是異步復(fù)制的方式。

          機(jī)房與用戶地理位置無關(guān)。這個(gè)特點(diǎn)要求數(shù)據(jù)庫只需要提供分片級(jí)的切換能力即可,并不需要更細(xì)粒度的切換。

          PolarDB-X實(shí)現(xiàn)異地多活

          基于PolarDB-X實(shí)現(xiàn)淘寶風(fēng)格的異地多活,我們可以提出這樣的架構(gòu)圖:

          用戶流量經(jīng)過?DNS、SLB?進(jìn)行進(jìn)入系統(tǒng)后,會(huì)在應(yīng)用層根據(jù)切分維度進(jìn)行第一次路由(例如在阿里云可以使用 MSHA、CSB 等中間件來做這件事情)。在盡可能的同單元的應(yīng)用調(diào)用后,將數(shù)據(jù)寫入本單元的數(shù)據(jù)庫。

          我們重點(diǎn)關(guān)注數(shù)據(jù)庫的部分:

          使用PolarDB-X CDC關(guān)聯(lián)多個(gè)單元的實(shí)例

          這里有一個(gè)非常重要的角色,PolarDB-X的CDC組件。可以簡(jiǎn)單理解為他提供兩個(gè)功能:

          提供PolarDB-X的binlog服務(wù)

          訂閱另一個(gè)PolarDB-X的binlog,從而建立起兩個(gè)PolarDB-X之間的復(fù)制鏈路

          PolarDB-X CDC?屬于 PolarDB-X 內(nèi)核的一部分,能屏蔽掉你能想到的常見的使用第三方組件(例如DTS、Cannal等)同步兩個(gè)分布式數(shù)據(jù)庫的坑,例如DDL、擴(kuò)縮容、系統(tǒng)表等等,是一個(gè)非常帥氣的組件。

          有了PolarDB-X CDC之后,我們?cè)诿總€(gè)單元?jiǎng)?chuàng)建一個(gè)PolarDB-X實(shí)例,并且使用PolarDB-X的CDC組件將這些實(shí)例之間建立起復(fù)制鏈路。

          之后,這些PolarDB-X實(shí)例將不再“獨(dú)立”,他們將共享同一份元數(shù)據(jù)、能感知到彼此的存在,例如,DDL操作可以在任意一側(cè)進(jìn)行。

          為不同的分區(qū)設(shè)置不同的主單元(Primary Unit)

          我們需要選擇好單元切分的維度,例如userid,并將其作為分區(qū)表的分區(qū)鍵:

          create table t1 (...) partition by hash(userid);

          我們給不同的分區(qū)設(shè)置不同的主單元(PRIMARY UNIT),此時(shí)不在主單元的分區(qū)將變?yōu)橹蛔x(或者允許配置成禁止訪問,視業(yè)務(wù)需求,這個(gè)也是有很大的業(yè)務(wù)意義的):

          alter?table?t1?partition0?primary?unit?‘unit-a’;
          alter?table?t1?partition1?primary?unit?‘unit-b’
          alter?table?t1?partition2?primary?unit?‘unit-a

          由于共享一份元數(shù)據(jù),以上對(duì)分區(qū)的設(shè)置可以在任意的PolarDB-X實(shí)例上進(jìn)行。

          切換到分區(qū)視角:

          其中,partition0 與 partition2 的主單元在單元A,在單元A可讀可寫,在單元B只讀;partition1 的主單元在單元B,在單元A只讀,在單元B可讀可寫。

          切流

          PolarDB-X提供原生的計(jì)劃內(nèi)的分區(qū)級(jí)切換主單元的操作,切流操作會(huì)對(duì)分區(qū)做阻塞寫(不報(bào)錯(cuò))的操作,待數(shù)據(jù)一致之后進(jìn)行切換并放開寫入。

          由于異地多活是一個(gè)設(shè)計(jì)整個(gè)鏈路的架構(gòu),流量分配需要在應(yīng)用、數(shù)據(jù)庫、消息隊(duì)列、緩存等等組件做到步調(diào)一致。所以一般情況下,業(yè)務(wù)層會(huì)有類似MSHA等中間件來做整體的切流調(diào)度。PolarDB-X將分區(qū)級(jí)切換主單元的操作提供給這些系統(tǒng),即可統(tǒng)一進(jìn)行流量調(diào)度管理。

          某運(yùn)營(yíng)商客服系統(tǒng)的案例

          這是某運(yùn)營(yíng)商的客服系統(tǒng)基于PolarDB-X實(shí)現(xiàn)異地多活的一個(gè)案例:

          在這個(gè)例子中,單元切分維度為省份。DNS按地域分流,接入層按照路由規(guī)則判斷和糾錯(cuò)。應(yīng)用層單元化部署,服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)雙中心的服務(wù)同步能力。兩個(gè)單元的PolarDB-X實(shí)例進(jìn)行雙向同步,實(shí)現(xiàn)數(shù)據(jù)最終一致性。

          最終的效果:

          1. 客服系統(tǒng)的多個(gè)業(yè)務(wù)實(shí)現(xiàn)按地域多活分流
          2. 實(shí)現(xiàn)多次容災(zāi)演練,秒級(jí)完成切換,數(shù)據(jù)0丟失
          3. 客戶常態(tài)兩個(gè)單元均承載業(yè)務(wù)流量,充分利用兩單元的資源

          行級(jí)Paxos帶來的新的想象

          目前PolarDB-X實(shí)現(xiàn)的是是分區(qū)級(jí)的Paxos,因此對(duì)主單元的切換是分區(qū)級(jí)的。

          如果我們的多活系統(tǒng)想實(shí)現(xiàn)這樣的需求:比如我們有上海、深圳兩個(gè)單元,希望用戶如果今天在杭州,就由上海機(jī)房來處理,如果明天飛往了廣州,就由深圳機(jī)房來處理。

          這個(gè)需求對(duì)數(shù)據(jù)庫的核心訴求其實(shí)是更細(xì)的復(fù)制粒度。一個(gè)分區(qū)上會(huì)有很多的用戶,基于分區(qū)級(jí)的復(fù)制,我們只能對(duì)這一個(gè)分區(qū)上的所有用戶做整體的一個(gè)切換。由于分區(qū)數(shù)一般是比較多的(例如淘寶的用戶分區(qū)數(shù)在上萬的量級(jí)),因此這種方式做百分比的切流是夠用的。但是如果我們要做用戶級(jí)的切流,這種方式就做不到了。

          我們?cè)谔剿鞯囊环N技術(shù)稱為行級(jí) Paxos(有時(shí)也稱為行級(jí)多點(diǎn)寫技術(shù)),簡(jiǎn)單理解為可以設(shè)定每一行的Paxos Group。如下圖:

          變成了行級(jí)的Paxos Group之后,我們就不需要再去指定每個(gè)分區(qū)的主單元了,而是通過自動(dòng)調(diào)度的方式,用戶通過哪個(gè)單元訪問數(shù)據(jù),我們可以自動(dòng)的將所訪問的數(shù)據(jù)的主單元調(diào)度到當(dāng)前的單元(從應(yīng)用來說看起來的效果類似于在各單元都可以對(duì)所有的數(shù)據(jù)做修改,所以才被稱為行級(jí)多點(diǎn)寫技術(shù),但實(shí)際上和單機(jī)上的并發(fā)寫完全不一樣的代價(jià))。從而達(dá)到更徹底的就近訪問的目的。

          不過,即使有了這種技術(shù),異地多活也依然有它的一些門檻或者說限制。例如,雖然可以自動(dòng)的做行級(jí)的主單元調(diào)度,但是這個(gè)調(diào)度過程是有代價(jià)的(調(diào)度時(shí)間至少是兩地網(wǎng)絡(luò)的延遲),所以我們依然需要避免同時(shí)從多個(gè)機(jī)房對(duì)同一行數(shù)據(jù)做修改(例如這一刻在上海機(jī)房修改了用戶的記錄,主單元調(diào)度到了上海,下一秒請(qǐng)求路由到了深圳,主單元又要被調(diào)度到上海),兩地并發(fā)的對(duì)同樣的數(shù)據(jù)做修改的響應(yīng)時(shí)間會(huì)超過網(wǎng)絡(luò)的延遲。因此我們依然要遵循異地多活架構(gòu)下應(yīng)用本身需要做流量的分區(qū)的原則,確保數(shù)據(jù)庫的請(qǐng)求不會(huì)高頻率的飄來飄去。

          同時(shí),由于整個(gè)業(yè)務(wù)系統(tǒng)里,有狀態(tài)的組件不僅包含數(shù)據(jù)庫,還包含緩存、文件存儲(chǔ)、消息隊(duì)列等等各種各樣存有狀態(tài)的組件,這些組件必須也支持類似數(shù)據(jù)庫行級(jí)Paxos的調(diào)度能力,才能充分利用行級(jí)Paxos帶來的優(yōu)勢(shì)(開個(gè)玩笑,如果你的應(yīng)用只使用了數(shù)據(jù)庫,沒有使用其他帶狀態(tài)的組件,這件事可能就很簡(jiǎn)單了)。

          總結(jié)

          異地多活,是一個(gè)非常吸引人的架構(gòu)。真正的實(shí)現(xiàn)異地多活,對(duì)系統(tǒng)的整體設(shè)計(jì)是一個(gè)很大的挑戰(zhàn),涉及的領(lǐng)域方方面面。選擇合適的數(shù)據(jù)庫層方案,能讓整個(gè)過程事半功倍。

          PolarDB-X通過內(nèi)核內(nèi)置的CDC組件、統(tǒng)一的元數(shù)據(jù)組件GMS、Paxos一致性協(xié)議、分區(qū)級(jí)的主單元技術(shù)等,能讓業(yè)務(wù)更容易的實(shí)現(xiàn)異地多活。

          此外,本文主要針對(duì)淘寶下單鏈路的異地多活提出的方案(例如低響應(yīng)時(shí)間、百分比切流等特征)。異地多活的設(shè)計(jì)是一個(gè)跟應(yīng)用特點(diǎn)關(guān)聯(lián)性極強(qiáng)的事情,例如,有的應(yīng)用可能不需要切流,單元?jiǎng)澐质峭耆潭ǖ?;有的?yīng)用可能對(duì)響應(yīng)時(shí)間不敏感。結(jié)合上這些特點(diǎn),我們能設(shè)計(jì)出各種各樣的異地多活方案。即使在同樣的一個(gè)業(yè)務(wù)系統(tǒng)內(nèi),不同的應(yīng)用可能也需要使用不同的多活方案(例如淘寶的庫存,使用的就是另一種內(nèi)部稱為COPY類型單元化的方案)。選擇最適合的才是最好的。

          歡迎大家持續(xù)關(guān)注!

          干貨分享

          最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)?。?/p>

          ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論

          加個(gè)關(guān)注不迷路

          喜歡就點(diǎn)個(gè)"在看"唄^_^

          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天射综合网站 | 中国婬乱a1级毛片多女 | 欧美色综合一区二区三区 | AAA国产欧美日产无码免费网站 | 大香蕉国产在线视频 |