資料傳輸 | 如何配合 pt-osc 使用 DTLE 同步 DDL

愛可生雲資料庫發表於2022-04-18

作者:劉安

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

相關文章