作者:劉安
愛可生測試團隊成員,主要負責 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