做者:杨非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 数据模型和交互接口。更多的代码阅读内容会在后面的章节中逐步展开,敬请期待。