GBase新聞
GBase 8c 分布式核心技術(shù)初揭秘—CDC數(shù)據(jù)同步
數(shù)據(jù)庫系統(tǒng)作為企業(yè)IT基礎(chǔ)設(shè)施中的重要組件,其穩(wěn)定性與可用性是上層系統(tǒng)運行的必要基礎(chǔ)。并且隨著數(shù)字化發(fā)展,大量的核心業(yè)務(wù)對于城市級別容災(zāi)提出了更高的要求。作為一款分布式數(shù)據(jù)庫,GBase 8c可輕松實現(xiàn)例如兩地三中心架構(gòu)的集群異地災(zāi)備。GBase 8c異地災(zāi)備集群間的不同節(jié)點采用各自對應(yīng)的高可用部署方式,兩地間采用同步或者異步復(fù)制的備份方式。可以抵御硬件級別故障、機房級別和城市級別災(zāi)難,兩地之間距離可以大于1000千米。
除此之外,GBase 8c還支持多集群部署,集群間進行數(shù)據(jù)雙向同步來提供異地多活的架構(gòu),以滿足對高可用有嚴(yán)苛要求的業(yè)務(wù)需求。GBase 8c實現(xiàn)異地多活的關(guān)鍵,則是其中的數(shù)據(jù)同步機制,而CDC正是實現(xiàn)數(shù)據(jù)同步機制的核心技術(shù)。
下面將主要介紹GBase 8c數(shù)據(jù)庫中CDC技術(shù)的架構(gòu)及其實現(xiàn)原理。
CDC技術(shù)原理
GBase 8c中的CDC (Change Data Capture) ,中文名稱為變更數(shù)據(jù)捕獲,是一種通過解析GBase 8c的WAL增量日志,獲取表級別的所有數(shù)據(jù)變化,并將其轉(zhuǎn)換為可以復(fù)制到同構(gòu)或者異構(gòu)系統(tǒng)格式的機制。
作為一款多模多態(tài)分布式數(shù)據(jù)庫,GBase 8c的CDC實現(xiàn)機制及執(zhí)行流程上可分為主備式及分布式兩大類:
主備式
基于邏輯復(fù)制的發(fā)布訂閱功能是實現(xiàn)CDC技術(shù)的核心機制,在GBase 8c的主備式架構(gòu)中,數(shù)據(jù)同步的發(fā)布訂閱主要執(zhí)行流程如下:
主備式CDC執(zhí)行流程示意圖
本地GBase 8c,可以指定單個表,也可以指定某個數(shù)據(jù)庫中的所有表,作為邏輯復(fù)制的發(fā)布端。異地GBase 8c為邏輯復(fù)制的訂閱端,連接本地GBase 8c的服務(wù)端口。本地GBase 8c啟動一個WalSender線程來讀取WAL日志進行解碼,并輸出特定格式的消息發(fā)送給異地GBase 8c的ApplyWorker線程,ApplyWorker識別特定格式的消息后直接執(zhí)行相應(yīng)的INSERT\UPDATE\DELETE等語句來完成數(shù)據(jù)的回放。其中本地的主機通過復(fù)制槽(Repliaction Slot)機制來保存消費者偏移量,跟蹤訂閱者進度。
分布式
不同于主備式架構(gòu),分布式架構(gòu)中DN分布在多臺服務(wù)器中,本地集群的一個事務(wù)可能涉及到多個服務(wù)器上的DN節(jié)點。因此,異地集群在進行數(shù)據(jù)同步及回放時,根據(jù)不同的事務(wù)處理策略,存在兩種不同的執(zhí)行方式。
1. 基于分片的分布式訂閱流程
第一種就是基于分片的分布式訂閱,此同步方式的核心機制與主備式相同,也是基于邏輯復(fù)制功能。不同的地方在于異地集群在進行訂閱時,是以本地GBase 8c的DN為基準(zhǔn),啟動多個訂閱任務(wù),分別連接每個DN節(jié)點。此時異地集群在CN中會啟動多個 ApplyWorker 線程,每個線程復(fù)制一個DN節(jié)點的邏輯日志。本地集群的每個DN啟動一個WalSender線程來讀取本DN節(jié)點WAL日志進行解碼,并輸出特定格式的消息發(fā)送給異地GBase 8c的ApplyWorker線程進行數(shù)據(jù)回放。
基于分片的分布式訂閱流程示意圖
此種同步方式,雖然是以DN節(jié)點個數(shù)為并行度進行并行同步,同步效率高,但因為沒有有效的機制保證本地集群的分布式事務(wù)在異地集群回放的全局有序性,所以也就無法保證回放事務(wù)的原子性與全局事務(wù)一致性,只能保證數(shù)據(jù)的最終一致性。
2. CDC 發(fā)布訂閱操作執(zhí)行流程
為了解決基于分片的分布式訂閱無法保證數(shù)據(jù)回放的全局事務(wù)一致性問題,在分布式架構(gòu)場景下的第二種同步方式中,GBase 8c新增了CDC節(jié)點,通過對所有DN上的分布式事務(wù)進行合并和排序,來保證異地集群上的事務(wù)能夠全局有序性的回放,實現(xiàn)數(shù)據(jù)的強一致,保證分布式事務(wù)的原子性。
CDC節(jié)點整體的架構(gòu)如下圖所示:
CDC架構(gòu)圖
CDC節(jié)點采用和CN類似的無狀態(tài)設(shè)計,只存儲本地集群的元數(shù)據(jù)信息,當(dāng)CDC節(jié)點異常宕掉后,重新拉起實例或使用備用節(jié)點即可繼續(xù)服務(wù)。按功能不同,CDC內(nèi)部主要由3個角色組成:
1. Dumper
Dumper通過邏輯復(fù)制的方式從DN上拉取邏輯解碼后的WAL增量日志,將事務(wù)信息輸出給Joiner進行排序合并。
2. Joiner
Joiner負(fù)責(zé)接受各個Dumper發(fā)送過來的事務(wù)信息,將具有相同的csn事務(wù)進行合并后按照csn順序進行排序,以構(gòu)建完整的全局事務(wù)輸出給Output線程。
3. Output
Output負(fù)責(zé)將完整的事務(wù)流輸出給異地集群,輸出的格式支持json、sql、internaloutput(類似于pgoutput格式)。當(dāng)異地集群是GBase 8c數(shù)據(jù)庫時,使用internaloutput格式進行replay性能最優(yōu)。
該CDC 同步機制的發(fā)布訂閱流程具體如下:
CDC執(zhí)行流程示意圖
此時異地GBase 8c集群將連接本地GBase 8c集群的CDC節(jié)點來進行訂閱任務(wù)的創(chuàng)建。本地集群的CDC節(jié)點啟動n個Dumper線程,并開始接收多個WalSender線程輸出的邏輯解碼增量日志。隨后CDC的Joiner線程通過將增量日志消息進行事務(wù)合并和排序操作,構(gòu)建出完整有序的全局事務(wù)信息,并最終由Output線程對外進行輸出。最后異地集群CN節(jié)點啟動ApplyWorker線程,對Output線程發(fā)來的特定格式信息進行邏輯日志解析及回放操作,完成數(shù)據(jù)同步。此種數(shù)據(jù)同步方式保證了異地集群上的事務(wù)回放的全局有序性,實現(xiàn)了數(shù)據(jù)的強一致。
關(guān)于 GBase 8c
GBase 8c是基于openGauss3.0構(gòu)建的一款多模多態(tài)的分布式數(shù)據(jù)庫,支持行存、列存、內(nèi)存等多種存儲模式和單機、主備式、分布式等多種部署形態(tài)。GBase 8c具備高性能、高可用、彈性伸縮、高安全性等特性,可以部署在物理機、虛擬機、容器、私有云和公有云,為關(guān)鍵行業(yè)核心系統(tǒng)、互聯(lián)網(wǎng)業(yè)務(wù)系統(tǒng)和政企業(yè)務(wù)系統(tǒng)提供安全、穩(wěn)定、可靠的數(shù)據(jù)存儲和管理服務(wù)。