使用 DM binary 部署 DM 集群

本文将介绍如何使用 DM binary 快速部署 DM 集群。

准备工作

下载官方 binary,链接地址:DM 下载

下载的文件中包括子目录 bin 和 conf。bin 目录下包含 dm-master、dm-worker、dmctl 以及 Mydumper 的二进制文件。conf 目录下有相关的示例配置文件。

使用样例

假设在两台服务器上部署 MySQL,在一台服务器上部署 TiDB(mocktikv 模式),另外在三台服务器上部署两个 DM-worker 实例和一个 DM-master 实例。各个节点的信息如下:

实例 服务器地址
MySQL1 192.168.0.1
MySQL2 192.168.0.2
TiDB 192.168.0.3
DM-master 192.168.0.4
DM-worker1 192.168.0.5
DM-worker2 192.168.0.6

MySQL1 和 MySQL2 中需要开启 binlog。DM-worker1 负责同步 MySQL1 的数据,DM-worker2 负责同步 MySQL2 的数据。下面以此为例,说明如何部署 DM。

DM-worker 的部署

DM-worker 需要连接上游 MySQL,且为了安全,强制用户配置加密后的密码。首先使用 dmctl 对 MySQL 的密码进行加密,以密码为 “123456” 为例:

  1. ./bin/dmctl --encrypt "123456"
  1. fCxfQ9XKCezSzuCD0Wf5dUD+LsKegSg=

记录该加密后的值,用于下面部署 DM-worker 时的配置。

DM-worker 提供命令行参数和配置文件两种配置方式。

配置方式 1:命令行参数

查看 DM-worker 的命令行参数说明:

  1. ./bin/dm-worker --help
  1. Usage of worker:
  2. -L string
  3. 日志等级,值可以为 "debug""info""warn""error" 或者 "fatal"(默认值:"info"
  4. -V 输出版本信息
  5. -checker-backoff-max duration
  6. 任务检查模块中,检查出错误后等待自动恢复的最长时间间隔(默认值:"5m0s",一般情况下不需要修改。如果对该参数的作用没有深入的了解,不建议修改该参数)
  7. -checker-backoff-rollback duration
  8. 任务检查模块中,调整自动恢复等待时间的间隔(默认值:"5m0s",一般情况下不需要修改,如果对该参数的作用没有深入的了解,不建议修改该参数)
  9. -checker-check-enable
  10. 是否开启任务状态检查。开启后 DM 会尝试自动恢复因错误而暂停的数据同步任务(默认值:true
  11. -config string
  12. 配置文件的路径
  13. -log-file string
  14. 日志文件的路径
  15. -print-sample-config
  16. 打印示例配置
  17. -purge-expires int
  18. relay log 的过期时间。DM-worker 会尝试自动删除最后修改时间超过了过期时间的 relay log(单位:小时)
  19. -purge-interval int
  20. 定期检查 relay log 是否过期的间隔时间(默认值:3600)(单位:秒)
  21. -purge-remain-space int
  22. 设置最小的可用磁盘空间。当磁盘可用空间小于这个值时,DM-worker 会尝试删除 relay log(默认值:15)(单位:GB
  23. -relay-dir string
  24. 存储 relay log 的路径(默认值:"./relay_log"
  25. -worker-addr string
  26. DM-worker 的地址

注意:

某些情况下,无法使用命令行参数的方法来配置 DM-worker,因为有的配置并未暴露给命令行。

配置方式 2:配置文件

推荐使用配置文件来配置 DM-worker,把以下配置文件内容写入到 conf/dm-worker1.toml 中。

DM-worker 的配置文件:

  1. # Worker Configuration.
  2. # 日志配置
  3. log-level = "info"
  4. log-file = "dm-worker.log"
  5. # DM-worker 的地址
  6. worker-addr = ":8262"
  7. # 作为 MySQL slave 的 server ID,用于获取 MySQL 的 binlog
  8. # 在一个 replication group 中,每个实例(master 和 slave)都应该有唯一的 server ID
  9. # v1.0.2 及以上版本的 DM 会自动生成,不需要手动配置
  10. server-id = 101
  11. # 用于标识一个 replication group 或者 MySQL/MariaDB 实例
  12. source-id = "mysql-replica-01"
  13. # 上游实例类型,值可为 "mysql" 或者 "mariadb"
  14. # v1.0.2 及以上版本的 DM 会自动识别上游实例类型,不需要手动配置
  15. flavor = "mysql"
  16. # MySQL 的连接地址
  17. [from]
  18. host = "192.168.0.1"
  19. user = "root"
  20. password = "fCxfQ9XKCezSzuCD0Wf5dUD+LsKegSg="
  21. port = 3306

在终端中使用下面的命令运行 DM-worker:

  1. bin/dm-worker -config conf/dm-worker1.toml

对于 DM-worker2,修改配置文件中的 source-idmysql-replica-02,并将 from 配置部分修改为 MySQL2 的地址即可。如果因为没有多余的机器,将 DM-worker2 与 DM-worker1 部署在一台机器上,需要把两个 DM-worker 实例部署在不同的路径下,否则保存元信息和 relay log 的默认路径会冲突。

DM-master 的部署

DM-master 提供命令行参数和配置文件两种配置方式。

配置方式 1:命令行参数

DM-master 的命令行参数说明:

  1. ./bin/dm-master --help
  1. Usage of dm-master:
  2. -L string
  3. 日志等级,值可以为 "debug""info""warn""error" 或者 "fatal"(默认值为 "info"
  4. -V 输出版本信息
  5. -config string
  6. 配置文件的路径
  7. -log-file string
  8. 日志文件的路径
  9. -master-addr string
  10. DM-master 的地址
  11. -print-sample-config
  12. 打印出 DM-master 的示例配置

注意:

某些情况下,无法使用命令行参数的方法来配置 DM-worker,因为有的配置并未暴露给命令行。

配置方式 2:配置文件

推荐使用配置文件,把以下配置文件内容写入到 conf/dm-master.toml 中。

DM-master 的配置文件:

  1. # Master Configuration.
  2. # 日志配置
  3. log-level = "info"
  4. log-file = "dm-master.log"
  5. # DM-master 监听地址
  6. master-addr = ":8261"
  7. # DM-Worker 的配置
  8. [[deploy]]
  9. # 对应 DM-worker1 配置文件中的 source-id
  10. source-id = "mysql-replica-01"
  11. # DM-worker1 的服务地址
  12. dm-worker = "192.168.0.5:8262"
  13. [[deploy]]
  14. # 对应 DM-worker2 配置文件中的 source-id
  15. source-id = "mysql-replica-02"
  16. # DM-worker2 的服务地址
  17. dm-worker = "192.168.0.6:8262"

在终端中使用下面的命令运行 DM-master:

  1. bin/dm-master -config conf/dm-master.toml

这样,DM 集群就部署成功了。下面创建简单的数据同步任务来使用 DM 集群。

创建数据同步任务

假设在 MySQL1 和 MySQL2 实例中有若干个分表,这些分表的结构相同,所在库的名称都以 “sharding” 开头,表名称都以 “t” 开头,并且主键或唯一键不存在冲突(即每张分表的主键或唯一键各不相同)。现在需要把这些分表同步到 TiDB 中的 db_target.t_target 表中。

首先创建任务的配置文件:

  1. ---
  2. name: test
  3. task-mode: all
  4. is-sharding: true
  5. target-database:
  6. host: "192.168.0.3"
  7. port: 4000
  8. user: "root"
  9. password: "" # 如果密码不为空,也需要配置 dmctl 加密后的密码
  10. mysql-instances:
  11. - source-id: "mysql-replica-01"
  12. black-white-list: "instance"
  13. route-rules: ["sharding-route-rules-table", "sharding-route-rules-schema"]
  14. mydumper-thread: 4 # mydumper 用于导出数据的线程数量,在 v1.0.2 版本引入
  15. loader-thread: 16 # loader 用于导入数据的线程数量,在 v1.0.2 版本引入
  16. syncer-thread: 16 # syncer 用于同步增量数据的线程数量,在 v1.0.2 版本引入
  17. - source-id: "mysql-replica-02"
  18. black-white-list: "instance"
  19. route-rules: ["sharding-route-rules-table", "sharding-route-rules-schema"]
  20. mydumper-thread: 4 # mydumper 用于导出数据的线程数量,在 v1.0.2 版本引入
  21. loader-thread: 16 # loader 用于导入数据的线程数量,在 v1.0.2 版本引入
  22. syncer-thread: 16 # syncer 用于同步增量数据的线程数量,在 v1.0.2 版本引入
  23. black-white-list:
  24. instance:
  25. do-dbs: ["~^sharding[\\d]+"]
  26. do-tables:
  27. - db-name: "~^sharding[\\d]+"
  28. tbl-name: "~^t[\\d]+"
  29. routes:
  30. sharding-route-rules-table:
  31. schema-pattern: sharding*
  32. table-pattern: t*
  33. target-schema: db_target
  34. target-table: t_target
  35. sharding-route-rules-schema:
  36. schema-pattern: sharding*
  37. target-schema: db_target

将以上配置内容写入到 conf/task.yaml 文件中,使用 dmctl 创建任务:

  1. bin/dmctl -master-addr 192.168.0.4:8261
  1. Welcome to dmctl
  2. Release Version: v1.0.0-69-g5134ad1
  3. Git Commit Hash: 5134ad19fbf6c57da0c7af548f5ca2a890bddbe4
  4. Git Branch: master
  5. UTC Build Time: 2019-04-29 09:36:42
  6. Go Version: go version go1.12 linux/amd64
  7. »
  1. » start-task conf/task.yaml
  1. {
  2. "result": true,
  3. "msg": "",
  4. "workers": [
  5. {
  6. "result": true,
  7. "worker": "192.168.0.5:8262",
  8. "msg": ""
  9. },
  10. {
  11. "result": true,
  12. "worker": "192.168.0.6:8262",
  13. "msg": ""
  14. }
  15. ]
  16. }

这样就成功创建了一个将 MySQL1 和 MySQL2 实例中的分表数据同步到 TiDB 的任务。