dm server 同步(全量+增量)mysql数据到tidb

张映 发表于 2020-12-31

分类目录: tidb

标签:, , ,

为啥要把mysql数据同步到tidb呢?

现有mysql的读写分离,也能满足oltp和olap的需求,但是因mysql不支持横向扩展,随着数据量的增加,越来越慢是迟早的事情。

因tidb是小众数据库,也不太敢冒然从mysql迁到tidb,所以就想把tidb做mysql的从库之一,以检测tidb的性能与稳定性。

一,安装 TiUP DM 组件

安装dm组件的前提是要安装tiup工具,这个在安装tidb cluster的时候,就已经说过了。

$ tiup install dm

二,初始化dm集群文件dm.yaml

$ cat dm.yaml
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/home/tidb/dm/deploy"
  data_dir: "/home/tidb/dm/data"

master_servers:
  - host: 10.0.10.18
worker_servers:
  - host: 10.0.10.15
  - host: 10.0.10.16

注意:

1,tidb cluster监控和dm server监控,不要安装在同一台机器上, 也就是说monitoring_servers,grafana_servers,alertmanager_servers不要安装在同一台机器上。dm server监控,可以不装。

2,如果tidb cluster监控和dm server监控非要装在同一台机器上,monitoring_servers,grafana_servers,alertmanager_servers端口一定不要重复,一定不要重复,一定不要重复。如果重复,二个监控只能启动一个。

三,选择dm server版本

[tidb@jiankong task]$ tiup list dm-master
Available versions for dm-master:
Version      Installed  Release                    Platforms
-------      ---------  -------                    ---------
nightly                 2020-12-31T08:17:40+08:00  linux/amd64,linux/arm64
v2.0.0-rc               2020-08-21T17:49:08+08:00  linux/amd64,linux/arm64
v2.0.0-rc.2             2020-09-01T20:51:29+08:00  linux/amd64,linux/arm64
v2.0.0                  2020-10-30T16:10:58+08:00  linux/amd64,linux/arm64
v2.0.1                  2020-12-25T13:22:29+08:00  linux/amd64,linux/arm64

不要选v2.0.0,这个版本有bug,task任务停止后起不来,这个bug在v2.0.1的时候修复了。
不要选v2.0.0,这个版本有bug,task任务停止后起不来,这个bug在v2.0.1的时候修复了。
不要选v2.0.0,这个版本有bug,task任务停止后起不来,这个bug在v2.0.1的时候修复了。

四,安装并启动dm server

[tidb@jiankong yaml]$ tiup dm deploy dm_m2t v2.0.1 ./dm.yaml --user tidb  //安装

[tidb@jiankong task]$ tiup dm list  //查看dm集群列表
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.3.0/tiup-dm list
Name    User  Version  Path                                         PrivateKey
----    ----  -------  ----                                         ----------
dm_m2t  tidb  v2.0.1   /home/tidb/.tiup/storage/dm/clusters/dm_m2t  /home/tidb/.tiup/storage/dm/clusters/dm_m2t/ssh/id_rsa

[tidb@jiankong yaml]$ tiup dm start dm_m2t  //启动某个dm集群

[tidb@jiankong yaml]$ tiup dm display dm_m2t  //查看某个dm集群状态
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.3.0/tiup-dm display dm_m2t
Cluster type:    dm
Cluster name:    dm_m2t
Cluster version: v2.0.1
SSH type:        builtin
ID               Role          Host        Ports      OS/Arch       Status     Data Dir                              Deploy Dir
--               ----          ----        -----      -------       ------     --------                              ----------
10.0.10.18:8261  dm-master     10.0.10.18  8261/8291  linux/x86_64  Healthy|L  /home/tidb/dm/data/dm-master-8261     /home/tidb/dm/deploy/dm-master-8261
10.0.10.15:8262  dm-worker     10.0.10.15  8262       linux/x86_64  Free       /home/tidb/dm/data/dm-worker-8262     /home/tidb/dm/deploy/dm-worker-8262
10.0.10.16:8262  dm-worker     10.0.10.16  8262       linux/x86_64  Free       /home/tidb/dm/data/dm-worker-8262     /home/tidb/dm/deploy/dm-worker-8262
Total nodes: 3

在这里要注意dm-worker的status,
如果只有一个master的情况,mysql源必须是小于等于dm-worker的数量。
如果是多个master(奇数个),mysql源必须是小于dm-worker的数量。
如果加入了mysql源的话,status状态会由Free变成Bound

五,创建数据源

1,安装dmctl工具

[tidb@jiankong task]$ tiup install dmctl
download https://tiup-mirrors.pingcap.com/dmctl-v2.0.1-linux-amd64.tar.gz 26.13 MiB / 26.13 MiB 100.00% 45.58 MiB p/s

2,创建mysql source文件

# cat mysql57.yaml

source-id: "mysql57"
enable-gtid: false  //mysql主从,没有开启gtid,所以这里关闭

from:
 host: "10.0.20.57"
 port: 3306
 user: "test"
 password: "Gm20P/STggIv1vEjkl5Vq0DZQw==" //加密密码,可明文

3,加密方法

[tidb@jiankong yaml]$ tiup dmctl --encrypt aa  //aa加密
Starting component `dmctl`: /home/tidb/.tiup/components/dmctl/v2.0.1/dmctl/dmctl --encrypt aa
Gm20P/STggIv1vEjkl5Vq0DZQw==

4,加入mysql同步源

[tidb@jiankong conf]$ tiup dmctl --master-addr 10.0.10.18:8261 operate-source create mysql57.yaml //加入源
Starting component `dmctl`: /home/tidb/.tiup/components/dmctl/v2.0.1/dmctl/dmctl --master-addr 10.0.10.18:8261 operate-source create mysql57.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql57",
            "worker": "dm-10.0.10.15-8262"
        }
    ]
}

[tidb@jiankong task]$ tiup dm display dm_m2t  //15 dm-worker变成了bound
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.3.0/tiup-dm display dm_m2t
Cluster type:    dm
Cluster name:    dm_m2t
Cluster version: v2.0.1
SSH type:        builtin
ID               Role       Host        Ports      OS/Arch       Status     Data Dir                           Deploy Dir
--               ----       ----        -----      -------       ------     --------                           ----------
10.0.10.18:8261  dm-master  10.0.10.18  8261/8291  linux/x86_64  Healthy|L  /home/tidb/dm/data/dm-master-8261  /home/tidb/dm/deploy/dm-master-8261
10.0.10.15:8262  dm-worker  10.0.10.15  8262       linux/x86_64  Bound      /home/tidb/dm/data/dm-worker-8262  /home/tidb/dm/deploy/dm-worker-8262
10.0.10.16:8262  dm-worker  10.0.10.16  8262       linux/x86_64  Free       /home/tidb/dm/data/dm-worker-8262  /home/tidb/dm/deploy/dm-worker-8262
Total nodes: 3

dm server的数据源是不能删除的,如果改了配置可以更新数据源。

[tidb@jiankong conf]$ tiup dmctl --master-addr 10.0.10.18:8261 operate-source update mysql57.yaml

六,创建task,启动任务

1,创建mysql57-task.yaml

[tidb@jiankong task]$ cat mysql57-task.yaml
name: mysql57-task
task-mode: all
case-sensitive: true
clean-dump-file: true

target-database:
  host: "10.0.10.18"
  port: 4000
  user: "root"
  password: "**************"

mysql-instances:
  -
    source-id: "mysql57"  //源的id要对上
    block-allow-list:  "instance"
    mydumper-thread: 4
    loader-thread: 16
    syncer-thread: 16

block-allow-list:
  instance:
    do-dbs: ["tank","test"]
    ignore-dbs: ["mysql", "sys", "information_schema", "performance_schema"]

2,检查task任务

[tidb@jiankong task]$ tiup dmctl --master-addr 10.0.10.18:8261 check-task ./mysql57-task.yaml
Starting component `dmctl`: /home/tidb/.tiup/components/dmctl/v2.0.1/dmctl/dmctl --master-addr 10.0.10.18:8261 check-task ./mysql57-task.yaml
{
    "result": true,
    "msg": "check pass!!!"
}

如果出现check pass就说明check通过了

3,全配置说明

// ----------- 全局配置 -----------
// ********* 基本信息配置 *********
name: test                      // 任务名称,需要全局唯一
task-mode: all                  // 任务模式,可设为 "full"、"incremental"、"all"
shard-mode: "pessimistic"       // 如果为分库分表合并任务则需要配置该项。默认使用悲观协调模式 "pessimistic",在深入了解乐观协调模式的原理和使用限制后,也可以设置为乐观协调模式 "optimistic"
meta-schema: "dm_meta"          // 下游储存 `meta` 信息的数据库
timezone: "Asia/Shanghai"       // 时区
case-sensitive: false           // schema/table 是否大小写敏感
online-ddl-scheme: "gh-ost"     // 目前仅支持 "gh-ost" 、"pt"
ignore-checking-items: []       // 不关闭任何检查项。可选的检查项有 "all"、"dump_privilege"、"replication_privilege"、"version"、"binlog_enable"、"binlog_format"、"binlog_row_image"、"table_schema"、"schema_of_shard_tables"、"auto_increment_ID"
clean-dump-file: true           // 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件

target-database:                // 下游数据库实例配置
  host: "192.168.0.1"
  port: 4000
  user: "root"
  password: "/Q7B9DizNLLTTfiZHv9WoEAKamfpIUs="  // 推荐使用经 dmctl 加密后的密码
  max-allowed-packet: 67108864                  // 设置 DM 内部连接 TiDB 服务器时,TiDB 客户端的 "max_allowed_packet" 限制(即接受的最大数据包限制),单位为字节,默认 67108864 (64 MB)
                                                // 该配置项从 DM v2.0.0 版本起弃用,DM 会自动获取连接 TiDB 的 "max_allowed_packet"
  session:                                      // 设置 TiDB 的 session 变量,在 v1.0.6 版本引入。更多变量及解释参见 `https://docs.pingcap.com/zh/tidb/stable/system-variables`
    sql_mode: "ANSI_QUOTES,NO_ZERO_IN_DATE,NO_ZERO_DATE" // 从 DM v2.0.0 版本起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "sql_mode" 的值。手动配置该项具有更高优先级
    tidb_skip_utf8_check: 1                              // 从 DM v2.0.0 版本起,如果配置文件中没有出现该项,DM 会自动从下游 TiDB 中获得适合用于 "tidb_skip_utf8_check" 的值。手动配置该项具有更高优先级
    tidb_constraint_check_in_place: 0
  security:                       // 下游 TiDB TLS 相关配置
    ssl-ca: "/path/to/ca.pem"
    ssl-cert: "/path/to/cert.pem"
    ssl-key: "/path/to/key.pem"

// ******** 功能配置集 **********

routes:                           // 上游和下游表之间的路由 table routing 规则集
  route-rule-1:                   // 配置名称
    schema-pattern: "test_*"      // 库名匹配规则,支持通配符 "*" 和 "?"
    table-pattern: "t_*"          // 表名匹配规则,支持通配符 "*" 和 "?"
    target-schema: "test"         // 目标库名称
    target-table: "t"             // 目标表名称
  route-rule-2:
    schema-pattern: "test_*"
    target-schema: "test"

filters:                                        // 上游数据库实例匹配的表的 binlog event filter 规则集
  filter-rule-1:                                // 配置名称
    schema-pattern: "test_*"                    // 库名匹配规则,支持通配符 "*" 和 "?"
    table-pattern: "t_*"                        // 表名匹配规则,支持通配符 "*" 和 "?"
    events: ["truncate table", "drop table"]    // 匹配哪些 event 类型
    action: Ignore                              // 对与符合匹配规则的 binlog 迁移(Do)还是忽略(Ignore)
  filter-rule-2:
    schema-pattern: "test_*"
    events: ["all dml"]
    action: Do

block-allow-list:                    // 上游数据库实例匹配的表的 block-allow-list 过滤规则集,如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list
  bw-rule-1:                         // 配置名称
    do-dbs: ["~^test.*", "user"]     // 迁移哪些库
    ignore-dbs: ["mysql", "account"] // 忽略哪些库
    do-tables:                       // 迁移哪些表
    - db-name: "~^test.*"
      tbl-name: "~^t.*"
    - db-name: "user"
      tbl-name: "information"
    ignore-tables:                   // 忽略哪些表
    - db-name: "user"
      tbl-name: "log"

mydumpers:                           // dump 处理单元的运行配置参数
  global:                            // 配置名称
    threads: 4                       // dump 处理单元从上游数据库实例导出数据的线程数量,默认值为 4
    chunk-filesize: 64               // dump 处理单元生成的数据文件大小,默认值为 64,单位为 MB
    skip-tz-utc: true                // 忽略对时间类型数据进行时区转化,默认值为 true
    extra-args: "--consistency none" // dump 处理单元的其他参数,不需要在 extra-args 中配置 table-list,DM 会自动生成

loaders:                             // load 处理单元的运行配置参数
  global:                            // 配置名称
    pool-size: 16                    // load 处理单元并发执行 dump 处理单元的 SQL 文件的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
    dir: "./dumped_data"             // dump 处理单元输出 SQL 文件的目录,同时也是 load 处理单元读取文件的目录。该配置项的默认值为 "./dumped_data"。同实例对应的不同任务必须配置不同的目录

syncers:                             // sync 处理单元的运行配置参数
  global:                            // 配置名称
    worker-count: 16                 // sync 并发迁移 binlog event 的线程数量,默认值为 16,当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
    batch: 100                       // sync 迁移到下游数据库的一个事务批次 SQL 语句数,默认值为 100
    enable-ansi-quotes: true         // 若 `session` 中设置 `sql-mode: "ANSI_QUOTES"`,则需开启此项
    safe-mode: false                 // 设置为 true,则将来自上游的 `INSERT` 改写为 `REPLACE`,将 `UPDATE` 改写为 `DELETE` 与 `REPLACE`,保证在表结构中存在主键或唯一索引的条件下迁移数据时可以重复导入 DML。在启动或恢复增量复制任务的前 5 分钟内 TiDB DM 会自动启动 safe mode

// ----------- 实例配置 -----------
mysql-instances:
  -
    source-id: "mysql-replica-01"           // 对应 source.toml 中的 `source-id`
    meta:                                   // `task-mode` 为 `incremental` 且下游数据库的 `checkpoint` 不存在时 binlog 迁移开始的位置; 如果 checkpoint 存在,则以 `checkpoint` 为准
      binlog-name: binlog.000001
      binlog-pos: 4
      binlog-gtid: "03fc0263-28c7-11e7-a653-6c0b84d59f30:1-7041423,05474d3c-28c7-11e7-8352-203db246dd3d:1-170"  // 对于 source 中指定了 `enable-gtid: true` 的增量任务,需要指定该值

    route-rules: ["route-rule-1", "route-rule-2"]  // 该上游数据库实例匹配的表到下游数据库的 table routing 规则名称
    filter-rules: ["filter-rule-1"]                // 该上游数据库实例匹配的表的 binlog event filter 规则名称
    block-allow-list:  "bw-rule-1"                 // 该上游数据库实例匹配的表的 block-allow-list 过滤规则名称,如果 DM 版本 <= v2.0.0-beta.2 则使用 black-white-list

    mydumper-config-name: "global"          // mydumpers 配置的名称
    loader-config-name: "global"            // loaders 配置的名称
    syncer-config-name: "global"            // syncers 配置的名称

  -
    source-id: "mysql-replica-02"  // 对应 source.toml 中的 `source-id`
    mydumper-thread: 4             // dump 处理单元用于导出数据的线程数量,等同于 mydumpers 配置中的 `threads`,当同时指定它们时 `mydumper-thread` 优先级更高
    loader-thread: 16              // load 处理单元用于导入数据的线程数量,等同于 loaders 配置中的 `pool-size`,当同时指定它们时 `loader-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值
    syncer-thread: 16              // sync 处理单元用于复制增量数据的线程数量,等同于 syncers 配置中的 `worker-count`,当同时指定它们时 `syncer-thread` 优先级更高。当有多个实例同时向 TiDB 迁移数据时可根据负载情况适当调小该值

4,启动任务

$ tiup dmctl --master-addr 10.0.10.18:8261 start-task ./mysql57-task.yaml //启动和重启都是他
$ tiup dmctl --master-addr 10.0.10.18:8261 query-status mysql57-task //查看状态
$ tiup dmctl --master-addr 10.0.10.18:8261 stop-task mysql57-task //停止

dmctl task的状态很多,自行看help

七,dm v2.0.0 task bug复现与解决

1,复现bug

tiup dmctl 停止task,然后重启tidb cluster,重启完成后,tiup dmctl start-task,resume-task,或者query-status全部报错,几个报错如下:

"[code=46014:class=scheduler:scope=internal:level=medium], Message: subtasks with name mysql57-task for sources [mysql57] already exist, Workaround: Please use `query-status` command to see tasks.",

"msg": "[code=38008:class=dm-master:scope=internal:level=high], Message: grpc request error, RawCause: rpc error: code = DeadlineExceeded desc = context deadline exceeded",

"msg": "[code=38032:class=dm-master:scope=internal:level=high], Message: some error occurs in dm-worker: ErrCode:10001 ErrClass:\"database\" ErrScope:\"downstream\" ErrLevel:\"high\" Message:\"fail to initial unit Sync of subtask mysql57-task : database driver error\" RawCause:\"context deadline exceeded\" Workaround:\"Please check the database connection and the database config in configuration file.\" , Workaround: Please execute `query-status` to check status.",

dm server 启动task失败

dm server 启动task失败

2,解决办法

$ tiup dm upgrade dm_m2t nightly  //dm v2.0.0升级到dm nightly

$ tiup dm list
Starting component `dm`: /home/tidb/.tiup/components/dm/v1.3.0/tiup-dm list
Name    User  Version  Path                                         PrivateKey
----    ----  -------  ----                                         ----------
dm_m2t  tidb  nightly  /home/tidb/.tiup/storage/dm/clusters/dm_m2t  /home/tidb/.tiup/storage/dm/clusters/dm_m2t/ssh/id_rsa

# tiup dmctl --master-addr 10.0.10.18:8261 resume-task mysql57-task
升级dm server v2.0.0 到 nightly

升级dm server v2.0.0 到 nightly

dm server 重启task成功

dm server 重启task成功



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/tidb/2472.html