共计 2229 个字符,预计需要花费 6 分钟才能阅读完成。
作者:刘安
爱可生测试团队成员,次要负责 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