DM 源码阅读系列文章(六)relay log 的实现丨TiDB 工具

本文详细介绍了DM中relay数据处理单元的工作原理,包括从上游MySQL/MariaDB读取binlog事件,写入relaylog文件,以及如何在主从切换时处理。此外,还涉及了relaylog的目录结构、处理流程、binlog事件的读取与转换、写入逻辑以及主从切换的支持。文章特别提到了在读取和写入过程中如何保证数据一致性与完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为 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,主要步骤包括:

  1. 使用 binlog reader 从上游 MySQL/MariaDB 读取 binlog event。

  2. 将读取到的 binlog event 使用 binlog transformer 进行转换。

  3. 将转换后的 binlog event 使用 binlog writer 以 relay log file 的形式存储在本地。

  4. 当需要将数据以增量的方式同步到下游 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 的使用流程为:

  1. 调用 Start启动读取流程,并根据配置中是否启用了 GTID 模式分别调用 setUpReaderByGTID或 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天读点书学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值