DM 源碼閱讀系列文章(五)Binlog replication 實現

作者:lan

本文爲 DM 源碼閱讀系列文章的第五篇。上篇文章 介紹了 dump 和 load 兩個數據同步處理單元的設計實現,對核心 interface 實現、數據導入併發模型、數據導入暫停或中斷的恢復進行了分析。本篇文章將詳細地介紹 DM 核心處理單元 Binlog replication,內容包含 binlog 讀取、過濾、路由、轉換,以及執行等邏輯。文內涉及到 shard merge 相關邏輯功能,如 column mapping、shard DDL 同步處理,會在 shard merge 篇單獨詳細講解,這裏就不贅述了。

Binlog replication 處理流程

從上圖可以大致瞭解到 Binlog replication 的邏輯處理流程,對應的 邏輯入口代碼

  1. 從 relay log 或者 MySQL/MariaDB 讀取 binlog events。
  2. 對 binlog events 進行處理轉換(transformation),這裏可以做三類操作:

    操作 說明
    Filter 根據 庫/表同步黑白名單 對庫/表進行過濾;根據 binlog event 類型過濾
    Routing 根據 庫/表 路由規則 對庫/表名進行轉換,用於合庫合表。
    Convert 將 binlog 轉換爲 job 對象,發送到 executor。
  3. executor 對 job 進行衝突檢測,然後根據固定規則分發給對應的 worker 執行。
  4. 定期保存 binlog position/gtid 到 checkpoint。

Binlog 讀取

Binlog replication 支持兩種方式讀取 binlog events:

兩種方式都提供了同樣的讀取方法,處理核心都是 go-mysql。該庫主要提供了兩個功能:

  • 註冊爲 MySQL/MariaDB 的 slave server ,從 MySQL/MariaDB 順序讀取 raw binlog events。
  • 解析 raw binlog events。

更多的處理細節會在下篇關於 relay log 的文章中進行介紹,迫不及待的小夥伴可以先翻閱一下相關代碼實現。

Binlog 轉換

處理程序拿到解析好的 binlog event 後,根據 binlog 的類型來對 binlog 進行分類處理。Binlog replication 主要關心以下類型的 binlog event :

類型 說明
rotate event 消費完一個 binlog 文件,開始消費下一個 binlog 文件,用於更新 checkpoint 的 binlog position。
row event 包含 insert/update/delete DML 數據。
query event 包含 DDL 或者 statement DML 等數據。
xid event 代表一個 transaction 的 commit,經過 go-mysql 的處理後帶有對應 transaction
結束位置的 binlog position 和 gtid
,可以用來保存 checkpoint。

Binlog replication 數據處理單元會對每一類 binlog event 進行以下的處理步驟,具體實現的處理順序可能略有差異,以代碼實現爲準。

過濾

Binlog replication 會從兩個維度對 binlog event 來進行過濾:

row event 過濾處理query event 過濾處理 的實現在邏輯上面存在一些差異:

路由

binlog 過濾完成之後,對於需要同步的表就會根據過濾步驟獲得的庫名和表名,通過 路由規則 轉換得到需要同步到的目標庫名和表名,在接下來的轉換步驟來使用目標庫名和表名來轉換出正確的 DML 和 DDL statement。

轉換

row event 轉換處理和 query event 轉換處理的實現存在一些差異,這裏分開來講述。

row event 轉換處理通過三個轉換函數生成對應的 statements:

query event 轉換處理:

  • 因爲 TiDB 目前不支持一條 DDL 語句包含多個 DDL 操作,query event 轉換處理會首先嚐試將 包含多個 DDL 變更操作的單條 DDL 語句 拆分成 只包含一個 DDL 操作的多條 DDL 語句具體代碼實現)。
  • 使用 parser 將 DDL statement 對應的 ast 結構裏面的庫名和表名替換成對應的目標庫名和表名(具體代碼實現)。

通過轉換處理之後,將不同的 binlog event 包裝成不同的 job 發送到 executor 執行:

Job 執行

衝突檢測

binlog 順序同步模型要求按照 binlog 順序一個一個來同步 binlog event,這樣的順序同步勢必不能滿足高 QPS 低同步延遲的同步需求,並且不是所有的 binlog 涉及到的操作都存在衝突。Binlog replication 採用衝突檢測機制,鑑別出來需要順序執行的 jobs,在確保這些 jobs 的順序執行的基礎上,最大程度地保持其他 job 的併發執行來滿足性能方面的要求。

衝突檢測流程如下:

衝突檢測實現比較簡單,根據轉換步驟獲得每條 statement 對應的 primary/unique key 信息,來進行交集檢測,如果存在交集那麼認定是需要順序的執行兩條 statement,請參考 具體實現代碼

執行

job 分發到對應的 worker 後,worker 根據一定的規則來批量執行這些 job,如下:

根據上面三個規則可以很快地將已經分發的 jobs 應用到下游 TiDB。

小結

本篇文章詳細地介紹 DM 核心處理單元 Binlog replication,內容包含 binlog 讀取、過濾、路由、轉換,以及執行等邏輯。下一篇我們會對 relay log 數據處理單元的設計進行詳細的講解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章