摘要:內(nèi)容概要源碼閱讀系列將會從兩條線進行展開,一條是圍繞的系統(tǒng)架構和重要模塊進行分析,另一條線圍繞內(nèi)部的同步機制展開分析。更多的代碼閱讀內(nèi)容會在后面的章節(jié)中逐步展開,敬請期待。
作者:楊非
前言TiDB-DM 是由 PingCAP 開發(fā)的一體化數(shù)據(jù)同步任務管理平臺,支持從 MySQL 或 MariaDB 到 TiDB 的全量數(shù)據(jù)遷移和增量數(shù)據(jù)同步,在 TiDB DevCon 2019 正式開源。作為一款連接 MySQL/MariaDB 生態(tài)和 TiDB 生態(tài)的中臺類型產(chǎn)品,DM 獲得了廣泛的關注,很多公司、開發(fā)者和社區(qū)的伙伴已經(jīng)在使用 DM 來進行數(shù)據(jù)遷移和管理。隨著大家使用的廣泛和深入,遇到了不少由于對 DM 原理不理解而錯誤使用的情況,也發(fā)現(xiàn)了一些 DM 支持并不完善的場景和很多可以改進的地方。
在這樣的背景下,我們希望開展 DM 源碼閱讀分享活動,通過對 DM 代碼的分析和設計原理的解讀,幫助大家理解 DM 的實現(xiàn)原理,和大家進行更深入的交流,也有助于我們和社區(qū)共同進行 DM 的設計、開發(fā)和測試。
背景知識本系列文章會聚焦 DM 自身,讀者需要有一些基本的知識,包括但不限于:
Go 語言,DM 由 Go 語言實現(xiàn),有一定的 Go 語言基礎有助于快速理解代碼。
數(shù)據(jù)庫基礎知識,包括 MySQL、TiDB 的功能、配置和使用等;知道基本的 DDL、DML 語句和事務的基本常識;MySQL 數(shù)據(jù)備份、主從同步的原理等。
基本的后端服務知識,比如后臺服務進程管理、RPC 工作原理等。
總體而言,讀者需要有一定 MySQL/TiDB 的使用經(jīng)驗,了解 MySQL 數(shù)據(jù)備份和主從同步的原理,以及可以讀懂 Go 語言程序。在閱讀 DM 源碼之前,可以先從閱讀《TiDB-DM 架構設計與實現(xiàn)原理》入手,并且參考 使用文檔 在本地搭建一個 DM 的測試環(huán)境,從基礎原理和使用對 DM 有一個初步的認識,然后再進一步分析源碼,深入理解代碼的設計和實現(xiàn)。
內(nèi)容概要源碼閱讀系列將會從兩條線進行展開,一條是圍繞 DM 的系統(tǒng)架構和重要模塊進行分析,另一條線圍繞 DM 內(nèi)部的同步機制展開分析。源碼閱讀不僅是對代碼實現(xiàn)的分析,更重要的是深入的分析背后的設計思想,源碼閱讀和原理分析的覆蓋范圍包括但不限于以下列出的內(nèi)容(因為目前 DM 仍處于快速迭代的階段,會有新的功能和模塊產(chǎn)生,部分模塊在未來也會進行優(yōu)化和重構,后續(xù)源碼閱讀的內(nèi)容會隨著 DM 的功能演進做適當?shù)恼{整):
整體架構介紹,包括 DM 有哪些模塊,分別實現(xiàn)什么功能,模塊之間交互的數(shù)據(jù)模型和 RPC 實現(xiàn)。
DM-worker 內(nèi)部組件設計原理(relay-unit, dump-unit, load-unit, sync-unit)和數(shù)據(jù)同步的并發(fā)模型設計與實現(xiàn)。
基于 binlog 的數(shù)據(jù)同步模型設計和實現(xiàn)。
relay log 的原理和實現(xiàn)。
定制化數(shù)據(jù)同步功能的實現(xiàn)原理(包括庫表路由,庫表黑白名單,binlog event 過濾,列值轉換)。
DM 如何支持上游 online DDL 工具(pt-osc, gh-ost)的 DDL 同步場景。
sharding DDL 處理的具體實現(xiàn)。
checkpoint 的設計原理和實現(xiàn),深入介紹 DM 如何在各類異常情況下保證上下游數(shù)據(jù)同步的一致性。
DM 測試的架構和實現(xiàn)。
代碼簡介DM 源代碼完全托管在 GitHub 上,從 項目主頁 可以看到所有信息,整個項目使用 Go 語言開發(fā),按照功能劃分了很多 package,下表列出了 DM 每個 package 的基本功能:
Package | Introduction |
---|---|
checker | 同步任務上下游數(shù)據(jù)庫配置、權限前置檢查模塊 |
cmd/dm-ctl, cmd/dm-master, cmd/dm-worker | dmctl, DM-master, DM-worker 的 main 文件所在模塊 |
dm/config | 同步任務配置、子任務配置、前置檢查配置定義模塊 |
dm/ctl | dmctl 所有 RPC 調用實現(xiàn)的模塊 |
dm/master | DM-master 的核心實現(xiàn),包含了 DM-master 后臺服務,對 dmctl 到 DM-master 的 RPC 調用的處理邏輯,對 DM-worker 的管理,對 sharding DDL 進行協(xié)調調度等功能 |
dm/pb, dm/proto | dm/proto 定義了 DM-master 和 DM-worker 相關交互的 protobuf 協(xié)議,dm/pb 是對應的生成代碼 |
dm/unit | 定義了子任務執(zhí)行的邏輯單元(包括 dump unit, load unit, sync unit, relay unit)接口,在每個不同邏輯單元對應的 package 內(nèi)都有對應的 接口實現(xiàn) |
dm/worker | DM-worker 的核心實現(xiàn),實現(xiàn) DM-worker 后臺服務,管理維護每個任務的 relay 邏輯單元,管理、調度每個子任務的邏輯單元 |
loader | 子任務 load 邏輯單元的實現(xiàn),用于全量數(shù)據(jù)的導入 |
mydumper | 子任務 dump 邏輯單元的實現(xiàn),用于全量數(shù)據(jù)的導出 |
pkg | 包含了一些基礎功能的實現(xiàn),例如 gtid 操作、SQL parser 封裝、binlog 文件流讀寫封裝等 |
relay | 處理 relay log 同步的核心模塊 |
syncer | 子任務 sync 邏輯單元的實現(xiàn),用于增量數(shù)據(jù)的同步 |
對于理解代碼最直接的手段就是從 DM-server, DM-worker 和 dmctl 三個 binary 對應的 main 文件入手,看 DM-worker, DM-master 是如何啟動,DM-worker 如何管理一個上游實例和同步任務;如何從 dmctl 開始同步子任務;然后看一個同步子任務從全量狀態(tài),到增量同步狀態(tài),binlog 如何處理、sql 任務如何分發(fā)等。通過這樣一個流程對 DM 的整體架構就會有全面的理解。進一步就可以針對每個使用細節(jié)去了解 DM 背后的設計邏輯和代碼實現(xiàn),可以從具體每個 package 入手,也可以從感興趣的功能入手。
實際上 DM 代碼中使用了很多優(yōu)秀的第三方開源代碼,包括但不僅限于:
借助 grpc 實現(xiàn)各組件之間的 RPC 通信
借助 pingcap/parser 進行 DDL 的語法解析和語句還原
借助 pingcap/tidb-tools 提供的工具實現(xiàn)復雜的數(shù)據(jù)同步定制
借助 go-mysql 解析 MySQL/MariaDB binlog 等
在源碼閱讀過程中對于比較重要的、與實現(xiàn)原理有很高相關度的第三方模塊,我們會進行相應的擴展閱讀。
工具鏈工欲善其事,必先利其器,在閱讀 DM 源碼之前,我們先來介紹 DM 項目使用到的一些外部工具,這些工具通常用于 DM 的構建、部署、運行和測試,在逐步使用 DM,閱讀代碼、理解原理的過程中都會使用到這些工具。
golang 工具鏈:構建 DM 需要 go >= 1.11.4,目前支持 Linux 和 MacOS 環(huán)境。
gogoprotobuf:用于從 proto 描述文件生成 protobuf 代碼,DM 代碼倉庫的 generate-dm.sh 文件封裝了自動生成 DM 內(nèi)部 protobuf 代碼的腳本。
Ansible:DM 封裝了 DM-Ansible 腳本用于 DM 集群的自動化部署,部署流程可以參考 使用 ansible 部署 DM。
pt-osc, gh-ost:用于上游 MySQL 進行 online-ddl 的同步場景。
mydumper:DM 的全量數(shù)據(jù) dump 階段直接使用 mydumper 的 binary。
MySQL, TiDB, sync_diff_inspector:這些主要用于單元測試和集成測試,可以參考 tests#preparations 這部分描述。
小結本篇文章主要介紹了 DM 源碼閱讀的目的和源碼閱讀的規(guī)劃,簡單介紹了 DM 的源碼結構和工具鏈。下一篇文章我們會從 DM 的整體架構入手,詳細分析 DM-master、DM-worker 和 dmctl 三個組件服務邏輯的實現(xiàn)和功能抽象,RPC 數(shù)據(jù)模型和交互接口。更多的代碼閱讀內(nèi)容會在后面的章節(jié)中逐步展開,敬請期待。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/17939.html
摘要:作者張學程本文為源碼閱讀系列文章的第六篇,在上篇文章中我們介紹了處理單元的實現(xiàn),對在增量復制過程中的讀取過濾路由轉換以及執(zhí)行等邏輯進行了分析。值得注意的是,由于我們近期正在對處理單元進行重構,因此源碼中會同時包含重構前后的相關代碼實現(xiàn)。 作者:張學程 本文為 DM 源碼閱讀系列文章的第六篇,在 上篇文章 中我們介紹了 binlog replication 處理單元的實現(xiàn),對在增量復制過...
閱讀 898·2021-11-15 17:58
閱讀 3730·2021-11-12 10:36
閱讀 3863·2021-09-22 16:06
閱讀 1022·2021-09-10 10:50
閱讀 1366·2019-08-30 11:19
閱讀 3348·2019-08-29 16:26
閱讀 1000·2019-08-29 10:55
閱讀 3384·2019-08-26 13:48