生态工具原理学习笔记(笔记)

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
1赞

:+1::+1: