OceanBase 組件基本原理

2021-06-29 17:24 更新

本文為您介紹 OceanBase 遷移服務(wù)(OceanBase Migration Service,OMS)包含的組件。

OMS 內(nèi)部主要包含以下組件:

  • 結(jié)構(gòu)遷移核心組件
  • 全量數(shù)據(jù)流和數(shù)據(jù)校驗組件
  • 日志讀取組件
  • 同步寫入組件

結(jié)構(gòu)遷移核心組件

OMS 結(jié)構(gòu)遷移的核心組件(DBCat)作為 OceanBase 原生的 Schema 轉(zhuǎn)換引擎,可以根據(jù)源端、目標(biāo)端具體的數(shù)據(jù)源類型和字符編碼類型,進(jìn)行精確的數(shù)據(jù)類型映射或轉(zhuǎn)換。OMS 的結(jié)構(gòu)遷移組件支持轉(zhuǎn)換、遷移數(shù)據(jù)庫中的表、約束、索引和視圖等多種對象。

同時,DBCat 可以嚴(yán)格對齊和兼容 OceanBase 的租戶類型。例如,OceanBase 的某個版本暫時不支持源端數(shù)據(jù)庫中的部分?jǐn)?shù)據(jù)源類型,DBCat 會選擇最接近且兼容度最高的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換映射。

全量數(shù)據(jù)流和數(shù)據(jù)校驗組件

全量數(shù)據(jù)流模塊(Dataflow)負(fù)責(zé)源庫存量數(shù)據(jù)的遷移,以及遷移后的全字段校驗。為了擴展靈活性和充分復(fù)用組件,Dataflow 自下而上分別是 Reader 模塊、Writer 模塊、Broker 模塊和統(tǒng)一數(shù)據(jù)模型層:

  • Reader 模塊:負(fù)責(zé)從源端讀取數(shù)據(jù),每一種數(shù)據(jù)庫類型都有對應(yīng)的 Reader 插件。Reader 插件根據(jù)統(tǒng)一數(shù)據(jù)模型層轉(zhuǎn)換讀取的記錄后,將其放入 Broker 模塊中,由其它模塊消費。

  • Writer 模塊:從 Broker 模塊訂閱某張表的記錄,根據(jù)每個 Writer 插件的類型,將記錄按照統(tǒng)一數(shù)據(jù)模型層轉(zhuǎn)換為適配下游的插入語句后,寫入下游。

  • Broker 模塊:用于解耦 Reader、Writer 或其它模塊,以提升性能。解藕后,上下游模塊可以相互獨立,便于維護(hù)和擴展。

  • 統(tǒng)一數(shù)據(jù)模型層:各組件間通過 Broker 要實現(xiàn)解藕,還需要有一層統(tǒng)一數(shù)據(jù)模型。數(shù)據(jù)從 Reader 寫入 Broker 時需要先按統(tǒng)一數(shù)據(jù)模型轉(zhuǎn)換,從 Broker 獲取數(shù)據(jù)記錄后,也需要由記錄的統(tǒng)一數(shù)據(jù)模型轉(zhuǎn)化為下游適配的對象或語句。

在上述底層模塊的基礎(chǔ)上,OMS 實現(xiàn)了數(shù)據(jù)的遷移、校驗和訂正。

遷移數(shù)據(jù)時,您需要在配置好源端、目標(biāo)端、待遷移表和庫表映射等關(guān)鍵信息后,為每張遷移表創(chuàng)建一條 Reader > Broker > Writer 的通道,再由上層遷移程序?qū)γ繌埍淼倪w移進(jìn)行調(diào)度。您可以并發(fā)遷移多張表,在 Reader 和 Writer 組件中可以并發(fā)執(zhí)行每張表的遷移。

進(jìn)行數(shù)據(jù)校驗和訂正時,您需要在配置好源端、目標(biāo)端、待遷移表和庫表映射等關(guān)鍵信息后,為每張校驗的表創(chuàng)建 SrcReader > Broker > DstReader 和 Broker > Verifier 的校驗通道。

日志讀取組件

不同類型數(shù)據(jù)庫的日志讀取模塊(Store)的實現(xiàn)方式不同,例如 OceanBase Store 模塊的實現(xiàn)方式是依賴于 OceanBase 的 Liboblog 工具。

Lliboblog 是 OceanBase 的增量數(shù)據(jù)同步工具,通過 RPC 方式拉取 OceanBase 各個分區(qū)的 Redo 日志后,結(jié)合各個表和列的 Schema 信息,轉(zhuǎn)換 Redo 日志為中間定義的數(shù)據(jù)格式,最后以事務(wù)的方式輸出修改的數(shù)據(jù)。

同步寫入組件

同步寫入模塊包括 JDBCWriter 和 Connector:

  • 同步寫入模塊(JDBCWriter)是從日志讀取模塊(Store)拉取增量數(shù)據(jù)的同時,將其翻譯為 INSERT、UPDATE 或 DELETE 等 SQL 語句寫入數(shù)據(jù)至目標(biāo)端的組件。

    Store 組件記錄的是流式的增量數(shù)據(jù),可以通過 Pipeline 保證數(shù)據(jù)的有序性。Writer 組件單線程順序執(zhí)行事務(wù)可以滿足基本要求,但不能擴展性能,所以 OMS 引入并發(fā)寫機制。

    在提升同步性能的同時,還需要保證數(shù)據(jù)的一致性,所以 OMS 引入沖突矩陣機制實現(xiàn)亂序并發(fā)寫入,以確保每個事務(wù)的最終一致性。

    為了避免循環(huán)復(fù)制問題,所有通過 OMS 的 JDBCWriter 模塊寫入的數(shù)據(jù)都會在 Store 組件中進(jìn)行打標(biāo)處理,以確保不會再次被其它模塊消費。

  • 同步寫入模塊(Connector)是將 JDBCWriter 的功能插件化,包括源端(Source) 和目標(biāo)端(Sink) 插件。以同步 OceanBase 數(shù)據(jù)至 Kafka 為例,在數(shù)據(jù)同步過程中,OB-Store-Source 為源端插件,Kafka-Sink 為目標(biāo)端插件。

    Connector 的優(yōu)勢如下:

    • 可擴展性強,源端和目標(biāo)端可以進(jìn)行組合。

    • 方便統(tǒng)一同步任務(wù)資源的管理、監(jiān)控和運維。

    • 作為統(tǒng)一中間層,將不同源端的 Record 格式進(jìn)行結(jié)構(gòu)化,便于實現(xiàn) Record 的 Filter 和 Transformer 等功能


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號