做者:lanhtml
本文爲 DM 源碼閱讀系列文章的第三篇,上篇文章 介紹了 DM 的總體架構,DM 組件 DM-master 和 DM-worker 的入口代碼,以及二者之間的數據交互模型。本篇文章詳細地介紹 DM 數據同步處理單元(DM-worker 內部用來同步數據的邏輯單元),包括數據同步處理單元實現了什麼功能,數據同步流程、運行邏輯,以及數據同步處理單元的 interface 設計。git
從上圖能夠了解到目前 DM 包含 relay log、dump、load、binlog replication(sync) 4 個數據同步處理單元,涵蓋了如下數據同步處理的功能:github
處理單元 | 功能 |
---|---|
relay log | 持久化 MySQL/MariaDB Binlog 到磁盤 |
dump | 從 MySQL/MariaDB dump 全量數據 |
load | 加載全量數據到 TiDB cluster |
binlog replication(sync) | 複製 relay log 存儲的 Binlog 到 TiDB cluster |
Task 數據同步流程初始化操做步驟:golang
從 初始化數據同步流程 的代碼中咱們能夠看到,根據 task 配置項 task-mode 的不一樣,DM-worker 會初始化不一樣的數據同步流程:架構
task-mode | 同步流程 | 須要的數據同步處理單元 |
---|---|---|
all | 全量同步 -> 增量數據同步 | relay log、dump、load、binlog replication(sync) |
full | 全量同步 | dump、load |
incremental | 增量同步 | relay log,binlog replication(sync) |
DM 數據同步處理單元 interface 定義在 dm/unit
,relay log、dump、load、binlog replication(sync)都實現了該 interface(golang interface 介紹)。優化
實際上 DM-worker 中的數據同步處理單元分爲兩類:spa
兩類數據同步處理單元的使用邏輯不一樣,這篇文檔會着重講一下 subtask 獨享的數據同步處理單元的使用邏輯,不會囊括更多的 relay log 相關的內容,後面會有單獨一篇文章詳細介紹它。設計
relay log 相關使用代碼在 dm/worker/relay.go
、具體功能實現代碼在 relay/relay.go
,有興趣的同窗也能夠先行閱讀一下相關代碼,relay log 的代碼註釋也是比較豐富,而且簡單易懂。code
subtask 獨享數據同步處理單元使用邏輯相關代碼在 dm/worker/subtask.go
。subtask 對象包含的主要屬性有:server
New
、Running
、Paused
,Stopped
,Finished
,具體定義的代碼在 dm/proto/dmworker.proto
。Paused/Stopped/Finished
的詳細信息。主要的邏輯有:
dm/unit
interface,因此接下來的運行中就不須要關心具體的數據同步處理單元的類型,能夠按照統一的 interface 方法來運行數據同步處理單元,以及對其進行狀態監控。數據同步處理單元運行狀態監控。經過監控當前運行的數據同步處理單元的結果,將 subtask 的 stage 設置爲 Paused/Stopped/Finished
。
Finished
。這裏有個注意點,由於 binlog replication 單元永遠不會結束,因此不會進入 Finished
的狀態。Paused
,而且打印具體的錯誤信息。Paused/Stopped
。這裏有個注意點,這個時候 stage=Paused
是沒有錯誤信息的。Paused
的暫停等待狀態。本篇文章主要介紹了數據同步處理單元實現了什麼功能,數據同步流程、運行邏輯,以及數據同步處理單元的 interface 設計。後續會分三篇文章詳細地介紹數據同步處理單元的實現,包括: