簡述
上一篇文章介紹了使用 CloudCanal 進行 MySQL 到 ElasticSearch 的寬表構建, 有蠻多朋友關注和嘗試使用,我們也在不斷迭代升級這個能力。
作為產品的通用功能,今天我們介紹下 MySQL -> ClickHouse 的寬表構建案例。
技術點
ClickHouse 表關聯之觴
ClickHouse 作為標准的列存數據庫,其特點相當鮮明,對於多維度數據聚合、篩選特別高效,對於列存面向計算的特點,用得相當不錯,包括但不限於以下特點
- io 效率高
- 列壓縮
- 少數列數據存取io放大效應較小
- 極致計算優化
- 向量化
- 利用 SSE 等 SIMD 指令集加速
- 未來可選 AVX 512 等指令集優化
- 未來對於計算卸載到 FPGA、GPU 較便利
但是 ClickHouse 對於數據關聯(join), 相比於其 多維聚合、篩選 能力要弱一些。對於這個問題,我們覺得有必要通過 CloudCanal 的寬表能力,讓其適用性得到進一步提升。大寬表 + 突出的數據 多維聚合、篩選 能力,幾乎等於交互式分析的殺手鐧。
操作示例
前置條件:
-
CloudCanal 社區版部署,參見 社區版安裝文檔
-
准備好 MySQL 數據庫(本例使用 5.7 版本)和 ClickHouse 數據庫(本例使用 21.8.X 版本)
-
MySQL 上創建 1 張事實表(my_order)和 2 張維表 (user 、product)
CREATE TABLE `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=1460 DEFAULT CHARSET=utf8; CREATE TABLE `product` ( `id` bigint(19) NOT NULL AUTO_INCREMENT, `gmt_create` datetime NOT NULL, `gmt_modified` datetime NOT NULL, `name` varchar(255) NOT NULL, `price` decimal(20,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2719 DEFAULT CHARSET=utf8; CREATE TABLE `user` ( `id` bigint(19) NOT NULL AUTO_INCREMENT, `gmt_create` datetime NOT NULL, `gmt_modified` datetime NOT NULL, `name` varchar(255) NOT NULL, `level` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2224 DEFAULT CHARSET=utf8
-
ClickHouse 上創建 1 張寬表 my_order , 並額外包含兩張維表相關數據
- user_id (關聯user.id), user_name(對應user.name)
- product_id(關聯product.id) ,product_name(對應product.name),product_price (對應product.price)
CREATE TABLE trade.my_order ( `id` Int64, `gmt_create` DateTime, `gmt_modified` DateTime, `product_id` Int64, `user_id` Int64, `user_name` Nullable(String), `product_name` Nullable(String), `product_price` Nullable(Decimal(20, 2)) ) ENGINE = ReplacingMergeTree ORDER BY id SETTINGS index_granularity = 8192
開發寬表代碼
- 代碼工程 cloudcanal-data-process ,並找到代碼類 MySqlToChOnlyFact_one_fact_two_dim.java
- 修改必要信息
打包
-
進入工程目錄,使用命令進行打包
% pwd /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true clean package
自定義代碼包
- 打包命令后,代碼包位於工程目錄下的 wide-table/target 目錄
添加數據源
- 登錄 CloudCanal 平台
- 數據源管理->新增數據源
- 將MySQL 和 ClickHouse 分別添加
任務創建
- 任務管理->任務創建
- 選擇 源 和 目標 數據源
- 選擇 數據同步,並勾選 全量數據初始化, 其他選項默認
- 選擇需要遷移同步的表, 此處只要選擇事實表即可,維表會通過自定義代碼反查補充
- 選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包(路徑如上所示)]
- 確認創建,並自動運行
校驗數據
- 變更事實表數據
- 變更維表數據
數據變化規律
- 事實表插入,更新都會反查維表最新數據並寫入對端
- 維表更新,需要觸發事實表更新才能帶上最新的維表變更數據寫入對端
- 維表數據刪除,如果觸發事實表更新,默認將會把對應的維表數據(已刪除)置為null
常見問題
維表變化后怎么辦?
維表變化不會直接觸發事實表更新。需要源端觸發事實表更新(比如變更一個時間字段),帶上最新的維表數據進行對端數據刷新。
另外對於維表數據的刪除,如果觸發事實表更新從而刷新對端數據,則默認置為null。
不會開發 java 代碼怎么辦?
如果能打包不會 java 開發,在 cloudcanal-data-process 尋找相應模版,修改配置即可。
如果不能打包也不會開發,找 CloudCanal 同學協助。
如果遇到出錯或者問題怎么辦?
如果會 java 開發,建議打開任務的 printCustomCodeDebugLog 觀察輸出的數據是否符合預期,如果不符合預期,可以打開任務的 debugMode 參數,對數據轉換邏輯進行調試。
如果不會 java 開發, 找 CloudCanal 同學協助。
還支持其他數據源么?
這個是 CloudCanal 通用能力,只要源和目標之間實現了全量遷移和增量同步,即支持。
總結
本文簡單介紹了如何使用 CloudCanal 進行 MySQL -> ClickHouse 的寬表構建,以最常見的單事實表多維表方式舉例。各位讀者朋友,如果你覺得還不錯,請點贊、評論加轉發吧。
更多精彩
- 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 微信交流群,在里面,您可以得到最新版本發布信息和資源鏈接,您能看到其他用戶一手評測、使用情況,您更能得到熱情的問題解答,當然您還可以給我們提需求和問題。掃描下方二維碼,添加我們小助手微信拉您進群,備注: 加 CloudCanal 群