作者:边城元元
体验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 架构
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单实例 迁移到
3.2 上游数据源Mysql3306
3.2.1 上游mysql数据库 test-dm
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 拓扑
```
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
注意:web-ui上的dashboard上的监控需要设置的ip为 master机器可以访问到的grafana的地址和端口
3.5 使用DM-WebUI做数据迁移
任务模式task-mode:
- all 全量+增量
- full 全量
- incremental 增量
创建上游数据源配置
后边要多次使用这个上游数据源,所以开启了relaylog。
3.5.1 测试全量迁移
test_dm(Mysql3306)--->test_dm_full(TiDB 4000) 上游数据库:test_dm(Mysql3306) 已经准备完毕
3.5.1.1 新建test_dm_full数据库
3.5.1.2 添加任务-基本信息
任务名:task-test-dm-full 原信息:meta_test_dm_full 存储路径:/tidb/dm/task-test-dm-full/dump_data
3.5.1.3 添加任务-上游信息
3.5.1.4 添加任务-下游信息
3.5.1.5 添加任务-事件过滤
事件过滤器根据具体情况填写(这里可以不填写)
3.5.1.6 添加任务-同步规则
必须填写
3.5.1.7 添加任务-保存任务并运行
3.5.1.8 任务列表-任务完成
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
2)TiDB4000 目标数据库test_dm_full 记录信息
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
3.5.2.2 添加任务-基本信息
任务名:task-test-dm-incremental 原信息:meta_test_dm_incremental 存储路径:/tidb/dm/task-test-dm-incremental/dump_data
3.5.2.3 添加任务-上游信息
3.5.2.4 添加任务-下游信息
3.5.2.5 添加任务-事件过滤
事件过滤器根据具体情况填写(这里可以不填写)
3.5.2.6 添加任务-同步规则
必须填写
3.5.2.7 添加任务-运行
3.5.2.8 验证数据
增量数据按照预期同步到增量库中。
3.5.3 测试全量+增量迁移
Mysql(test_dm)--->TiDB(test_dm_all)
3.5.3.1 新建test_dm_all
3.5.3.2 添加任务-基本信息
任务名:task-test-dm-all 原信息:meta_test_dm_all 存储路径:/tidb/dm/task-test-dm-all/dump_data
3.5.3.3 添加任务-上游信息
3.5.3.4 添加任务-下游信息
3.5.3.5 添加任务-事件过滤
事件过滤器根据具体情况填写(这里可以不填写)
3.5.3.6 添加任务-同步规则
> 必须填写
提示错误:“test-dm必须配置到需要binlog的日志里”
my.ini
```
上游
binlog_do_db=test_dm ```
如何复用已经存在的dm-work
- 方式1:停止dm-work,停止任务、删除上游
- 方式2:扩容一个dm-work
本示例采用扩容一个dm-work的方式
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
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;
2)TiDB test_dm_all库
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
2、WebUI(dashboard)
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
五、注意
5.1 webui与dmctl
- DM WebUI 中
task
的生命周期有所改变,不建议与 dmctl 同时使用。 - 如果你不习惯dmctl可以使用webui替代
六、总结
1、使用dm的WebUI总体是比较顺畅丝滑,中间遇到了一些问题在官方和社区朋友的帮助下得以解决。
2、特别感谢PingCAP,感谢社区热心的朋友帮助和支持!
体验过程遇到的小坑
1、 存储路径
每次编辑都会发生变化修改为默认值, 有 强迫症的朋友要每次改为自己指定的路径
2、 上游配置
密码端口填写配置错误要到最后提交任务才会告诉你。(可以优化增加一个验证功能)
3、 在不指定特定表的情况下
下面的空不要填,全量也不要填写(*),我测试的时候填 *
星号 没有效果
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 就可以刷出表结构了。没有弄清是什么原因,这里记录一下!
如果有朋友知道原因可以分享给我,多谢!