作者:刘安

爱可生测试团队成员,次要负责 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/...中的形容可知:

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筹备一些数据
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工作的同步范畴

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继续增加数据
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命令
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表会造成数据不统一


如果在应用DTLE时发现了任何问题,请及时分割咱们。

DTLE repo: https://github.com/actiontech...

DTLE docs: https://actiontech.github.io/...

QQ探讨群: 852990221