TiDB Data Migration (DM)介绍

DM是一体化的迁移任务管理工具, 支持从与MySQL协议兼容的数据库到TiDB数据库的迁移,支持全量载入和增量的数据传输,同时可以进行表和操作的过滤,并且可以进行分库分表的合并迁移;

DM架构
 

dmctl: 用来控制DM集群的命令工具;

  •     用户通过dmctl进行创建、更新、删除任务;
  •     查看迁移任务的工作状态;
  •     处理迁移任务过程中发生的错误

DM-master负责管理和调度数据迁移任务的各项操作;

  •     保存整个DM的拓扑信息
  •     负责DM高可用
  •     监控各个节点的运行状态
  •     协调整个迁移任务

DM-worker负责执行具体的数据迁移任务;

  •     负责读取mysql里面的数据;
  •     负责读取BINLOG,保存到本地,进行编排;
  •     将编排后的BINLOG 发送给TiDB Cluster
  •     一个DM-worker只能对应一个MySQL源端
  •     多余的DM-worker将会保持空闲状态;

适用场景:

  1. 从兼容MySQL的数据库迁移同步数据;
  2. 源库和目标库异构表的迁移
  3. 分库分表的合并迁移;

部署

安装: 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不一致; 需要手动切换;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值