本文为 TiDB Data Migration 源码阅读系列文章的第六篇,在 《DM 源码阅读系列文章(五)Binlog replication 实现》 中我们介绍了 binlog replication 处理单元的实现,对在增量复制过程中 binlog event 的读取、过滤、路由、转换以及执行等逻辑进行了分析。
本篇文章我们将会对 relay 数据处理单元的实现进行详细的讲解。这个单元的作用是从上游 MySQL/MariaDB 读取 binlog event 并写入到本地的 relay log file 中;当执行增量复制任务时,binlog replication 处理单元将读取 relay log file 中的 event 并在进行解析后复制到下游的 TiDB 中。本篇文章的内容包括 relay log 目录结构定义、relay log 数据的处理流程、主从切换支持、relay log 的读取等逻辑。
值得注意的是,由于我们近期正在对 relay 处理单元进行重构,因此源码中会同时包含重构前后的相关代码实现。
relay log 目录结构
一个已经进行过一次主从切换的 relay log 目录结构大致如下:
<deploy_dir>/relay_log/
|-- 7e427cc0-091c-11e9-9e45-72b7c59d52d7.000001
| |-- mysql-bin.000001
| |-- mysql-bin.000002
| |-- mysql-bin.000003
| |-- mysql-bin.000004
| `-- relay.meta
|-- 842965eb-091c-11e9-9e45-9a3bff03fa39.000002
| |-- mysql-bin.000001
| `-- relay.meta
`-- server-uuid.index
在 relay log 目录下,主要包含以下几类文件或文件夹数据:
类别 | 作用 | 文件(夹)名示例 |
---|---|---|
relay log 子目录 | 以单次主从切换发生时对应于某个 MySQL/MariaDB server 为单位组织 relay log 数据及 meta 信息 | 7e427cc0-091c-11e9-9e45-72b7c59d52d7.000001 |
relay log 数据文件 | 存储实际的 binlog event 数据 | mysql-bin.000001 |
relay meta 信息 | 存储当前已从上游读取并写入为 relay log 的 binlog event 对应于上游的 binlog position/GTID sets 信息 | relay.meta |
relay log 子目录索引 | 索引各有效的 relay log 子目录列表 | server-uuid.index |
relay log 处理流程
relay log 处理流程
从上图大致可以了解 relay log 的逻辑处理流程,对应的入口代码为 Relay.Process,主要步骤包括:
-
使用 binlog reader 从上游 MySQL/MariaDB 读取 binlog event。
-
将读取到的 binlog event 使用 binlog transformer 进行转换。
-
将转换后的 binlog event 使用 binlog writer 以 relay log file 的形式存储在本地。
-
当需要将数据以增量的方式同步到下游 TiDB 时,binlog replication 通过使用 relay reader从 relay log file 中读取 binlog event。
读取 binlog event
relay 处理单元通过 Reader interface 从上游读取 binlog event,其中最重要的方法为读取 binlog event 对象的 GetEvent。
当前对 Reader interface 的实现为 reader,它最终通过 in这个 br.Reader interface从上游读取 binlog event。reader 的使用流程为:
-
调用 Start启动读取流程,并根据配置中是否启用了 GTID 模式分别调用 setUpReaderByGTID或