DM 2.0 小试牛刀

一、背景/目的

从 DM 2.0 版本开始,DM 集群具备高可用,部分 DM-master、DM-worker 节点异常后仍能够保证数据迁移任务的正常运行,除此之外引入 TiUP 工具,运维人员可通过 TiUP DM 组件进行日常的运维工作,包括部署、启动、关闭、销毁、扩缩容、升级 DM 集群以及管理 DM 集群参数。

本文介绍 DM 2.0 的最佳配置以及使用方式。同时分享常见问题的处理方法、与 DM 1.0.x 的差异以及 DM 2.0.0 暂不支持的功能等。

二、DM 2.0 和 DM 1.0 的差异

DM 2.0 和 DM 1.0 相比增加的部分

  • 高可用(全量导出与导入不支持)
  • 乐观 sharding ddl(可用于支持下游比上游列多的场景
  • MySQL 8.0 支持(实验特性)
  • TLS 支持
  • TiUP 运维支持
  • 新的错误处理机制 handle-error(替代原 sql-skip/sql-replace)
  • 数据迁移功能 task 中增加 binlog-gtid 参数支持
  • 数据迁移功能 task 中增加 clean-dump-file 参数支持(默认 true)

DM 2.0.0 GA 和 DM 1.0.x 相比减少的部分(注意该部分在 GA 后会逐步补回)

  • relay log(当前增量阶段每个任务会直接读取上游的 binlog)
  • 同步延迟估算 heartbeat

数据迁移任务的高可用仅支持增量同步数据阶段,即当数据迁移任务处于全量导出或导入阶段时,该迁移任务暂不支持高可用。详细高可用原理可参考高可用原理

三、DM 2.0 最佳实践

3.1.部署前注意事项

部署 DM 集群的软硬件要求请参考 DM 集群软硬件环境需求,除此之外,需要做以下几点的检查:

  • 关闭 SELinux
  • 确保以下组件间端口可正常连通:
    • 各 DM-master 节点间的 peer_port(默认为 8291)可互相连通
    • 各 DM-master 节点可连通所有 DM-worker 节点的 port(默认为 8262)
    • 各 DM-worker 节点可连通所有 DM-master 节点的 port(默认为 8261)
    • TiUP 节点可连通所有 DM-master 节点的 port(默认为 8261)
    • TiUP 节点可连通所有 DM-worker 节点的 port(默认为 8262)

3.2.部署 DM 2.0 集群

推荐使用 TiUP 部署 DM 集群。详细部署过程可参考 TiUP 部署 DM 集群

3.2.1.在中控机上安装 TiUP 组件以及 DM 组件

执行如下命令安装 TiUP 工具:
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

设置 TiUP 全局环境变量:

source .bash_profile

确认 TiUP 工具是否安装:

which tiup

安装 TiUP DM 组件:

tiup install dm

如果已经安装,则更新 TiUP DM 组件至最新版本:
tiup update --self && tiup update dm

3.2.2.编辑初始化配置文件,部署 DM 2.0 集群

请根据配置文件模板,新建一个配置文件 topology.yaml。如果有其他组合场景的需求,请根据多个模板自行调整。一个最小化部署(3 个 dm-master、3 个 dm-worker 与 1 个监控组件)的配置,示例可参考使用 TiUP 部署 DM 集群

本次部署示例为单机多实例部署,即 master1 和 master2 部署在同一台机器上,单机多实例部署需要修改端口,TiUP 会根据端口自动生成不同部署目录,可参考以下配置:

---
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb/dmwang-deploy"
  data_dir: "/tidb/dmwang-data"

server_configs:
  master:
    log-level: info
  worker:
    log-level: info

master_servers:
  - host: 172.16.5.158
    name: master1
    port: 8361
    peer_port: 8391
  - host: 172.16.5.158
    name: master2
    port: 8461
    peer_port: 8491
  - host: 172.16.4.136
    name: master3

worker_servers:
  - host: 172.16.5.158
  - host: 172.16.4.138
  - host: 172.16.4.136

monitoring_servers:
  - host: 172.16.5.162
    port: 9390

grafana_servers:
  - host: 172.16.5.162
    port: 3330

执行部署命令、启动集群

tiup dm deploy dm-cluster v2.0.0-rc.2 ./conf/dm.yaml -u tidb

tiup dm start dm-cluster

检查部署的 DM 集群情况

$ tiup dm display dm-cluster
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.1.2/tiup-dm display dm-cluster
dm Cluster: dm-cluster
dm Version: v2.0.0-rc.2
ID                 Role        Host          Ports      OS/Arch       Status     Data Dir                           Deploy Dir
--                 ----        ----          -----      -------       ------     --------                           ----------
172.16.4.136:8361  dm-master   172.16.4.136  8361/8391  linux/x86_64  Healthy    /tidb/dmwang-data/dm-master-8361   /tidb/dmwang-deploy/dm-master-8361
172.16.4.138:8361  dm-master   172.16.4.138  8361/8391  linux/x86_64  Healthy|L  /tidb/dmwang-data/dm-master-8361   /tidb/dmwang-deploy/dm-master-8361
172.16.5.158:8361  dm-master   172.16.5.158  8361/8391  linux/x86_64  Healthy    /tidb/dmwang-data/dm-master-8361   /tidb/dmwang-deploy/dm-master-8361
172.16.4.136:8362  dm-worker   172.16.4.136  8362       linux/x86_64  Free       /tidb/dmwang-data/dm-worker-8362   /tidb/dmwang-deploy/dm-worker-8362
172.16.4.138:8362  dm-worker   172.16.4.138  8362       linux/x86_64  Free       /tidb/dmwang-data/dm-worker-8362   /tidb/dmwang-deploy/dm-worker-8362
172.16.5.158:8362  dm-worker   172.16.5.158  8362       linux/x86_64  Free       /tidb/dmwang-data/dm-worker-8362   /tidb/dmwang-deploy/dm-worker-8362
172.16.5.162:3330  grafana     172.16.5.162  3330       linux/x86_64  Up         -                                  /tidb/dmwang-deploy/grafana-3330
172.16.5.162:9390  prometheus  172.16.5.162  9390       linux/x86_64  Up         /tidb/dmwang-data/prometheus-9390  /tidb/dmwang-deploy/prometheus-9390

其他 TiUP 操作命令可以参考使用 TiUP 运维 DM 集群,至此,DM 集群已部署完成。
注意:DM 集群部署完成后,仅表示 DM-master、DM-worker 等组件部署成功。如需同步上游数据,需要按照下面配置加载上游数据源以及配置 task 同步任务。

3.3.同步任务配置与管理

3.3.1.配置上游数据源

以上游 MySQL 为例:配置同步任务前,需要使用 operate-source 命令将数据源配置加载到 DM 集群中,即将上游数据库相关配置加载到 DM 集群中。

上游数据库配置文件示例

$ cat ./source.yaml 
source-id: "mysql-replica-01"
enable-gtid: false

from:
  host: "172.16.5.142"
  port: 13307
  user: "dm"
  password: "123456"  #可使用明文或者加密密码,推荐使用加密密码

加载数据源配置

$ tiup dmctl  --master-addr 172.16.5.158:8361 operate-source create ./source.yaml 
Starting component `dmctl`: /home/tidb/.tiup/components/dmctl/v2.0.0-rc.2/dmctl/dmctl --master-addr 172.16.5.158:8361 operate-source create ./source.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replica-01",
            "worker": "dm-172.16.5.158-8262"
        }
    ]
}

数据源配置加载成功后,随机一个 DM-worker 的状态变成 Bound 状态。

[tidb@node5162 conf]$ tiup dm display dm-cluster
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.1.2/tiup-dm display dm-cluster
dm Cluster: dm-cluster
dm Version: v2.0.0-rc.2
ID                 Role        Host          Ports      OS/Arch       Status     Data Dir                           Deploy Dir
--                 ----        ----          -----      -------       ------     --------                           ----------
172.16.4.136:8261  dm-master   172.16.4.136  8261/8291  linux/x86_64  Healthy    /tidb/dmwang-data/dm-master-8261   /tidb/dmwang-deploy/dm-master-8261
172.16.5.158:8361  dm-master   172.16.5.158  8361/8391  linux/x86_64  Healthy|L  /tidb/dmwang-data/dm-master-8361   /tidb/dmwang-deploy/dm-master-8361
172.16.5.158:8461  dm-master   172.16.5.158  8461/8491  linux/x86_64  Healthy    /tidb/dmwang-data/dm-master-8461   /tidb/dmwang-deploy/dm-master-8461
172.16.4.136:8262  dm-worker   172.16.4.136  8262       linux/x86_64  Free       /tidb/dmwang-data/dm-worker-8262   /tidb/dmwang-deploy/dm-worker-8262
172.16.4.138:8262  dm-worker   172.16.4.138  8262       linux/x86_64  Free       /tidb/dmwang-data/dm-worker-8262   /tidb/dmwang-deploy/dm-worker-8262
172.16.5.158:8262  dm-worker   172.16.5.158  8262       linux/x86_64  Bound      /tidb/dmwang-data/dm-worker-8262   /tidb/dmwang-deploy/dm-worker-8262
172.16.5.162:3330  grafana     172.16.5.162  3330       linux/x86_64  Up         -                                  /tidb/dmwang-deploy/grafana-3330
172.16.5.162:9390  prometheus  172.16.5.162  9390       linux/x86_64  Up         /tidb/dmwang-data/prometheus-9390  /tidb/dmwang-deploy/prometheus-9390

3.3.2.task 同步任务配置

用户可根据自己的需求对 task 进行配置,主要特性包括 Table routing、Block & Allow Table Lists、Binlog event filter、DM online-ddl-scheme 以及分库分表合并等。

(1)全量 + 增量数据同步

场景:将上游的 sbtest 同步到下游 TiDB 中。

$ cat test_all.yaml 
---
name: test_all
task-mode: all   # all 即先进行全量同步,全量同步完成后自动进行增量数据同步

target-database:
  host: "172.16.5.162"
  port: 4200
  user: "root"
  password: ""

mysql-instances:       
  -
    source-id: "mysql-replica-01"
    block-allow-list:  "instance"
    mydumper-thread: 4
    loader-thread: 16
    syncer-thread: 16


block-allow-list:
  instance:
    do-dbs: ["sbtest"]
(2)增量数据同步任务配置

场景:将上游 test_tidb 库,从 mysql-bin.000007 文件中 3934 位点开始的增量数据同步到下游 TiDB 中。
注意:如果 source.yaml 中 enable-gtid 设置为 true,配置增量同步任务时,meta 中设置 binlog-gtid 即可。

$ cat test_incr.yaml 
---
name: test_incr
task-mode: incremental   #设置同步模式为增量同步

target-database:
  host: "172.16.5.162"
  port: 4200
  user: "root"
  password: ""

mysql-instances:       
  -
    source-id: "mysql-replica-01"
    meta:              #配置增量同步的起始点,DM 2.0 支持配置 binlog-gtid
      binlog-name: mysql-bin.000007
      binlog-pos: 3934
    block-allow-list:  "instance"
    mydumper-thread: 4
    loader-thread: 16
    syncer-thread: 16
block-allow-list:
  instance:
    do-dbs: ["test_tidb"]
(3)分库分表合并任务配置

场景:将上游 lwt 库,以 t_ 开头的表中的数据,合并到下游 ll 库中的一张 t 表中。
分库分表合并时,如有主键冲突情况,请参考自增主键冲突处理

$ cat tt.yaml 
---
name: tt_all
task-mode: all 
shard-mode: "pessimistic" 
ignore-checking-items: ["auto_increment_ID"]
target-database:
  host: "172.16.5.162"
  port: 4200
  user: "root"
  password: ""

mysql-instances:       
  -
    source-id: "mysql-replica-01"
    block-allow-list:  "instance"
    mydumper-thread: 4
    loader-thread: 16
    syncer-thread: 16
    route-rules: ["route-rule-1", "route-rule-2"] 

block-allow-list:
  instance:
    do-dbs: ["lwt"]

routes:                          
  route-rule-1:                  
    schema-pattern: "lwt"     
    table-pattern: "t_*"          
    target-schema: "ll"        
    target-table: "t"             
  route-rule-2:
    schema-pattern: "lwt"
    target-schema: "ll"

3.3.3.启动数据同步任务同步数据到下游数据库中

以上述全量 + 增量同步任务为例:

1.check-task 用于对上游 MySQL 实例配置是否满足 DM 要求进行前置检查

» check-task ./conf/test_all.yaml
{
    "result": true,
    "msg": "check pass!!!"
}

2.start-task 用于创建数据迁移任务

» start-task ./conf/test_all.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replica-01",
            "worker": "dm-172.16.5.158-8262"
        }
    ]
}

3.query-status 查询任务状态与子任务状态

» query-status 
{
    "result": true,
    "msg": "",
    "tasks": [
        {
            "taskName": "test_all",
            "taskStatus": "Running",
            "sources": [
                "mysql-replica-01"
            ]
        }
    ]
}

4.登录到下游数据库中确认数据写入情况

[tidb@node5162 ~]$ mysql -uroot -p -P4200 -h172.16.5.162
Enter password: 

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| dm_meta            |
| mysql              |
| sbtest             |
| test               |
+--------------------+
7 rows in set (0.00 sec)

注意:下游数据库中,除需要同步的库/表外,还会创建一个 dm_meta(默认)库。dm_meta 中主要是记录 checkpoint 信息,即 DM 在全量导入与增量复制过程中的断点信息,用于在重新启动或恢复任务时从之前已经处理过的位置继续执行。

四、FAQ

4.1.常见问题 FAQ

(1).DM 1.0.x 集群升级到 DM 2.0.x 集群的方式?

  • Ansible 部署 DM 1.0.x 集群升级到 DM 2.0.x 版本:可以使用 TiUP dm import 方式,导入 DM-ansible 部署的集群并升级到 2.0.x 版本,可参考 import

  • Binary 部署的 DM 1.0.x 集群升级到 DM 2.0.x 版本:手动升级,利用 checkpoint 信息在 v2.0.x 集群中启动一个新的增量数据复制任务。可参考 手动升级操作

(2).使用 TiUP DM import 升级后,dm-worker/dm-master 进程正常,但是 display 查看显示端口为 down?

可以使用 telnet 测试端口连通性检查端口是否正常开通

  • 需要开通 TiUP 节点到所有 DM-master 节点的 port(默认为 8261)

  • 需要开通 TiUP 节点到所有 DM-worker 节点的 port(默认为 8262)

(3).DM 集群停掉的状态下,tiup dm display 报错 Error: no endpoint available, connect: connection refused

  • 该报错无影响,display 查看状态,当前实现方式是需要读取组件内部信息才能评估的比较准确,当集群状态是 down 的情况下,display 会有报错,可忽略。

  • 已有 issue 优化该问题,可关注 #805

4.2. DM 2.0 暂不支持的功能

1.暂不支持 operate-source 添加上游数据源时绑定指定 dm-worker #918

2.暂不支持一个 dm-worker 配置多个 source #784

3.暂不支持 dmctl 动态切换可用 dm-master 节点 #917

4.暂不支持手动将 DM-master leader 调度到指定节点(但支持将 leader 从当前节点驱逐)#1074

5.暂不支持手动将 subtask 调度到指定 DM-worker 节点 #1075

6.暂不支持在线变更上游 source(如从原 MySQL 主库变更到从库)#1076

7.暂不支持全量阶段 HA(短期不会考虑支持)

最后,如有新的需求场景,可在 GitHub 提 issue,GitHub 链接:https://github.com/pingcap/dm
在测试 DM 2.0 的过程中遇到任何问题,都可在 https://asktug.com/ 提问。

注意,其他关于 DM 2.0 常见 FAQ,会在 “TiDB 常见 FAQ ” 中发布,并将链接链到本文章最底部,可关注。



5赞

学习了

DM 2.0 的特点和使用方法整理很精炼 :+1:

感谢分享,不错哦

赞赞赞

赞一个

顶顶顶,6 的飞起