TiDB从0到1系列
- TiDB-从0到1-体系结构
- TiDB-从0到1-分布式存储
- TiDB-从0到1-分布式事务
- TiDB-从0到1-MVCC
- TiDB-从0到1-部署篇
- TiDB-从0到1-配置篇
- TiDB-从0到1-集群扩缩容
- TiDB-从0到1-数据导出导入
- TiDB-从0到1-BR工具
一、DM原理
支持全量抽取数据\检测新的数据变化同步到下游实例,其实与canal类似,相当于上游数据库的从节点监听binlog变化。
二、DM功能
- 支持DML和DDL同步复制
- 支持合库合表同步复制
- 内置过滤器
- 集中管理同步任务
- 支持高可用部署
三、DM使用注意事项
- dmctl负责发送任务请求给DM master,master负责调度任务
- DM worker负责具体的同步工作,一个DM worker只能对应一个任务
- 上游数据库适用于mysql 5.5~8.0和mariadb >10.1.2。当然mysql8.0+也可以,只是部分语句兼容性较差。
- DDL有部分限制,如果失败会跳过
四、部署DM环境
安装dm和dmctl工具
tiup install dm dmctl
生成dm配置文件
tiup dm template > topology_dm.yaml
#修改文件内对应内容
global:
user: “tidb”
ssh_port: 22
deploy_dir: “/dm-deploy”
data_dir: “/dm-data”
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: 10.0.1.11
name: master1
ssh_port: 22
port: 8261
# peer_port: 8291
# deploy_dir: “/dm-deploy/dm-master-8261”
# data_dir: “/dm-data/dm-master-8261”
# log_dir: “/dm-deploy/dm-master-8261/log”
# numa_node: “0,1”
# 下列配置项用于覆盖server_configs.master
的值。
config:
log-level: info
# rpc-timeout: “30s”
# rpc-rate-limit: 10.0
# rpc-rate-burst: 40
– host: 10.0.1.18
name: master2
ssh_port: 22
port: 8261
– host: 10.0.1.19
name: master3
ssh_port: 22
port: 8261
# 如果不需要确保 DM 集群高可用,则可只部署 1 个 DM-master 节点,且部署的 DM-worker 节点数量不少于上游待迁移的 MySQL/MariaDB 实例数。
# 如果需要确保 DM 集群高可用,则推荐部署 3 个 DM-master 节点,且部署的 DM-worker 节点数量大于上游待迁移的 MySQL/MariaDB 实例数(如 DM-worker 节点数量比上游实例数多 2 个)。
worker_servers:
– host: 10.0.1.12
ssh_port: 22
port: 8262
# deploy_dir: “/dm-deploy/dm-worker-8262”
# log_dir: “/dm-deploy/dm-worker-8262/log”
# numa_node: “0,1”
# 下列配置项用于覆盖server_configs.worker
的值。
config:
log-level: info
– host: 10.0.1.19
ssh_port: 22
port: 8262
monitoring_servers:
– host: 10.0.1.13
ssh_port: 22
port: 9090
# deploy_dir: “/tidb-deploy/prometheus-8249”
# data_dir: “/tidb-data/prometheus-8249”
# log_dir: “/tidb-deploy/prometheus-8249/log”
grafana_servers:
– host: 10.0.1.14
port: 3000
# deploy_dir: /tidb-deploy/grafana-3000
alertmanager_servers:
– host: 10.0.1.15
ssh_port: 22
web_port: 9093
# cluster_port: 9094
# deploy_dir: “/tidb-deploy/alertmanager-9093”
# data_dir: “/tidb-data/alertmanager-9093”
# log_dir: “/tidb-deploy/alertmanager-9093/log”
查看dm可用的版本
tiup list dm
部署
tiup dm deploy dm-test v7.5.2 ./topology_dm.yaml --user root -p
查看dm列表
tiup dm list
tiup dm display dm-test
启动dm
tiup dm start dm-test
查看dm-test状态
tiup dm display dm-test
五、DM应用
1、准备上游配置文件(对应mysql)
vim mysql-source-conf1.yaml
source-id: "mysql-replica-01"
from:
host: "xxx.xxx.xxx.xx"
port: 3306
user: "dba"
password: "xxxxxxx" #这里的密码可以是明文,也可以是通过dm-ctl加密后的密文
2、创建应用
tiup dmctl --master-addr=xxx.xx.xx.xx:8261 operate-source create mysql-source-conf1.yaml
#查看dm应用信息
tiup dmctl --master-addr=xxx.xxx.xxx.xx:8261 operate-source show
#查看详细信息
tiup dmctl --master-addr=xxx.xxx.xxx.xx:8261 get-config source mysql-replica-01
3、创建下游同步规则(基础配置)
vim dm-task1.yaml
name: "dm-task1"
#全量+增量
task-mode: all
#不检查自增主键
ignore-checking-items: ["auto_increment_ID"]
#下游tidb配置
target-database:
host: "xx.xxx.xxx.xx"
port: 4000
user: "dba"
password: "123456"
#上游mysql关联配置
mysql-instances:
- source-id: "mysql-replica-01"
route-rules: ["instance-1-user-rule"]
#规则,上游的blade_client表到下游的blade_client表(表名可以变)
routes:
instance-1-user-rule:
schema-pattern: "t100w"
target-schema: "t100w"
4、校验同步配置
tiup dmctl --master-addr=xx.xx.xx.xx:8261 check-task dm-task1.yaml
(有报错需先处理,不然后续同步可能会受 影响)
(正常结果)
5、启动数据同步任务
tiup dmctl --master-addr=xx.xxx.xxx.xx:8261 start-task dm-task1.yaml
6、查看同步状态
tiup dmctl --master-addr=xx.xx.xx.xx:8261 query-status dm-task1.yaml
7、暂停同步
tiup dmctl --master-addr=xx.xxx.xxx.xx:8261 pause-task dm-task1.yaml
8、恢复同步
tiup dmctl --master-addr=xxx.xxx.xxx.xx:8261 resume-task dm-task1.yaml
9、终止同步任务
tiup dmctl --master-addr=xxx.xxx.xxx.xx:8261 stop-task dm-task1.yaml
六、DM扩缩容
1、worker节点下线
tiup dm scale-in dm-test -N xxx.xx.xxx.xx:8262
2、新增work节点
vim dm-scale.yaml
worker_servers:
- host: xxx.xxx.xxx.xx
tiup dm scale-out dm-test dm-scale.yaml -uroot -p
彩蛋
其实如果上游数据量较小(100G以内),且业务允许在低峰期中断的情况下, 直接使用dumpling来迁移更加方便。
当然也可以使用TiDB作为MySQL的下游归档库,dm-task1.yaml配置中支持多样化的过滤配置。