作者:小王同学
原文来源: tidb.net/blog/513e41…
一、背景/目的
从 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 ” 中发布,并将链接链到本文章最底部,可关注。
[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.…