做者:楊非html
TiDB-DM 是由 PingCAP 開發的一體化數據同步任務管理平臺,支持從 MySQL 或 MariaDB 到 TiDB 的全量數據遷移和增量數據同步,在 TiDB DevCon 2019 正式開源。做爲一款鏈接 MySQL/MariaDB 生態和 TiDB 生態的中臺類型產品,DM 得到了普遍的關注,不少公司、開發者和社區的夥伴已經在使用 DM 來進行數據遷移和管理。隨着你們使用的普遍和深刻,遇到了很多因爲對 DM 原理不理解而錯誤使用的狀況,也發現了一些 DM 支持並不完善的場景和不少能夠改進的地方。mysql
在這樣的背景下,咱們但願開展 DM 源碼閱讀分享活動,經過對 DM 代碼的分析和設計原理的解讀,幫助你們理解 DM 的實現原理,和你們進行更深刻的交流,也有助於咱們和社區共同進行 DM 的設計、開發和測試。git
本系列文章會聚焦 DM 自身,讀者須要有一些基本的知識,包括但不限於:github
整體而言,讀者須要有必定 MySQL/TiDB 的使用經驗,瞭解 MySQL 數據備份和主從同步的原理,以及能夠讀懂 Go 語言程序。在閱讀 DM 源碼以前,能夠先從閱讀《TiDB-DM 架構設計與實現原理》入手,而且參考 使用文檔 在本地搭建一個 DM 的測試環境,從基礎原理和使用對 DM 有一個初步的認識,而後再進一步分析源碼,深刻理解代碼的設計和實現。golang
源碼閱讀系列將會從兩條線進行展開,一條是圍繞 DM 的系統架構和重要模塊進行分析,另外一條線圍繞 DM 內部的同步機制展開分析。源碼閱讀不只是對代碼實現的分析,更重要的是深刻的分析背後的設計思想,源碼閱讀和原理分析的覆蓋範圍包括但不限於如下列出的內容(由於目前 DM 仍處於快速迭代的階段,會有新的功能和模塊產生,部分模塊在將來也會進行優化和重構,後續源碼閱讀的內容會隨着 DM 的功能演進作適當的調整):sql
DM 源代碼徹底託管在 GitHub 上,從 項目主頁 能夠看到全部信息,整個項目使用 Go 語言開發,按照功能劃分了不少 package,下表列出了 DM 每一個 package 的基本功能:數據庫
Package | Introduction |
---|---|
checker | 同步任務上下游數據庫配置、權限前置檢查模塊 |
cmd/dm-ctl, cmd/dm-master, cmd/dm-worker | dmctl, DM-master, DM-worker 的 main 文件所在模塊 |
dm/config | 同步任務配置、子任務配置、前置檢查配置定義模塊 |
dm/ctl | dmctl 全部 RPC 調用實現的模塊 |
dm/master | DM-master 的核心實現,包含了 DM-master 後臺服務,對 dmctl 到 DM-master 的 RPC 調用的處理邏輯,對 DM-worker 的管理,對 sharding DDL 進行協調調度等功能 |
dm/pb, dm/proto | dm/proto 定義了 DM-master 和 DM-worker 相關交互的 protobuf 協議,dm/pb 是對應的生成代碼 |
dm/unit | 定義了子任務執行的邏輯單元(包括 dump unit, load unit, sync unit, relay unit)接口,在每一個不一樣邏輯單元對應的 package 內都有對應的 接口實現 |
dm/worker | DM-worker 的核心實現,實現 DM-worker 後臺服務,管理維護每一個任務的 relay 邏輯單元,管理、調度每一個子任務的邏輯單元 |
loader | 子任務 load 邏輯單元的實現,用於全量數據的導入 |
mydumper | 子任務 dump 邏輯單元的實現,用於全量數據的導出 |
pkg | 包含了一些基礎功能的實現,例如 gtid 操做、SQL parser 封裝、binlog 文件流讀寫封裝等 |
relay | 處理 relay log 同步的核心模塊 |
syncer | 子任務 sync 邏輯單元的實現,用於增量數據的同步 |
對於理解代碼最直接的手段就是從 DM-server, DM-worker 和 dmctl 三個 binary 對應的 main 文件入手,看 DM-worker, DM-master 是如何啓動,DM-worker 如何管理一個上游實例和同步任務;如何從 dmctl 開始同步子任務;而後看一個同步子任務從全量狀態,到增量同步狀態,binlog 如何處理、sql 任務如何分發等。經過這樣一個流程對 DM 的總體架構就會有全面的理解。進一步就能夠針對每一個使用細節去了解 DM 背後的設計邏輯和代碼實現,能夠從具體每一個 package 入手,也能夠從感興趣的功能入手。後端
實際上 DM 代碼中使用了不少優秀的第三方開源代碼,包括但不只限於:架構
在源碼閱讀過程當中對於比較重要的、與實現原理有很高相關度的第三方模塊,咱們會進行相應的擴展閱讀。併發
工欲善其事,必先利其器,在閱讀 DM 源碼以前,咱們先來介紹 DM 項目使用到的一些外部工具,這些工具一般用於 DM 的構建、部署、運行和測試,在逐步使用 DM,閱讀代碼、理解原理的過程當中都會使用到這些工具。
本篇文章主要介紹了 DM 源碼閱讀的目的和源碼閱讀的規劃,簡單介紹了 DM 的源碼結構和工具鏈。下一篇文章咱們會從 DM 的總體架構入手,詳細分析 DM-master、DM-worker 和 dmctl 三個組件服務邏輯的實現和功能抽象,RPC 數據模型和交互接口。更多的代碼閱讀內容會在後面的章節中逐步展開,敬請期待。