5分鍾搞定 MySQL 到 ClickHouse 實時數據同步進階篇-CloudCanal實戰


簡述

之前的文章 5分鍾搞定 MySQL 到 ClickHouse 實時數據同步 發布后,很多用戶將 MySQL->ClickHouse 實時同步鏈路用了起來,但是我們很快發現,CollapsingMergeTree 在某些場景下可能並不能按預期進行數據折疊。

這個時候,我們參考了 ClickHouse 官方實現的 MaterializeMySQL 表引擎,將 ReplacingMergeTree 作為對端主力表引擎進行數據鏈路構建。

新方案優勢包括

  • 表不存在額外的字段
  • 按 order by key 嚴格合並(單節點)
  • 可以設置按時間間隔自動 optimize 表(autoOptimizeThresholdSec參數)
  • 支持 DDL 同步

技術點

結構遷移

目前到 ClickHouse 的結構遷移中,默認選擇 ReplacingMergeTree 作為表引擎,源主鍵作為 sortKey (無主鍵表則是 tuple),如下示例:

 CREATE TABLE console.worker_stats
(
    `id` Int64,
    `gmt_create` DateTime,
    `worker_id` Int64,
    `cpu_stat` String,
    `mem_stat` String,
    `disk_stat` String
)
ENGINE = ReplacingMergeTree()
ORDER BY id
SETTINGS index_granularity = 8192

寫數據

新方案全量仍然按照標准 batch 導入,增量和 CollapsingMergeTree 作為表引擎的區別在於

  • 轉換 Insert、Update 操作為 Insert
  • Delete 操作單獨通過 alter table delete 語句進行操作

所以 Delete 操作如果較多,增量同步性能會急劇下降,建議 delete RPS 不超過 50。

  switch (rowChange.getEventType()) {
            case INSERT:
            case UPDATE: {
                for (CanalRowData rowData : rowChange.getRowDatasList()) {
                    CkTableBatchData.RecordWithState addRecord = new CkTableBatchData.RecordWithState(CanalEventType.INSERT, rowData.getAfterColumnsList());
                    batchData.getRecords().add(addRecord);
                }

                break;
            }
            case DELETE: {
                for (CanalRowData rowData : rowChange.getRowDatasList()) {
                    CkTableBatchData.RecordWithState delRecord = new CkTableBatchData.RecordWithState(CanalEventType.DELETE, rowData.getBeforePkColumnsList());
                    batchData.getRecords().add(delRecord);
                    batchData.setHasDelete(true);
                }
                break;
            }
            default:
                throw new CanalException("not supported event type,eventType:" + rowChange.getEventType());
 }

舉個"栗子"

  • 造 Insert、Update、Delete 負載,比例為 20:78:2
    截屏2021-11-19 上午11.27.01.png
  • 添加數據源
    添加數據源.png
  • 創建任務,選擇數據源和庫,並連接成功
  • ClickHouse 側點開高級選項,確保 表引擎為 ReplacingMergeTree
  • 點擊下一步
    選擇數據源.png
  • 選擇數據同步,建議規格至少選擇 1 GB。
  • 目前已經支持 MySQL->ClickHouse DDL 同步, 可默認選中。
  • 點擊下一步
    選擇規格.png
  • 選擇表、列、創建確認默認下一步。
  • 等待任務自動結構遷移、全量遷移、數據同步追上
  • 打開自動表優化開關,默認設置 30 秒間隔
    打開開關.png
  • 延遲追平狀態,停止負載
  • 等待自動優化間隔時間,創建一個校驗任務,跑完結果一致。
  • 也可以等待 ClickHouse 自動優化,但時間不定
    數據一致.png

常見問題

新方案還存在什么問題

目前並未支持集群(distribute 表),所以如果 ClickHouse 是一個集群,還需要進一步增強。

另外結構遷移和增量對於 partition key 設置的支持,以及其他個性化表結構定義支持,還沒有做到位。

還支持其他數據源么

我們目前收到比較多Kafka、SqlServer、MongoDB、Oracle 到 ClickHouse 的需求,目前 SqlServer 我們目前正在支持中,Kafka 、MongoDB 、Oracle 源端已經支持,打通 ClickHouse 鏈路我們會在合適的時間同時打開。

總結

本文簡要介紹了 CloudCanal 實現 MySQL到 ClickHouse 數據遷移同步的進階能力,相比於老方案,優勢明顯。如果各位有需求,可以嘗試使用下我們的社區版免費體驗。最后,如果各位覺得這篇文章還不錯,請點贊、評論加轉發吧。

更多精彩

社區快訊

  • 我們創建 CloudCanal 微信粉絲群啦,在里面,你可以得到最新版本發布信息和資源鏈接,你能看到其他用戶一手評測、使用情況,你更能得到熱情的問題解答,當然你還可以給我們提需求和問題。快快加入吧。
  • 掃描下方二維碼,添加我們小助手微信拉您進群,接頭語(“加 CloudCanal 社區群”)
    wechat.png


免責聲明!

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



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