TiDB Data Migration
DM简介
DM是MySQL同步到TiDB的数据同步工具。具备一下特性:
- 一体化数据同步管理平台(client)
- 全量(dumper+loader)+增量复制(syncer)
- 多任务实例X多容不任务
- 同步异常处理、状态监控
- 更加完善的合库合表支持
DM架构
DM-master
DM-master 负责管理和调度数据同步任务的各项操作。
- 保存 DM 集群的拓扑信息
- 监控 DM-worker 进程的运行状态
- 监控数据同步任务的运行状态
- 提供数据同步任务管理的统一入口
- 协调分库分表场景下各个实例分表的 DDL 同步
DM-worker
DM-worker 负责执行具体的数据同步任务。
- 将 binlog 数据持久化保存在本地
- 保存数据同步子任务的配置信息
- 编排数据同步子任务的运行
- 监控数据同步子任务的运行状态
功能支持
组件介绍
dumper
- 相比mydumper,增加黑白名单和正则表达式
load
- batch导入,提升导入速度
- DDL的router实现是通过读取schema文件后,替换实现
relay log
- 支持上游MySQL/MariaDB
- 兼容binlog position/gtid
- 支持relay log自动清理并进行了安全性保障
- 为保证正确性/时序,DDL操作会等之前DML队列的消息执行完成后再执行
Sharding DDL
Sharding DDL实现
- 在DM-mater上引入协调者,来保证上一个版本的所有DML都在下游执行完成后,才应用下一个版本DDL语句
Sharding DDL约束
- 所有上游分片DDL都需要成功执行并成功被worker接收到
- 所有分片上执行的DDL相对顺序必须一致
- 协调DDL过程中,同步延迟会增加
- 下游承担业务读,并业务对读写延迟比较敏感的,需要在业务低峰期操作或者禁止DDL同步到下游(人工添加方式)。
Checkpoint 设计
- 通过将同步位点信息存储在下游的meta-schema表,实现断点续传
- DDL执行成功后,立即flush到下游的TiDB中
- DML事务结束后,定期flush到下游的TiDB中
TiDB Binlog
概述
TiDB Binlog是一个勇于收集TiDB的binlog,并提供数据同步,异常备份的工具
TiDB Binlog支持以下场景:
- 同步数据到从集群
- 备份文件和恢复
- 输出到kafka,提供缓存更新和大数据相关服务
Binlog格式
- 类似MySQL Row Format
- 记录每行的数据变更
- 事务相关信息
- start TS +primary key for P-Binlog(prewrite)
- commit TS for C-Binlog
Binlog写入流程
TiDB采用两阶段来对事务进行提交
- Prepare阶段:
- 写数据到TiKV
- 写priwrite binlog到Pump(增加)
- Commit阶段
- 发送Commit到TiKV
- 异步发送Commit binlog到Pump
Pump设计与实现
- 提供写Binlog服务(通过GRPC网络请求)
- append binlog到log文件
- 返回写成功给TiDB(异步)
- 将Binlog元信息存储到KV DB(异步)
- 更新MaxCommit Ts(保证有序性)
- 存储Binlog到本地
- 根据配置文件,计算需要删除的KV以及Vlog文件
- 保证GC的安全性
- 获取Binlog服务(实现单Pump内事务按照commit TS有序)
- 通过GRPC返回指定Commit-TS后的Binlog
- 按照Commit Ts顺序返回
Drainer设计与实现
- Drainer作用
- grpc持续拉取全部pump的binlog
- 根据commit Ts合并排序Binlog
- 支持下游:
- MySQL/TiDB 灾备/从集群
- 本地备份文件 备份
- Kafka 缓存更新/大数据
Pump/Drainer状态
- Pump/Drainer的不同状态
- offline:下线状态
- pause: 暂停状态
- online:运行状态
- binlogctl查看状态与下线状态
- ./binlogctl -cmd drainers
- ./binlogctl -cmd offline-drainer -node-id node-name:port