DM是一体化的迁移任务管理工具, 支持从与MySQL协议兼容的数据库到TiDB数据库的迁移,支持全量载入和增量的数据传输,同时可以进行表和操作的过滤,并且可以进行分库分表的合并迁移;
DM架构
dmctl: 用来控制DM集群的命令工具;
- 用户通过dmctl进行创建、更新、删除任务;
- 查看迁移任务的工作状态;
- 处理迁移任务过程中发生的错误
DM-master负责管理和调度数据迁移任务的各项操作;
- 保存整个DM的拓扑信息
- 负责DM高可用
- 监控各个节点的运行状态
- 协调整个迁移任务
DM-worker负责执行具体的数据迁移任务;
- 负责读取mysql里面的数据;
- 负责读取BINLOG,保存到本地,进行编排;
- 将编排后的BINLOG 发送给TiDB Cluster
- 一个DM-worker只能对应一个MySQL源端
- 多余的DM-worker将会保持空闲状态;
适用场景:
- 从兼容MySQL的数据库迁移同步数据;
- 源库和目标库异构表的迁移
- 分库分表的合并迁移;
部署
安装: tiup install dm
升级: tiup update --self && tiup update dm
生成初始化配置文件: tiup dm template
tiup dm deploy ${name} ${version} ./topology.yaml --user root [-p]
tiup list dm-master 查看可部署的DM版本
部署成功后提示: deployed successfully
iup dm deploy dm_default 5.3.0 ./topology.yaml --user root
Starting component `dm`: /root/.tiup/components/dm/v1.7.0/tiup-dm deploy dm_default 5.3.0 ./topology.yaml --user root
...
Cluster `dm_default` deployed successfully, you can start it with command: `tiup dm start dm_default`
查看部署的DM: tiup dm list
tiup dm list
Starting component `dm`: /root/.tiup/components/dm/v1.7.0/tiup-dm list
Name User Version Path PrivateKey
---- ---- ------- ---- ----------
dm_default root v5.3.0 /root/.tiup/storage/dm/clusters/dm_default /root/.tiup/storage/dm/clusters/dm_default/ssh/id_rsa
查看集群信息:tiup dm display dm_default
启动集群: tiup dm start dm_default
- MySQL源必须开启BINLOG
- Table Block& Allow Lists: 可以对库表进行过滤;
- BINLOG EVENT FILTER: 对具体的操作进行过滤,如 INSERT/DELETE/UPDATE/DROP/TRUNCATE 等;
- Table Routing: 表路由,可以同步源和目标不同表名; 可以做分库分表同步到单表;
- TiDB: 将BINLOG转化为TiDB可执行的语句,并行执行;
DM配置文件
# The topology template is used deploy a minimal DM cluster, which suitable
# for scenarios with only three machinescontains. The minimal cluster contains
# - 3 master nodes
# - 3 worker nodes
# You can change the hosts according your environment
---
global:
user: "root"
ssh_port: 22
deploy_dir: "/export/servers/tidb/dm/deploy"
data_dir: "/export/servers/tidb/dm/data"
# arch: "amd64"
master_servers:
- host: XX.XX.XX.XX
worker_servers:
- host: XX.XX.XX.XX
monitoring_servers:
- host: XX.XX.XX.XX
grafana_servers:
- host: XX.XX.XX.XX
alertmanager_servers:
- host: XX.XX.XX.XX
数据源配置
source-id: "mysql-replica-01"
#是否开启GTID
enable-gtid: false
# 是否开启 relay log
enable-relay: false
relay-binlog-name: '' #拉去上游的起始文件名
relay-binlog-gtid: '' #拉取上游BINLOG的起始GTID
from:
host: "x.x.x.x"
port: port
user: "username"
password: "password"
目标库配置
# 目标库配置
# 任务名, 多个同时运行的任务不能重名
name: "test"
# 全量+增量: all 迁移模式
task-mode: "all"
# 下游TiDB配置信息
target-database:
host: "X.X.X.X"
port: port
user: "user"
password: "password"
过滤规则配置
mysql-instance:
- source-id: "mysql-replica-01" # 从source-id = mysql-replica-01 的数据源迁移数据
block-allow-list: "bw-rule-1" # 黑白名单配置名称,过滤指定的库表
filter-rules: ["filter-rule-1"] # 过滤数据源特定操作的规则, 可以配置多个过滤规则
route-rules: ["route-rule-1", "route-rule-2"] #数据源表迁移到目标TiDB表的路由规则, 可以定义多个规则
- source-id: "mysql-replica-02" # 从source-id = my-replica-02 的数据源迁移数据
block-allow-list: "bw-rule-2" # 黑白名单配置名称
filter-rules: ["filter-rule-2"] # 过滤数据源特定操作的规则, 可以配置多个过滤规则
# 黑白名单配置:
block-allow-list: #定义数据源迁移表的过滤规则, 可以定义多个规则。 如果DM版本早于v2.0.0-beta.2 则使用
block-white-list
bw-rule-1: # 规则名称
do-dbs: ["user"] # 迁移哪些库
ignore-dbs: ["test"] # 忽略哪些库
do-tables: # 迁移哪些表
- db-name: "user" # 迁移user库中的t1表
tbl-name: "t1"
# Binlog event filter,操作过滤
filters: # 上游数据库实例匹配的表的binlog event filter规则集
filter-rule-1: # 配置名称
schema-pattern: "test" # 库名匹配规则, 支持通配符 "*" 和 "?"
table-pattern: "sbtest" # 表名匹配规则, 支持通配符 "*" 和 "?"
events: ["insert"] # 匹配哪些event类型
action: Ignore # 对符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
filter-rule-2:
schema-pattern: "test"
events: ["truncate table"]
action: Ignore
# 路由规则
routes: # 上游和下游之间的路由 table routing 规则集
route-rule-1: # 配置名称
schema-pattern: "test" # 库名匹配规则,支持通配符
table-pattern: "sbtest1" # 表名匹配规则,支持通配符
target-schema: "test" # 目标库名
target-table: "sbtest2" # 目标表名
# 分库分表合并迁移
routes:
sale-route-rule:
schema-pattern: "sales"
table-pattern: "order*"
target-schema: "sales"
target-table: "order"
常用命令
# 检查任务
tiup dmctl --master-addr 172.18.136.172:8261 check-task ./task.yaml
# 开始任务
tiup dmctl --master-addr 172.18.136.172:8261 start-task ./task.yaml
# 暂停任务
tiup dmctl --master-addr 172.18.136.172:8261 pause-task ./task.yaml
# 恢复任务
tiup dmctl --master-addr 172.18.136.172:8261 resume-task ./task.yaml
# 查看任务
tiup dmctl --master-addr 172.18.136.172:8261 query-task ./task.yaml
# 停止任务
tiup dmctl --master-addr 172.18.136.172:8261 stop-task ./task.yaml
性能优化
- 全量导出
- rows # 每次导出的chunk 行数;
- chunk-filesize # 默认64M
- threads # 并发线程数
- 全量导入
- pool-size # TiDB并发导入的线程数,默认16;
- 增量复制
- worker-count # 默认16, DM worker线程数
- batch # 下游数据库,每个事物包含的行数;默认100
常见问题
1,处理不兼容的DDL
tiup dmctl --master-addr ip:8261 handle-error test skip
2, 自增主键冲突问题; DM对分库分表合并迁移场景可能出现主键冲突的情况;
a, 去掉自增主键的主键属性
b, 使用联合主键
使用限制
- 数据源版本
- MySQL Version > 5.5
- MariaDB Version >= 10.1.2
- DDL预发兼容性
- 目前TiDB部分兼容MySQL DDL;
- 分库分表
- 主键冲突问题;
- 同步MySQL的实例变更;
- 发生主从切换,导致BINLOG不一致; 需要手动切换;