暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

体验TiDB V6.0.0 之TiDB的数据迁移工具DM-WebUI

边城元元 2022-05-05
1250

作者:边城元元

原文来源:https://tidb.net/blog/87a38392

体验DM-WebUI

一、背景

DM 是一款便捷的数据迁移工具,支持从与 MySQL 协议兼容的数据库到 TiDB 的全量数据迁移和增量数据同步。 ​ TiDB v6.0.0 之前,使用DM做数据迁移方式是通过dmctl和配置文件方式,对命令和配置不熟悉的tidber不是很方便。在TiDB v6.0.0 发布同时发布了DM的可视化管理工具WebUI。真心感觉TiDB越来越好用,更加强大,迫不及待的体验一把。

二、DM准备条件

2.1 了解DM

2.1.1 DM组成

  • DM 主要包括三个组件:DM-master,DM-worker 和 dmctl。

  • TiDBV6.0.0 增加了WebUI可视化管理(http\://{master_ip}:{master_port}/dashboard/

  • 组件说明:

1、DM-master

DM-master 负责管理和调度数据迁移任务的各项操作。

  • 保存 DM 集群的拓扑信息
  • 监控 DM-worker 进程的运行状态
  • 控数据迁移任务的运行状态
  • 提供数据迁移任务管理的统一入口
  • 协调分库分表场景下各个实例分表的 DDL 迁移

2、DM-worker

DM-worker 负责执行具体的数据迁移任务。

  • 将 binlog 数据持久化保存在本地
  • 保存数据迁移子任务的配置信息
  • 编排数据迁移子任务的运行
  • 监控数据迁移子任务的运行状态

3、dmctl

dmctl 是用来控制 DM 集群的命令行工具。

  • 创建、更新或删除数据迁移任务
  • 查看数据迁移任务状态
  • 处理数据迁移任务错误
  • 校验数据迁移任务配置的正确性

4、WebUI

DM可视化管理

2.1.2 Data Migration 架构

image.png

1、可以从 DM 集群的任意 master 节点访问 DM WebUI,访问端口与 DM OpenAPI 保持一致,默认为 8261。访问地址示例:http://{master_ip}:{master_port}/dashboard/

2.2 使用DM的前提条件

2.2.1 MySQL 协议兼容的数据库

  • MySQL 版本>5.5

  • 表结构的兼容性

  • 检查上游表是否设置了外键。TiDB 不支持外键,如果上游表设置了外键,则返回警告。

  • (必须)检查字符集是否存在兼容性差异,详见 TiDB 支持的字符集
  • (必须)检查上游表中是否存在主键或唯一键约束(从 v1.0.7 版本引入)。

2.2.2 TiDB的存储空间

TiKV总节点要有足够的空间(应大于上游数据源的大小×副本数×2)

为什么×2呢?这里主要考虑到下面两个方面:

  • 索引会占据额外的空间
  • RocksDB 的空间放大效应

2.2.3 开启WebUI的配置

为确保 DM WebUI 能正常显示,在使用 DM WebUI 前,确保以下操作或配置已完成:

  • 1、开启 DM OpenAPI 配置: 1)如果你的 DM 集群是通过二进制方式部署的,在该 master 节点的配置中开启 openapi 配置项: openapi = true 2)如果你的 DM 集群是通过 TiUP 部署的,在拓扑文件中添加如下配置:

server_configs: master:   openapi: true

3)已经安装好的dm集群

tiup-dm edit-config <dm-clustername> tiup-dm reload <dm-clustername> -N <dm-master>

  • 2、首次部署 Grafana 时,已正确安装监控相关组件:monitoring_servers 和 grafana_servers。grafana_servers 须按如下进行配置:

grafana_servers: ​  - host: 10.0.1.14    # port: 3000    # deploy_dir: /tidb-deploy/grafana-3000   config:       # 请确保执行 tiup dm -v 的 TiUP 版本在 v1.9.0 及以上     auth.anonymous.enabled: true     security.allow_embedding: true

  • 若 grafana_servers 使用了非默认的 IP 和端口,则需要在 WebUI 的 Dashboard 界面填写正确的 IP 和端口。

三、DM演练说明

本次实验室从 mysql3306->tib4000的演示

3.1 演练说明

本次演练从mysql 3306单实例 迁移到

image.png

3.2 上游数据源Mysql3306

3.2.1 上游mysql数据库 test-dm

image.png

3.2.2 my.ini配置

```

开启gtid

gtid_mode=on enforce_gtid_consistency=on

开启binlog

log_bin=on binlog_format=row

开启binlog日志记录数据库的二进制日志

binlog_ignore_db=mysql binlog_do_db=test-dm ​ ```

3.2.3 GTID

1、如果上游源数据库存在主从切换,请务必在上游 MySQL 开启 GTID,并在创建上游配置时将 GTID 设为 True,否则数据迁移任务将在主从切换时中断(AWS Aurora 除外);

3.2.4 Relay log

1、当多个迁移任务使用同一个上游时,可能对其造成额外压力。建议开启 relay log 可降低对上游的影响。

2、DM-worker 在运行过程中,会将上游 binlog 实时迁移到本地文件。DM-worker 的 sync 处理单元会实时读取本地 relay log 的 binlog 事件,将这些事件转换为 SQL 语句,再将 SQL 语句迁移到下游数据库。

3、在启用 relay log 功能后,DM-worker 会自动将上游 binlog 迁移到本地配置目录(若使用 TiUP 部署 DM,则迁移目录默认为 <deploy_dir> / <relay_log>)。自 v5.4.0 版本起,你可以在 DM-worker 配置文件中通过 relay-dir 配置本地配置目录,其优先级高于上游数据库的配置文件。

3.2.5 验证上游数据库

```

检测是否开启binlog

log_bin=on

binlog_format=row

show variables like '%binlog%'

开启gtid

gtid_mode=on

enforce_gtid_consistency=on

show variables like '%gtid%' ​ ```

3.3 tidb集群cluster111

3.3.1 cluster111 拓扑

https://tidb.net/blog/af8080f7#cluster111

```

cluster111.yml

global: user: "tidb" ssh_port: 22 deploy_dir: "/tidb-deploy111" data_dir: "/tidb-data111" server_configs: tidb:   log.slow-threshold: 300 tikv:   readpool.storage.use-unified-pool: false   readpool.coprocessor.use-unified-pool: true pd:   replication.max-replicas: 1 pd_servers: - host: 10.0.2.15   client_port: 2379 #注意与tidb-server,tikv的key不一样   peer_port: 2380 #注意与tidb-server,tikv的key不一样 tidb_servers: - host: 10.0.2.15   port: 4000   status_port: 10080 tikv_servers: - host: 10.0.2.15   port: 20160   status_port: 20180  

监控

monitoring_servers: - host: 10.0.2.15 grafana_servers: - host: 10.0.2.15   config:       # Enable this part if you want to use WebUI, make sure tiup dm -v newer than v1.9.0.     auth.anonymous.enabled: true     security.allow_embedding: true alertmanager_servers: - host: 10.0.2.15 ​ ```

3.3.2 部署和启动cluster111

离线安装: https://pingcap.com/zh/product-community/#TiDB 6.0.0-DMR

1)下载安装包 tidb-community-server-v6.0.0-linux-amd64.tar.gz 2)下载tookit tidb-community-toolkit-v6.0.0-linux-amd64.tar.gz

``` mkdir -p /usr/local0/webserver/tidb/ cd /usr/local0/webserver/tidb/ ​ tar -zxvf tidb-community-toolkit-v6.0.0-linux-amd64.tar.gz tar -zxvf tidb-community-server-v6.0.0-linux-amd64.tar.gz ​ cd ./tidb-community-server-v6.0.0-linux-amd64/ sh local_install.sh ​ source /root/.bash_profile tiup update cluster tiup cluster list

检测环境配置并尝试修正

tiup cluster check ./cluster111.yml --user root -p --apply

安装cluster111

tiup cluster deploy cluster111 v6.0.0 ./cluster111.yml --user root -p

启动集群

tiup cluster start cluster111 tiup cluster display cluster111 ```

3.4 dm集群

3.4.1 DM拓扑

  • 生成dm的拓扑

cd /usr/local0/webserver/tidb/tidb-community-toolkit-v6.0.0-linux-amd64 tar -zxvf dm-v1.9.4-linux-amd64.tar.gz cp ./tiup-dm /root/.tiup/bin/ ​ tiup-dm -h tiup-dm template --full >dm-cluster111.toml

  • dm-cluster111拓扑

```

dm-cluster111

server_configs: master:    # 开启webui   openapi: true master_servers: - host: 10.0.2.15   port: 8261 worker_servers: - host: 10.0.2.15   port: 8262    

监控

monitoring_servers: - host: 10.0.2.15   port: 19090 grafana_servers: - host: 10.0.1.14   port: 13000   config:   # Enable this part if you want to use WebUI, make sure tiup dm -v newer than v1.9.0.     auth.anonymous.enabled: true     security.allow_embedding: true alertmanager_servers: - host: 10.0.1.15   web_port: 19093   cluster_port: 19094 ```

3.4.2 部署集群

tiup-dm deplay dm-cluster111 v6.0.0 ./dm-cluster111.toml --user root -p tiup-dm start dm-cluster111 tiup-dm display dm-cluster111

3.4.3 登录Dm-WebUI

http\://{master_ip}:{master_port}/dashboard/ http://127.0.0.1:8261/dashboard

http://127.0.0.1:13000/

image.png

注意:web-ui上的dashboard上的监控需要设置的ip为 master机器可以访问到的grafana的地址和端口

3.5 使用DM-WebUI做数据迁移

任务模式task-mode:

  • all 全量+增量
  • full 全量
  • incremental 增量

创建上游数据源配置

image.png

image.png

后边要多次使用这个上游数据源,所以开启了relaylog。

image.png

3.5.1 测试全量迁移

test_dm(Mysql3306)--->test_dm_full(TiDB 4000) 上游数据库:test_dm(Mysql3306) 已经准备完毕

3.5.1.1 新建test_dm_full数据库

image.png

3.5.1.2 添加任务-基本信息

image.png

image.png

任务名:task-test-dm-full 原信息:meta_test_dm_full 存储路径:/tidb/dm/task-test-dm-full/dump_data

image.png

3.5.1.3 添加任务-上游信息

image.png

image.png

3.5.1.4 添加任务-下游信息

image.png

3.5.1.5 添加任务-事件过滤

事件过滤器根据具体情况填写(这里可以不填写)

3.5.1.6 添加任务-同步规则

必须填写

image.png

3.5.1.7 添加任务-保存任务并运行

image.png

image.png

image.png

3.5.1.8 任务列表-任务完成

image.png

3.5.1.9 验证数据完整性
1)Mysql3306 源数据库test_dm 记录信息

​ -- 统计指定数据库下的表记录数 -- 生成sql语句 select concat(    'select \'',    TABLE_name,    '\' , count(*) from ',        TABLE_name,    ' union all' )  from information_schema.tables where TABLE_SCHEMA='test_dm'; ​ select 'm_cust_data', count(*) ct from m_cust_data union all select 'm_cust_main', count(*) from m_cust_main union all select 'm_cust_oneall', count(*) from m_cust_oneall union all select 'm_cust_org', count(*) from m_cust_org union all select 'm_user', count(*) from m_user union all select 'rpt_detail_org', count(*) from rpt_detail_org ​ ​

image.png

2)TiDB4000 目标数据库test_dm_full 记录信息

image.png

3)源数据与目标数据表和记录数一致。

3.5.2 测试增量迁移

test_dm(Mysql3306)--->test-dm-incremental(TiDB 4000) 上游数据库:test-dm(Mysql3306) 已经准备完毕

注意:incremental: 仅进行增量数据同步,需要指定开始时间或 binlog 位置。

3.5.2.1 新建test_dm_incremental 数据库

为了让增量使用单独的dm-work 新建上游数据源 mysql3306-(test_dm)3

image.png

3.5.2.2 添加任务-基本信息

image.png

任务名:task-test-dm-incremental 原信息:meta_test_dm_incremental 存储路径:/tidb/dm/task-test-dm-incremental/dump_data

image.png

3.5.2.3 添加任务-上游信息

image.png

3.5.2.4 添加任务-下游信息

image.png

3.5.2.5 添加任务-事件过滤

事件过滤器根据具体情况填写(这里可以不填写)

3.5.2.6 添加任务-同步规则

必须填写

image.png

3.5.2.7 添加任务-运行

image.png

3.5.2.8 验证数据

image.png

image.png

增量数据按照预期同步到增量库中。

3.5.3 测试全量+增量迁移

Mysql(test_dm)--->TiDB(test_dm_all)

3.5.3.1 新建test_dm_all

image.png

3.5.3.2 添加任务-基本信息

任务名:task-test-dm-all 原信息:meta_test_dm_all 存储路径:/tidb/dm/task-test-dm-all/dump_data

image.png

3.5.3.3 添加任务-上游信息

image.png

3.5.3.4 添加任务-下游信息

image.png

3.5.3.5 添加任务-事件过滤

事件过滤器根据具体情况填写(这里可以不填写)

3.5.3.6 添加任务-同步规则

> 必须填写

image.png

提示错误:“test-dm必须配置到需要binlog的日志里”

my.ini

```

上游

binlog_do_db=test_dm ```

如何复用已经存在的dm-work

  • 方式1:停止dm-work,停止任务、删除上游
  • 方式2:扩容一个dm-work

本示例采用扩容一个dm-work的方式

image.png

3.5.3.7 验证数据一致性

-- 源库中执行 select c.* from ( select concat(    'select \'',    TABLE_name,    '\' tablename , count(*) ct from ',        TABLE_name,    ' union all' )  from information_schema.tables where TABLE_SCHEMA='test_dm') c  union all select 'select 0,0 from dual order by ct desc ' ; ​ ​ -- Tidb库中执行 select 'm_cust_data' tablename , count(*) ct from m_cust_data union all select 'm_cust_main' tablename , count(*) ct from m_cust_main union all select 'm_cust_oneall' tablename , count(*) ct from m_cust_oneall union all select 'm_cust_org' tablename , count(*) ct from m_cust_org union all select 'm_user' tablename , count(*) ct from m_user union all select 'rpt_detail_org' tablename , count(*) ct from rpt_detail_org union all select 0,0 from dual order by ct desc ​

image.png

3.5.3.8 对上游数据源(Mysql test_dm)数据做变更测试增量

主要包括:新增表,新增数据,修改数据,删除数据

1、新建表 test_dm

```

创建表

CREATE TABLE m_user_new (  id int(10) unsigned NOT NULL AUTO_INCREMENT,  name varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',  age int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (id) USING BTREE ) ENGINE=innodb AUTO_INCREMENT=112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ​

新增

INSERT INTO test_dm.m_user_new(id, name, age) VALUES (1, 'a', 1); INSERT INTO test_dm.m_user_new(id, name, age) VALUES (2, 'b', 22); ​

修改

update test_dm.m_user_new set name='namennnnnnnnnnnn' where id=1; update test_dm.m_user_new set name='mmmmmmmm' where id=2; ​ INSERT INTO test_dm.m_user_new(id, name, age) VALUES (3, 'cccccccccccccccccc', 99); ​

删除

delete from test_dm.m_user_new  where id=2; ​

新增2

CREATE TABLE m_user_new2 (  id int(10) unsigned NOT NULL AUTO_INCREMENT,  name varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',  age int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (id) USING BTREE ) ENGINE=innodb AUTO_INCREMENT=112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ​

插入

-- 在test_dm中执行插入,在tidb中的all模式下基本没有延迟就可以看到新插入的记录 INSERT INTO test_dm.m_user_new2( name, age) VALUES ( 'ddddddddddd', 99); ​ ​ ​ ```

2、下游(目标库 test_dm_all)

-- tidb 中需要 使用show tables 才看到对应的表,以为增量没有通过过来实际上已经同步了增量 show tables; ​ select * from m_user_new; select * from m_user_new2; ​ -- 对源的删除很快会反馈到 目标库表 ​

注意: 1、如果在任务中没有做事件过滤,那么对tidb的表的操作 将会被 源数据库中对应的记录的操作所覆盖。通常这种情况出现在同时写入源和目标库的情况下。 2、如果任务停止,再次启动任务时将从上次同步的时间点继续同步数据。

3.5.3.9 验证增量数据

1)Mysql test_dm库

select 'm_cust_data', count(*) ct from m_cust_data union all select 'm_cust_main', count(*) from m_cust_main union all select 'm_cust_oneall', count(*) from m_cust_oneall union all select 'm_cust_org', count(*) from m_cust_org union all select 'm_user', count(*) from m_user union all select 'm_user_new', count(*) from m_user_new union all select 'm_user_new2', count(*) from m_user_new2 union all select 'rpt_detail_org', count(*) from rpt_detail_org order by ct desc;

image.png

2)TiDB test_dm_all库

image.png

3)数据全量+增量同步 经验证数据是一致的。

3.5.4 适用场景

  • 从小数据量 MySQL 迁移数据到 TiDB 1)“小数据量”通常指 TiB 级别以下 2)直接使用DM进行数据同步到TiDB

  • 从大数据量 MySQL 迁移数据到 TiDB 1)使用Dumpling 导出全量数据 2)使用lightning导入全量数据 3)使用 DM 持续复制增量数据到 TiDB 需要记录binlog-name和binlog-pos 或binlog-gtid

  • 从小数据量分库分表 MySQL 合并迁移数据到 TiDB

  • 1)“小数据量”通常指 TiB 级别以下 2)直接使用DM进行数据同步到TiDB

  • 从大数据量分库分表 MySQL 合并迁移数据到 TiDB

  • 1)使用 Dumpling 导出全量数据备份 2)适用 Lightning 执行导入多个分库的全量数据到 TiDB 中的特定表 3)使用 DM 进行增量数据迁移

四、DM诊断

4.1 监控

DM集群会默认部署一套监控

4.1.1 查看监控的方式

1、http://127.0.0.1:13000/#grafana

image.png

2、WebUI(dashboard)

image.png

4.2 clinic

clinic对dm的收集使用独立的命令

tiup diag help tiup diag collectdm \

收集诊断信息

tiup diag collectdm dm-cluster111 tiup diag package ${diagfilepath} tiup diag upload ${diagfilepath}.diag ​

image.png

五、注意

5.1 webui与dmctl

  • DM WebUI 中 task 的生命周期有所改变,不建议与 dmctl 同时使用。
  • 如果你不习惯dmctl可以使用webui替代

六、总结

1、使用dm的WebUI总体是比较顺畅丝滑,中间遇到了一些问题在官方和社区朋友的帮助下得以解决。

2、特别感谢PingCAP,感谢社区热心的朋友帮助和支持!

体验过程遇到的小坑

1、 存储路径

每次编辑都会发生变化修改为默认值, 有 强迫症的朋友要每次改为自己指定的路径 image.png

2、 上游配置

密码端口填写配置错误要到最后提交任务才会告诉你。(可以优化增加一个验证功能)

image.png

3、 在不指定特定表的情况下

下面的空不要填,全量也不要填写(*),我测试的时候填 *星号 没有效果

image.png

4、使用show tables 才能刷出表结构(最大的坑 )

1)配置完成后跑任务

2)在任务列表中看到的任务是完成

3)使用navicat 就是刷不出来表(包括关闭连接,重新打开连接就是刷不出表)

几度怀疑是不是 配置错了,整好一会,重新跑任务还是没有。

最后到社区里逛逛,突然想到使用sql命令看看表有没有过来,使用的命令是show tables

-- tidb 中需要 使用show tables 才看到对应的表,以为增量没有通过过来实际上已经同步了增量 show tables; ​ select * from m_user_new; select * from m_user_new2; ​ -- 使用show tables 后,用navicat 就可以刷出表结构了。没有弄清是什么原因,这里记录一下! ​

如果有朋友知道原因可以分享给我,多谢!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论