作者: paulli



一、DM原理和使用场景



DM原理

DM 提供了 Table routing、Block & Allow Table Lists、Binlog event filter 等基本功能,适用于不同的迁移场景。在迁移之前,建议先了解下这些基本功能,根据需求进行选择和配置。


Table routing

Table routing 可以将上游 MySQL/MariaDB 实例的某些表迁移到下游指定表,它也是分库分表合并迁移所需的一个核心功能。



Block & Allow Table Lists

上游数据库实例表的黑白名单过滤规则,可以用来过滤或者只迁移某些 database/table 的所有操作。



Binlog event filter

Binlog event filter 是比迁移表黑白名单更加细粒度的过滤规则,可以指定只迁移或者过滤掉某些

schema / table 的指定类型 binlog,比如 INSERTTRUNCATE TABLE



DM使用场景

1、MySQL同步数据至TiDB集群,常见场景如分库分表的多个MySQL数据库同步数据至TiDB集群

2、TiDB集群同步数据至TIDB集群



二、搭建DM环境



配置DM

[tidb@tidb53 paul]$ cat dm.yaml 
# 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: "tidb"
ssh_port: 22
deploy_dir: "/data1/tidb-deploy"
data_dir: "/data1/tidb-data"
# arch: "amd64"

server_configs:
master:
  log-level: info
  # rpc-timeout: "30s"
  # rpc-rate-limit: 10.0
  # rpc-rate-burst: 40
worker:
  log-level: info

master_servers:
- host: 172.20.12.52
  # name: master1
  ssh_port: 22
  port: 18261
  peer_port: 18291
  deploy_dir: "/data1/dm-deploy/dm-master-18261"
  data_dir: "/data1/dm-data/dm-master-18261"
  log_dir: "/data1/dm-deploy/dm-master-18261/log"
- host: 172.20.12.53
  # name: master2
  ssh_port: 22
  port: 18261
  peer_port: 18291
  deploy_dir: "/data1/dm-deploy/dm-master-18261"
  data_dir: "/data1/dm-data/dm-master-18261"
  log_dir: "/data1/dm-deploy/dm-master-18261/log"
- host: 172.20.12.70
  # name: master3
  ssh_port: 22
  port: 18261
  peer_port: 18291
  deploy_dir: "/data1/dm-deploy/dm-master-18261"
  data_dir: "/data1/dm-data/dm-master-18261"
  log_dir: "/data1/dm-deploy/dm-master-18261/log"
  
worker_servers:
- host: 172.20.12.52
  ssh_port: 22
  port: 18262
  deploy_dir: "/data1/dm-deploy/dm-worker-18262"
  log_dir: "/data1/dm-deploy/dm-worker-18262/log"
  config:
    log-level: info
- host: 172.20.12.53
  ssh_port: 22
  port: 18262
  deploy_dir: "/data1/dm-deploy/dm-worker-18262"
  log_dir: "/data1/dm-deploy/dm-worker-18262/log"
  config:
    log-level: info
- host: 172.20.12.70
  ssh_port: 22
  port: 18262
  deploy_dir: "/data1/dm-deploy/dm-worker-18262"
  log_dir: "/data1/dm-deploy/dm-worker-18262/log"
  config:
    log-level: info

monitoring_servers:
- host: 172.20.12.53
  ssh_port: 22
  port: 19999
  deploy_dir: "/data1/tidb-deploy/prometheus-19999"
  data_dir: "/data1/tidb-data/prometheus-19999"
  log_dir: "/data1/tidb-deploy/prometheus-19999/log"

grafana_servers:
- host: 172.20.12.53
  port: 19998 
  deploy_dir: /data1/tidb-deploy/grafana-19998

alertmanager_servers:
- host: 172.20.12.53
  ssh_port: 22
  web_port: 19997
  cluster_port: 19996
  deploy_dir: "/data1/tidb-deploy/alertmanager-19997"
  data_dir: "/data1/tidb-data/alertmanager-19997"
  log_dir: "/data1/tidb-deploy/alertmanager-19997/log"


//安装dm
[tidb@tidb53 paul]$ tiup dm deploy paul_dm v6.5.1 ./dm.yaml 
Checking updates for component dm... Timedout (after 2s)
Starting component dm: /home/tidb/.tiup/components/dm/v1.14.1/tiup-dm deploy paul_dm v6.5.1 ./dm.yaml
+ Detect CPU Arch Name
- Detecting node 172.20.12.52 Arch info ... Done
- Detecting node 172.20.12.53 Arch info ... Done
- Detecting node 172.20.12.70 Arch info ... Done
+ Detect CPU OS Name
- Detecting node 172.20.12.52 OS info ... Done
- Detecting node 172.20.12.53 OS info ... Done
- Detecting node 172.20.12.70 OS info ... Done
Please confirm your topology:
Cluster type:   dm
Cluster name:   paul_dm
Cluster version: v6.5.1
Role         Host         Ports       OS/Arch       Directories
----         ----         -----       -------       -----------
dm-master     172.20.12.52 18261/18291 linux/x86_64 /data1/dm-deploy/dm-master-18261,/data1/dm-data/dm-master-18261
dm-master     172.20.12.53 18261/18291 linux/x86_64 /data1/dm-deploy/dm-master-18261,/data1/dm-data/dm-master-18261
dm-master     172.20.12.70 18261/18291 linux/x86_64 /data1/dm-deploy/dm-master-18261,/data1/dm-data/dm-master-18261
dm-worker     172.20.12.52 18262       linux/x86_64 /data1/dm-deploy/dm-worker-18262,/data1/tidb-data/dm-worker-18262
dm-worker     172.20.12.53 18262       linux/x86_64 /data1/dm-deploy/dm-worker-18262,/data1/tidb-data/dm-worker-18262
dm-worker     172.20.12.70 18262       linux/x86_64 /data1/dm-deploy/dm-worker-18262,/data1/tidb-data/dm-worker-18262
prometheus   172.20.12.53 19999       linux/x86_64 /data1/tidb-deploy/prometheus-19999,/data1/tidb-data/prometheus-19999
grafana       172.20.12.53 19998       linux/x86_64 /data1/tidb-deploy/grafana-19998
alertmanager 172.20.12.53 19997/19996 linux/x86_64 /data1/tidb-deploy/alertmanager-19997,/data1/tidb-data/alertmanager-19997
Attention:
  1. If the topology is not what you expected, check your yaml file.
  2. Please confirm there is no port/directory conflicts in same host.
Do you want to continue? [y/N]: (default=N) y
....

[tidb@tidb53 paul]$ tiup dm display paul_dm
Checking updates for component dm... Timedout (after 2s)
Starting component dm: /home/tidb/.tiup/components/dm/v1.14.1/tiup-dm display paul_dm
Cluster type:       dm
Cluster name:       paul_dm
Cluster version:   v6.5.1
Deploy user:       tidb
SSH type:           builtin
Grafana URL:       http://172.20.12.53:19998
ID                 Role         Host         Ports       OS/Arch       Status     Data Dir                             Deploy Dir
--                 ----         ----         -----       -------       ------     --------                             ----------
172.20.12.53:19997 alertmanager 172.20.12.53 19997/19996 linux/x86_64 Up         /data1/tidb-data/alertmanager-19997 /data1/tidb-deploy/alertmanager-19997
172.20.12.52:18261 dm-master     172.20.12.52 18261/18291 linux/x86_64 Healthy|L /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.53:18261 dm-master     172.20.12.53 18261/18291 linux/x86_64 Healthy   /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.70:18261 dm-master     172.20.12.70 18261/18291 linux/x86_64 Healthy   /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.52:18262 dm-worker     172.20.12.52 18262       linux/x86_64 Free       /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.53:18262 dm-worker     172.20.12.53 18262       linux/x86_64 Free       /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.70:18262 dm-worker     172.20.12.70 18262       linux/x86_64 Free       /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.53:19998 grafana       172.20.12.53 19998       linux/x86_64 Up         -                                   /data1/tidb-deploy/grafana-19998
172.20.12.53:19999 prometheus   172.20.12.53 19999       linux/x86_64 Up         /data1/tidb-data/prometheus-19999   /data1/tidb-deploy/prometheus-19999
Total nodes: 9



配置 MySQL

3900:
[root@tidb52 ~]# mkdir -p /data1/mysql/3900/
[root@tidb52 ~]# mkdir -p /data1/mysql/3900/data
[root@tidb52 ~]# mkdir -p /data1/mysql/3900/binlog
[root@tidb52 ~]# mkdir -p /data1/mysql/3900/log
[root@tidb52 ~]# chown -R mysql:mysql /data1/mysql/3900/
[root@tidb52 ~]# tar -xzvf mysql-5.7.28-el7-x86_64.tar.gz 
[root@tidb52 ~]# ln -s mysql-5.7.28-el7-x86_64 mysql
[root@tidb52 ~]# /data1/mysql/mysql/bin/mysqld --defaults-file=/data1/mysql/3900/my.cnf --initialize --user=mysql --basedir=/data1/mysql/mysql --datadir=/data1/mysql/3900/data
[root@tidb52 ~]# /data1/mysql/mysql/bin/mysql -u root -P 3900 -p -h localhost -S /data1/mysql/3900/mysql.sock



创建数据同步用户-MySQL

[root@tidb52 ~]# mysql -u root -P 3900 -p -h localhost -S /data1/mysql/3900/mysql.sock
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @@global.show_compatibility_56=ON;
Query OK, 0 rows affected (0.00 sec)



创建用户和初始化表结构-TiDB

[tidb@tidb53 ~]$ mysql -h 172.20.12.53 -P8000 -u root -proot -c
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 405
Server version: 5.7.25-TiDB-v6.5.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
Query OK, 0 rows affected (0.02 sec)



三、加载数据源



配置数据源

[tidb@tidb53 paul]$ cat mysql-source-conf1.yaml 
source-id: "mysql-replica-01"
from:
host: "172.20.12.52"
port: 3900
user: "dm_user"
password: "rjwvv2zB7Vam/2SpwUHxPUBwD+h2fnxAM+s="

//source tidb 
[tidb@tidb53 paul]$ cat tidb-source-conf1.yaml 
source-id: "tidb-replica-01"
from:
host: "172.20.12.52"
port: 8000
user: "dm_user"
password: "nI0+yapNOdtbBZD+FRk3IEAMAp68KhRAmo8="



注册数据源

[tidb@tidb53 paul]$ tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 operate-source create mysql-source-conf1.yaml
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --master-addr=172.20.12.52:18261 operate-source create mysql-source-conf1.yaml
{
  "result": true,
  "msg": "",
  "sources": [
      {
          "result": true,
          "msg": "",
          "source": "mysql-replica-01",
          "worker": "dm-172.20.12.52-18262"
      }
  ]
}
[tidb@tidb53 paul]$ tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 operate-source create tidb-source-conf1.yaml
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --master-addr=172.20.12.52:18261 operate-source create tidb-source-conf1.yaml
{
  "result": true,
  "msg": "",
  "sources": [
      {
          "result": true,
          "msg": "",
          "source": "tidb-replica-01",
          "worker": "dm-172.20.12.53-18262"
      }
  ]
}



其他功能

//获取加密密码
[tidb@tidb53 ~]$ tiup dmctl --encrypt 'q1w2e3R4_'

A new version of dmctl is available: v6.5.1 -> v7.5.0

  To update this component:   tiup update dmctl
  To update all components:   tiup update --all

Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --encrypt q1w2e3R4_
9TkSQ/2bRFtijuOIcvtMrED4pX+t94AObh0=

//查看所有数据源
[tidb@tidb53 paul]$ tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 operate-source show 
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --master-addr=172.20.12.52:18261 operate-source show
{
  "result": true,
  "msg": "",
  "sources": [
      {
          "result": true,
          "msg": "",
          "source": "mysql-replica-01",
          "worker": "dm-172.20.12.52-18262"
      },
      {
          "result": true,
          "msg": "",
          "source": "tidb-replica-01",
          "worker": "dm-172.20.12.53-18262"
      }
  ]
}



四、配置迁移规则

task-mode提供一下几种任务模式,可设为

full - 只进行全量数据迁移

incremental - Binlog 实时同步

all - 全量 + Binlog 实时同步



配置迁移全量+增量复制规则

[tidb@tidb53 paul]$ cat dm_task_all.yaml 
name: "dm_task202403051" # The name of the task is dm-task.
task-mode: all   # The task mode is set to full (only migrates full data).
ignore-checking-items: ["auto_increment_ID"] # Ignorable checking auto_increment_ID.
meta-schema: "dm_meta" 
clean-dump-file: true
target-database: # set the host, port, user and password of the downstream database TiDB.
host: "172.20.12.53"
port: 8000
user: "dm_user"
password: "9TkSQ/2bRFtijuOIcvtMrED4pX+t94AObh0="
mysql-instances: # configure data sources that need to be migrated for the data migration task.
- source-id: "mysql-replica-01"
  route-rules: ["instance-1-user-schema-rule"]
  filter-rules: ["trace-table-filter-rule"]
  block-allow-list: "log-ignored"
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"
routes:
instance-1-user-schema-rule: # The first of the routing mapping rule.
schema-pattern: "test"
target-schema: "test"
filters:
trace-table-filter-rule:
schema-pattern: "test"
table-pattern: "t*"
events: ["truncate table", "DROP TABLE"]
action: Ignore
block-allow-list:
log-ignored:
ignore-dbs: ["information_schema","mysql","performance_schema","tidb_binlog"]
mydumpers:
global:
threads: 4
chunk-filesize: 64
loaders: 
global: 
pool-size: 16 
dir: "./dumped_data"
import-mode: "logical"
on-duplicate: "replace"
syncers:
global:
worker-count: 16
batch: 100
enable-ansi-quotes: true
safe-mode: false
safe-mode-duration: "60s"
compact: true
multiple-rows: false



配置迁移增量复制规则

当task-mode为incremental的时候,且下游数据库的 checkpoint 不存在,指定meta读取的 binlog 迁移开始的位置;

如果 meta 项和下游数据库的 checkpoint 都不存在,则从上游当前最新的 binlog 位置开始迁移

[tidb@tidb53 paul]$ cat dm_task_increment.yaml 
name: "dm_task202403051" # The name of the task is dm-task.
task-mode: incremental   # The task mode is set to full (only migrates full data).
ignore-checking-items: ["auto_increment_ID"] # Ignorable checking auto_increment_ID.
meta-schema: "dm_meta" 
clean-dump-file: true
target-database: # set the host, port, user and password of the downstream database TiDB.
host: "172.20.12.53"
port: 8000
user: "dm_user"
password: "9TkSQ/2bRFtijuOIcvtMrED4pX+t94AObh0="
mysql-instances: # configure data sources that need to be migrated for the data migration task.
- source-id: "mysql-replica-01"
  meta:                                  
    binlog-name: mysqldb-log.000073
    binlog-pos: 386800605
    binlog-gtid: ""  
  route-rules: ["instance-1-user-schema-rule"]
  filter-rules: ["trace-table-filter-rule"]
  block-allow-list: "log-ignored"
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"
routes:
instance-1-user-schema-rule: # The first of the routing mapping rule.
schema-pattern: "test"
target-schema: "test"
filters:
trace-table-filter-rule:
schema-pattern: "test"
table-pattern: "t*"
events: ["truncate table", "DROP TABLE"]
action: Ignore
block-allow-list:
log-ignored:
ignore-dbs: ["information_schema","mysql","performance_schema","tidb_binlog"]
mydumpers:
global:
threads: 4
chunk-filesize: 64
loaders: 
global: 
pool-size: 16 
dir: "./dumped_data"
import-mode: "logical"
on-duplicate: "replace"
syncers:
global:
worker-count: 16
batch: 100
enable-ansi-quotes: true
safe-mode: false
safe-mode-duration: "60s"
compact: true
multiple-rows: false



五、DM集群和任务管理



DM任务管理



启动任务

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 start-task dm_task_all.yaml



停止任务

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 stop-task dm_task_all.yaml



查看任务状态

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 query-status dm_task_all.yaml



暂停任务状态

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 pause-task dm_task_all.yaml



恢复任务状态

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 resume-task dm_task_all.yaml



开启任务relay log

[tidb@tidb53 ~]$ tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 start-relay -s mysql-replica-01
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --master-addr=172.20.12.52:18261 start-relay -s mysql-replica-01
{
  "result": true,
  "msg": "",
  "sources": [
  ]
}



查询状态relay log

tiup dmctl:v6.5.1 --master-addr=172.20.12.52:18261 query-status -s mysql-replica-01
Starting component dmctl: /home/tidb/.tiup/components/dmctl/v6.5.1/dmctl/dmctl --master-addr=172.20.12.52:18261 query-status -s mysql-replica-01
{
  "result": true,
  "msg": "",
  "sources": [
      {
          "result": true,
          "msg": "",
          "sourceStatus": {
              "source": "mysql-replica-01",
              "worker": "dm-172.20.12.52-18262",
              "result": null,
              "relayStatus": {
                  "masterBinlog": "(mysqldb-log.000002, 9637)",
                  "masterBinlogGtid": "",
                  "relaySubDir": "5bb7f595-b90b-11ee-ad78-4cd98f4baa6a.000001",
                  "relayBinlog": "(mysqldb-log.000002, 9637)",
                  "relayBinlogGtid": "",
                  "relayCatchUpMaster": true,
                  "stage": "Running",
                  "result": null
              }
          },
          "subTaskStatus": [
              {
                  "name": "dm-task",
                  "stage": "Running",
                  "unit": "Sync",
                  "result": null,
                  "unresolvedDDLLockID": "",
                  "sync": {
                      "totalEvents": "0",
                      "totalTps": "0",
                      "recentTps": "0",
                      "masterBinlog": "(mysqldb-log.000002, 9637)",
                      "masterBinlogGtid": "",
                      "syncerBinlog": "(mysqldb-log.000002, 9637)",
                      "syncerBinlogGtid": "",
                      "blockingDDLs": [
                      ],
                      "unresolvedGroups": [
                      ],
                      "synced": true,
                      "binlogType": "local",
                      "secondsBehindMaster": "0",
                      "blockDDLOwner": "",
                      "conflictMsg": "",
                      "totalRows": "0",
                      "totalRps": "0",
                      "recentRps": "0"
                  },
                  "validation": null
              }
          ]
      }
  ]
}



DM集群管理



查看dm集群状态

[tidb@tidb53 paul]$ tiup dm display paul_dm
Checking updates for component dm... Timedout (after 2s)
Starting component dm: /home/tidb/.tiup/components/dm/v1.14.1/tiup-dm display paul_dm
Cluster type:       dm
Cluster name:       paul_dm
Cluster version:   v6.5.1
Deploy user:       tidb
SSH type:           builtin
Grafana URL:       http://172.20.12.53:19998
ID                 Role         Host         Ports       OS/Arch       Status     Data Dir                             Deploy Dir
--                 ----         ----         -----       -------       ------     --------                             ----------
172.20.12.53:19997 alertmanager 172.20.12.53 19997/19996 linux/x86_64 Up         /data1/tidb-data/alertmanager-19997 /data1/tidb-deploy/alertmanager-19997
172.20.12.52:18261 dm-master     172.20.12.52 18261/18291 linux/x86_64 Healthy|L /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.53:18261 dm-master     172.20.12.53 18261/18291 linux/x86_64 Healthy   /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.70:18261 dm-master     172.20.12.70 18261/18291 linux/x86_64 Healthy   /data1/dm-data/dm-master-18261       /data1/dm-deploy/dm-master-18261
172.20.12.52:18262 dm-worker     172.20.12.52 18262       linux/x86_64 Bound     /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.53:18262 dm-worker     172.20.12.53 18262       linux/x86_64 Free       /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.70:18262 dm-worker     172.20.12.70 18262       linux/x86_64 Bound     /data1/tidb-data/dm-worker-18262     /data1/dm-deploy/dm-worker-18262
172.20.12.53:19998 grafana       172.20.12.53 19998       linux/x86_64 Up         -                                   /data1/tidb-deploy/grafana-19998
172.20.12.53:19999 prometheus   172.20.12.53 19999       linux/x86_64 Up         /data1/tidb-data/prometheus-19999   /data1/tidb-deploy/prometheus-19999
Total nodes: 9



缩容work节点

[tidb@tidb53 paul]$ tiup dm scale-in paul_dm -N 172.20.12.53:18262
Checking updates for component dm... Timedout (after 2s)
Starting component dm: /home/tidb/.tiup/components/dm/v1.14.1/tiup-dm scale-in paul_dm -N 172.20.12.53:18262
This operation will delete the 172.20.12.53:18262 nodes in `paul_dm` and all their data.
Do you want to continue? [y/N]:(default=N) y
Scale-in nodes...
+ [ Serial ] - SSHKeySet: privateKey=/home/tidb/.tiup/storage/dm/clusters/paul_dm/ssh/id_rsa, publicKey=/home/tidb/.tiup/storage/dm/clusters/paul_dm/ssh/id_rsa.pub
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.52
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.52
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.70
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.70
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [ Serial ] - ScaleInCluster: options={Roles:[] Nodes:[172.20.12.53:18262] Force:false SSHTimeout:5 OptTimeout:120 APITimeout:0 IgnoreConfigCheck:false NativeSSH:false SSHType: Concurrency:5 SSHProxyHost: SSHProxyPort:22 SSHProxyUser:tidb SSHProxyIdentity:/home/tidb/.ssh/id_rsa SSHProxyUsePassword:false SSHProxyTimeout:5 SSHCustomScripts:{BeforeRestartInstance:{Raw:} AfterRestartInstance:{Raw:}} CleanupData:false CleanupLog:false CleanupAuditLog:false RetainDataRoles:[] RetainDataNodes:[] DisplayMode:default Operation:StartOperation}
Stopping component dm-worker
      Stopping instance 172.20.12.53
      Stop dm-worker 172.20.12.53:18262 success
Destroying component dm-worker
      Destroying instance 172.20.12.53
Destroy 172.20.12.53 finished
- Destroy dm-worker paths: [/data1/dm-deploy/dm-worker-18262 /etc/systemd/system/dm-worker-18262.service /data1/tidb-data/dm-worker-18262 /data1/dm-deploy/dm-worker-18262/log]
+ [ Serial ] - UpdateMeta: cluster=paul_dm, deleted=`'172.20.12.53:18262'`
+ Refresh instance configs
- Generate config dm-master -> 172.20.12.52:18261 ... Done
- Generate config dm-master -> 172.20.12.53:18261 ... Done
- Generate config dm-master -> 172.20.12.70:18261 ... Done
- Generate config dm-worker -> 172.20.12.52:18262 ... Done
- Generate config dm-worker -> 172.20.12.70:18262 ... Done
- Generate config prometheus -> 172.20.12.53:19999 ... Done
- Generate config grafana -> 172.20.12.53:19998 ... Done
- Generate config alertmanager -> 172.20.12.53:19997 ... Done
+ Reload prometheus and grafana
- Reload prometheus -> 172.20.12.53:19999 ... Done
- Reload grafana -> 172.20.12.53:19998 ... Done
Scaled cluster `paul_dm` in successfully



扩容work节点

[tidb@tidb53 paul]$ cat dm_scale.yaml 
worker_servers:
- host: 172.20.12.53
  ssh_port: 22
  port: 18262
  deploy_dir: "/data1/dm-deploy/dm-worker-18262"
  log_dir: "/data1/dm-deploy/dm-worker-18262/log"
  config:
    log-level: info

[tidb@tidb53 paul]$ tiup dm scale-out paul_dm dm_scale.yaml
Checking updates for component dm... Timedout (after 2s)
Starting component dm: /home/tidb/.tiup/components/dm/v1.14.1/tiup-dm scale-out paul_dm dm_scale.yaml

+ Detect CPU Arch Name
- Detecting node 172.20.12.53 Arch info ... Done

+ Detect CPU OS Name
- Detecting node 172.20.12.53 OS info ... Done
Please confirm your topology:
Cluster type:   dm
Cluster name:   paul_dm
Cluster version: v6.5.1
Role       Host         Ports OS/Arch       Directories
----       ----         ----- -------       -----------
dm-worker 172.20.12.53 18262 linux/x86_64 /data1/dm-deploy/dm-worker-18262,/data1/tidb-data/dm-worker-18262
Attention:
  1. If the topology is not what you expected, check your yaml file.
  2. Please confirm there is no port/directory conflicts in same host.
Do you want to continue? [y/N]: (default=N) y
+ [ Serial ] - SSHKeySet: privateKey=/home/tidb/.tiup/storage/dm/clusters/paul_dm/ssh/id_rsa, publicKey=/home/tidb/.tiup/storage/dm/clusters/paul_dm/ssh/id_rsa.pub
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.70
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.52
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.52
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.70
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ [Parallel] - UserSSH: user=tidb, host=172.20.12.53
+ Download TiDB components
- Download dm-worker:v6.5.1 (linux/amd64) ... Done
+ Initialize target host environments
+ Deploy TiDB instance
- Deploy instance dm-worker -> 172.20.12.53:18262 ... Done
+ Copy certificate to remote host
+ Generate scale-out config
- Generate scale-out config dm-worker -> 172.20.12.53:18262 ... Done
+ Init monitor config
Enabling component dm-worker
      Enabling instance 172.20.12.53:18262
      Enable instance 172.20.12.53:18262 success
+ [ Serial ] - Save meta
+ [ Serial ] - Start new instances
Starting component dm-worker
      Starting instance 172.20.12.53:18262
      Start instance 172.20.12.53:18262 success
+ Refresh components conifgs
- Generate config dm-master -> 172.20.12.52:18261 ... Done
- Generate config dm-master -> 172.20.12.53:18261 ... Done
- Generate config dm-master -> 172.20.12.70:18261 ... Done
- Generate config dm-worker -> 172.20.12.52:18262 ... Done
- Generate config dm-worker -> 172.20.12.70:18262 ... Done
- Generate config dm-worker -> 172.20.12.53:18262 ... Done
- Generate config prometheus -> 172.20.12.53:19999 ... Done
- Generate config grafana -> 172.20.12.53:19998 ... Done
- Generate config alertmanager -> 172.20.12.53:19997 ... Done
+ Reload prometheus and grafana
- Reload prometheus -> 172.20.12.53:19999 ... Done
- Reload grafana -> 172.20.12.53:19998 ... Done
Scaled cluster `paul_dm` out successfully