写点什么

DM 2.0 小试牛刀

  • 2022 年 7 月 11 日
  • 本文字数:7096 字

    阅读完需:约 23 分钟

作者: 小王同学原文来源:https://tidb.net/blog/513e418e

一、背景 / 目的

从 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-clusterStarting component `dm`: /home/tidb/.tiup/components/dm/v1.1.2/tiup-dm display dm-clusterdm Cluster: dm-clusterdm Version: v2.0.0-rc.2ID                 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-8361172.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-8361172.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-8361172.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-8362172.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-8362172.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-8362172.16.5.162:3330  grafana     172.16.5.162  3330       linux/x86_64  Up         -                                  /tidb/dmwang-deploy/grafana-3330172.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-clusterStarting component `dm`: /home/tidb/.tiup/components/dm/v1.1.2/tiup-dm display dm-clusterdm Cluster: dm-clusterdm Version: v2.0.0-rc.2ID                 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-8261172.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-8361172.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-8461172.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-8262172.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-8262172.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-8262172.16.5.162:3330  grafana     172.16.5.162  3330       linux/x86_64  Up         -                                  /tidb/dmwang-deploy/grafana-3330172.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_alltask-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_incrtask-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: 16block-allow-list: instance: do-dbs: ["test_tidb"]
复制代码
(3)分库分表合并任务配置

场景:将上游 lwt 库,以 t_ 开头的表中的数据,合并到下游 ll 库中的一张 t 表中。


分库分表合并时,如有主键冲突情况,请参考自增主键冲突处理


$ cat tt.yaml ---name: tt_alltask-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.162Enter 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 ” 中发布,并将链接链到本文章最底部,可关注。



[FAQ] dm 2.0.x 同步数据报错 Try adjusting the ‘max_allowed_packet’ variable on the server TiDB 常见 FAQ


[问题澄清] 使用 DM 2.0.x 版本同步上游数据时报错 Try adjusting the ‘max_allowed_packet’ variable on the server,修改 下游 TiDB 的 max_allowed_packet 为最大值后,仍然报错。 [原因分析] DM 2.0.x 版本 DM-worker 里集成了一个 mock TiKV 的 TiDB,遇到此类报错时…



[FAQ]DM 2.0.0-rc.2 报错 Update worker config is not supported by dm-ha now TiDB 常见 FAQ


[问题澄清] 使用 operate-source update 更新 source.yaml 时,报错 Update worker config is not supported by dm-ha now [原因分析] 2.0.0 GA 之前暂不支持修改,会在 GA 之后的小版本中完善该功能,可关注 DM 发版的 Release Notes [解决方案] 临时解决方案:使用 operat…



[FAQ]DM 2.0.0-rc2 同步表报错 table xxx doesn’t exist,实际上表是存在的 TiDB 常见 FAQ


【问题澄清】 使用 DM 2.0.0-rc.2 以下版本同步类似 “CREATE TABLE xxx LIKE” 这类语句时,报错 table xxx doesn’t exist,在下游 TiDB 集群中手动执行该 SQL,执行成功。 [原因分析] DM 2.0 内部集成了一个 TiDB 用来 track 表结构 遇到类似 “CREATE TABLE xxx LIKE” 这类语句时,2.…


发布于: 刚刚阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
DM 2.0 小试牛刀_TiDB 社区干货传送门_InfoQ写作社区