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