做者: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 设计。后续会分三篇文章详细地介绍数据同步处理单元的实现,包括: