数据传输 | 如何配合 pt-osc 使用 DTLE 同步 DDL

2022-04-15 16:36:00 浏览数 (1)

作者:刘安

爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

如何配合pt-osc使用DTLE同步DDL

背景:在社区群里有同学询问,源库使用pt-osc做表DDL变更,DTLE是否支持?

1. pt-osc的原理

1). 创建一个与原表结构相同的空表,表名是_原表名_new

2). 修改步骤 1 创建的空表的表结构

3). 在原表上添加三个触发器:delete/update/insert,用于在复制数据过程中,将原表中的数据变更同步到_原表名_new

4). 将原表数据以数据块的形式复制到_原表名_new

5). rename 原表_原表名_old表,并把_原表名_new表 rename 为原表,然后删除_原表名_old

6). 删除触发器

2. DTLE对DDL的支持

根据DTLE的文档https://actiontech.github.io/dtle-docs-cn/3/3.6_DDL.html中的描述可知:

1). DTLE支持create/altert/drop table语句

2). DTLE虽然不支持同步触发器相关的DDL,但是触发器产生的数据可以同步到目标端

3). DTLE支持rename语句

看来DTLE应该是支持pt-osc做表DDL变更的,接下就具体操作一下。

3. 操作步骤

1). 部署DTLE集群,这里使用的是dtle-ce-4.22.01.0版本
2). 在源端MySQL准备一些数据
代码语言:sql复制
mysql> CREATE DATABASE action_db;

shell> sysbench /usr/share/sysbench/oltp_common.lua --mysql-host=172.100.9.1 --mysql-port=3306 --mysql-user=test --mysql-password=test --create_secondary=off --mysql-db=action_db --tables=1 --table_size=100000 prepare
3). 创建一个DTLE任务

注意此处需要将_原表名_old表和_原表名_new都加入都DTLE任务的同步范围

代码语言:sql复制
job "test_pt_osc" {
  datacenters = ["dc1"]

  group "Src" {
    task "src" {
      driver = "dtle"
      config {
        ReplicateDoDb = [{
          TableSchema = "action_db"
          Tables = [{
            TableName = "sbtest1"
          },
          {
          	TableName = "_sbtest1_new"
          },
          {
          	TableName = "_sbtest1_old"
          }]
        }]
        ConnectionConfig = {
          Host = "172.100.9.1"
          Port = 3306
          User = "test_src"
          Password = "test_src"
        }
      }
    }
  }
  group "Dest" {
    task "dest" {
      driver = "dtle"
      config {
        ConnectionConfig = {
          Host = "172.100.9.2"
          Port = 3306
          User = "test_dest"
          Password = "test_dest"
        }
      }
    }
  }
}
4). 查看两端数据库的表结构
5). 源端MySQL持续添加数据
代码语言:sql复制
shell> sysbench /usr/share/sysbench/oltp_write_only.lua --mysql-host=172.100.9.1 --mysql-port=3306 --mysql-user=test --mysql-password=test --report-interval=3 --mysql-db=action_db --tables=1 --table_size=100000 --time=10 --rate=100 run
6). 在源端有数据流量的同时,执行pt-osc命令
代码语言:sql复制
shell> pt-online-schema-change --print --statistics --progress time,30 --user=test --password=test --alter 'modify c varchar(200) not null default ""' --chunk-size=10000 --nocheck-replication-filters --host=172.100.9.1 --port=3306 D=action_db,t=sbtest1 --execute

在执行pt-ost命令期间,会有试图连接源端DTLE的报错。这是因为DTLE伪装成MySQL从实例获取binlog,而pt-ost会检查主从之间的延迟造成的。此报错不会影响pt-osc的执行。

7). 检查DDL被正确同步以及数据的一致性

4. 总结

1). 使用pt-osc工具做表DDL变更DTLE是支持的

2). 虽然本例中指定了需要同步的表,实际上直接创建一个Database级别的任务也可以达到同-样的效果

3). 需要在创建DTLE任务的时候就规划好要同步的表,后期再另建任务同步_old表和_new表会造成数据不一致

0 人点赞