作者:刘安
爱可生测试团队成员,次要负责 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