簡述
CloudCanal 2.X 版本近期支持了自定義代碼能力,帶來了豐富的場景化數據能力,本文主要介紹在面向 To C 業務分庫分表情況下,如何通過 CloudCanal 進行數據實時匯聚。
本方案特點:
- 數據處理靈活,適配多變的業務數據匯聚需求
- 針對大部分帶結構數據源互通,可舉一反三
- 穩定性較好
技術點
約束沖突
對於一部分分庫分表中間件或業務自己寫的拆分邏輯,並沒有考慮寫入數據主鍵或者唯一字段值的全局唯一問題,導致做數據匯聚時約束沖突。
另一類系統,在業務上就獨立,做數據匯集時,除了約束沖突,還存在結構不一致,數據規范不統一的問題。
對以上兩種情況,添加額外的字段以消除分表之間的約束沖突,進行數據清洗、結構調整,將數據進行規整。自定義代碼能夠很好的完成這種使命。
DDL 同步
分庫分表數據匯聚還存在一個較大的問題是 DDL 同步,對於大部分這類場景, 類似的 DDL 會在源端執行多遍,但是在對端只能執行一遍,並且數據和部分 DDL 有順序依賴問題 --- 只有 DDL 在對端執行成功之后,新的數據才能寫入或者執行。
我們目前建議不同步 DDL, 按照一定規范進行源和目標端 DDL 變更,達到不延遲且 DDL 不處於中間狀態的目的。
操作示例
前置條件:
-
CloudCanal 社區版部署,參見 社區版安裝文檔
-
准備好 MySQL 數據庫(本例源端 5.7 ,目標端 8.0)
-
源端 MySQL 上創建 2 個分庫( shard_1 和 shard_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-data-process ,並找到代碼類 MySqlPartitionToMySql1_user_1.java 和 MySqlPartitionToMySql2_user_1.java
- 為了清晰,本案例對於不同的源庫,使用不同的自定義代碼,實際上兩者邏輯一致,只是匹配庫表是有所不同。
添加數據源
- 登錄 CloudCanal 平台
- 數據源管理->新增數據源
- 將源端和目標端MySQL 分別添加
分庫shard_1任務創建
-
任務管理->任務創建
-
選擇 源 和 目標 數據源
-
選擇 數據同步,並勾選 全量數據初始化, 其他選項默認
-
選擇需要遷移同步的表, 此處只要選擇待聚合表即可,對端選擇聚合表
-
修改自定義代碼,並打包
% pwd /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true - Dmaven.compile.fork=true clean package
-
選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包1]
-
確認創建,並自動運行
分庫shard_2任務創建
-
任務管理->任務創建
-
選擇 源 和 目標 數據源
-
選擇 數據同步,並勾選 全量數據初始化, 其他選項默認
-
選擇需要遷移同步的表, 此處只要選擇待聚合表即可,對端選擇聚合表
-
修改自定義代碼,並打包
% pwd /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true - Dmaven.compile.fork=true clean package
-
選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包2]
-
確認創建,並自動運行
分庫任務狀態
- 兩個分庫匯聚任務正常運行
校驗數據
- 變更shard_1數據
- 變更shard_2數據
- 查看no_shard匯聚庫數據
常見問題
是否支持帶數字后綴的分表
支持,就是在自定義代碼中匹配表名會稍微復雜些,需要自行修改匹配邏輯。
是否支持異構數據庫
支持,自定義代碼是 CloudCanal 通用功能,可實現自由的數據變幻。但是對於具體的目標數據源,行為可能會發生一些細微變化,需要進行一定的測試和驗證。
如果遇到出錯或者問題怎么辦?
如果會 java 開發,建議打開任務的 printCustomCodeDebugLog 觀察輸出的數據是否符合預期,如果不符合預期,可以打開任務的 debugMode 參數,對數據轉換邏輯進行調試。
如果不會 java 開發, 找 CloudCanal 同學協助。
總結
本文簡單介紹了如何使用 CloudCanal 進行分庫分表數據匯聚。各位讀者朋友,如果你覺得還不錯,請點贊、評論加轉發吧。
更多精彩
- 5分鍾搞定 MySQL 到 ClickHouse 寬表構建和同步-CloudCanal實戰
- 5分鍾搞定 MySQL 到 ElasticSearch 寬表構建和同步-CloudCanal實戰
- 異地多活基礎之數據雙向同步進階篇-CloudCanal實戰
- 5分鍾搞定 MySQL 到 ClickHouse 實時數據同步進階篇-CloudCanal實戰
- 主流關系型數據庫到 Kudu 實時數據同步-CloudCanal實戰
- 5分鍾搞定 MySQL 到 ElasticSearch 遷移同步-CloudCanal 實戰
- 5分鍾搞定 MySQL 到 MySQL 異構在線數據遷移同步-CloudCanal 實戰
- MySQL 到 ElasticSearch 實時同步構建數據檢索服務的選型與思考
- 構建基於Kafka中轉的混合雲在線數據生態-cloudcanal實戰
- 5分鍾搞定 MySQL 到 TiDB 的數據同步 - CloudCanal實戰
加入社區
我們創建了 CloudCanal 微信交流群,在里面,您可以得到最新版本發布信息和資源鏈接,您能看到其他用戶一手評測、使用情況,您更能得到熱情的問題解答,當然您還可以給我們提需求和問題。掃描下方二維碼,添加我們小助手微信suhuayue001拉您進群,備注: 加 CloudCanal 群