簡述
之前的文章 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

- 添加數據源

- 創建任務,選擇數據源和庫,並連接成功
- ClickHouse 側點開高級選項,確保 表引擎為 ReplacingMergeTree
- 點擊下一步

- 選擇數據同步,建議規格至少選擇 1 GB。
- 目前已經支持 MySQL->ClickHouse DDL 同步, 可默認選中。
- 點擊下一步

- 選擇表、列、創建確認默認下一步。
- 等待任務自動結構遷移、全量遷移、數據同步追上
- 打開自動表優化開關,默認設置 30 秒間隔

- 延遲追平狀態,停止負載
- 等待自動優化間隔時間,創建一個校驗任務,跑完結果一致。
- 也可以等待 ClickHouse 自動優化,但時間不定

常見問題
新方案還存在什么問題
目前並未支持集群(distribute 表),所以如果 ClickHouse 是一個集群,還需要進一步增強。
另外結構遷移和增量對於 partition key 設置的支持,以及其他個性化表結構定義支持,還沒有做到位。
還支持其他數據源么
我們目前收到比較多Kafka、SqlServer、MongoDB、Oracle 到 ClickHouse 的需求,目前 SqlServer 我們目前正在支持中,Kafka 、MongoDB 、Oracle 源端已經支持,打通 ClickHouse 鏈路我們會在合適的時間同時打開。
總結
本文簡要介紹了 CloudCanal 實現 MySQL到 ClickHouse 數據遷移同步的進階能力,相比於老方案,優勢明顯。如果各位有需求,可以嘗試使用下我們的社區版免費體驗。最后,如果各位覺得這篇文章還不錯,請點贊、評論加轉發吧。
更多精彩
- 5分鍾搞定 MySQL 到 MySQL 異構在線數據遷移同步-CloudCanal 實戰
- 5分鍾搞定 MySQL 到 ElasticSearch 遷移同步-CloudCanal 實戰
- 5分鍾搞定 MySQL 到 TiDB 遷移同步-CloudCanal 實戰
- 構建基於Kafka中轉的混合雲在線數據生態-cloudcanal實戰
- 異地多活基礎之數據雙向同步進階篇-CloudCanal實戰
- MySQL 到 ElasticSearch 實時同步構建數據檢索服務的選型與思考

