5分鍾搞定分庫分表數據匯聚到一張表--CloudCanal實戰


簡述

CloudCanal 2.X 版本近期支持了自定義代碼能力,帶來了豐富的場景化數據能力,本文主要介紹在面向 To C 業務分庫分表情況下,如何通過 CloudCanal 進行數據實時匯聚。

本方案特點:

  • 數據處理靈活,適配多變的業務數據匯聚需求
  • 針對大部分帶結構數據源互通,可舉一反三
  • 穩定性較好

技術點

約束沖突

對於一部分分庫分表中間件或業務自己寫的拆分邏輯,並沒有考慮寫入數據主鍵或者唯一字段值的全局唯一問題,導致做數據匯聚時約束沖突。

另一類系統,在業務上就獨立,做數據匯集時,除了約束沖突,還存在結構不一致,數據規范不統一的問題。

對以上兩種情況,添加額外的字段以消除分表之間的約束沖突,進行數據清洗、結構調整,將數據進行規整。自定義代碼能夠很好的完成這種使命。

DDL 同步

分庫分表數據匯聚還存在一個較大的問題是 DDL 同步,對於大部分這類場景, 類似的 DDL 會在源端執行多遍,但是在對端只能執行一遍,並且數據和部分 DDL 有順序依賴問題 --- 只有 DDL 在對端執行成功之后,新的數據才能寫入或者執行。

我們目前建議不同步 DDL, 按照一定規范進行源和目標端 DDL 變更,達到不延遲且 DDL 不處於中間狀態的目的。

操作示例

前置條件:

  • CloudCanal 社區版部署,參見 社區版安裝文檔

  • 准備好 MySQL 數據庫(本例源端 5.7 ,目標端 8.0)

  • 源端 MySQL 上創建 2 個分庫( shard_1shard_2), 表結構一致(本例每一個分庫只有一張分表)

     CREATE TABLE `shard_1`.`my_order` (
      `id` bigint(19) NOT NULL AUTO_INCREMENT,
      `gmt_create` datetime NOT NULL,
      `gmt_modified` datetime NOT NULL,
      `product_id` bigint(20) NOT NULL,
      `user_id` bigint(20) NOT NULL,
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
    
     CREATE TABLE `shard_2`.`my_order` (
       `id` bigint(19) NOT NULL AUTO_INCREMENT,
      `gmt_create` datetime NOT NULL,
      `gmt_modified` datetime NOT NULL,
      `product_id` bigint(20) NOT NULL,
      `user_id` bigint(20) NOT NULL,
      PRIMARY KEY (`id`)
     ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
    
  • 目標 MySQL 上創建 1 個匯聚庫(no_shard),並包含1張匯聚表

    • %(#ea1f1f)[額外多出 region 字段,該字段通過自定義代碼固定生成]
    • %(#ea1f1f)[源端主鍵 id 和生成字段 region 組合成聯合主鍵,方便數據匯聚時保持唯一]
     CREATE TABLE `my_order` (
    `id` bigint NOT NULL,
    `region` varchar(64) NOT NULL,
    `gmt_create` datetime NOT NULL,
    `gmt_modified` datetime NOT NULL,
    `product_id` bigint NOT NULL,
    `user_id` bigint NOT NULL,
      PRIMARY KEY (`id`,`region`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
    

開發寬表代碼

添加數據源

  • 登錄 CloudCanal 平台
  • 數據源管理->新增數據源
  • 將源端和目標端MySQL 分別添加
    截屏2021-12-20 下午5.06.06.png

分庫shard_1任務創建

  • 任務管理->任務創建

  • 選擇 目標 數據源

  • 選擇 數據同步,並勾選 全量數據初始化, 其他選項默認

  • 選擇需要遷移同步的表, 此處只要選擇待聚合表即可,對端選擇聚合表
    截屏2021-12-20 下午5.04.03.png

  • 修改自定義代碼,並打包
    截屏2021-12-20 下午5.08.02.png

    % pwd
    /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process
    % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true - 
    Dmaven.compile.fork=true clean package
    

    截屏2021-12-20 下午4.00.36.png

  • 選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包1]
    截屏2021-12-20 下午4.57.59.png

  • 確認創建,並自動運行

分庫shard_2任務創建

  • 任務管理->任務創建

  • 選擇 目標 數據源

  • 選擇 數據同步,並勾選 全量數據初始化, 其他選項默認

  • 選擇需要遷移同步的表, 此處只要選擇待聚合表即可,對端選擇聚合表
    截屏2021-12-20 下午4.16.00.png

  • 修改自定義代碼,並打包
    截屏2021-12-20 下午3.59.05.png

    % pwd
    /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process
    % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true - 
    Dmaven.compile.fork=true clean package
    

    截屏2021-12-20 下午4.00.36.png

  • 選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包2]

  • 確認創建,並自動運行

分庫任務狀態

  • 兩個分庫匯聚任務正常運行
    截屏2021-12-20 下午3.57.27.png

校驗數據

  • 變更shard_1數據
    截屏2021-12-20 下午3.51.54.png
  • 變更shard_2數據
    截屏2021-12-20 下午3.50.47.png
  • 查看no_shard匯聚庫數據
    截屏2021-12-20 下午3.52.30.png

常見問題

是否支持帶數字后綴的分表

支持,就是在自定義代碼中匹配表名會稍微復雜些,需要自行修改匹配邏輯。

是否支持異構數據庫

支持,自定義代碼是 CloudCanal 通用功能,可實現自由的數據變幻。但是對於具體的目標數據源,行為可能會發生一些細微變化,需要進行一定的測試和驗證。

如果遇到出錯或者問題怎么辦?

如果會 java 開發,建議打開任務的 printCustomCodeDebugLog 觀察輸出的數據是否符合預期,如果不符合預期,可以打開任務的 debugMode 參數,對數據轉換邏輯進行調試。

如果不會 java 開發, 找 CloudCanal 同學協助。

總結

本文簡單介紹了如何使用 CloudCanal 進行分庫分表數據匯聚。各位讀者朋友,如果你覺得還不錯,請點贊、評論加轉發吧。

更多精彩

加入社區

我們創建了 CloudCanal 微信交流群,在里面,您可以得到最新版本發布信息和資源鏈接,您能看到其他用戶一手評測、使用情況,您更能得到熱情的問題解答,當然您還可以給我們提需求和問題。掃描下方二維碼,添加我們小助手微信suhuayue001拉您進群,備注: 加 CloudCanal 群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM