ClickHouse作為OLAP分析引擎已經被廣泛使用,數據的導入導出是用戶面臨的第一個問題。由於ClickHouse本身無法很好地支持單條大批量的寫入,因此在實時同步數據方面需要借助其他服務協助。本文給出一種結合Canal+Kafka的方案,並且給出在多個MySQL實例分庫分表的場景下,如何將多張MySQL數據表寫入同一張ClickHouse表的方法,歡迎大家批評指正。
首先來看看我們的需求背景:
1. 實時同步多個MySQL實例數據到ClickHouse,每天規模500G,記錄數目億級別,可以接受分鍾級別的同步延遲;
2. 某些數據庫表存在分庫分表的操作,用戶需要跨MySQL實例跨數據庫的表同步到ClickHouse的一張表中;
3. 現有的MySQL binlog開源組件(Canal),無法做到多張源數據表到一張目的表的映射關系。
基本原理
一、使用JDBC方式同步
1. 使用Canal組件完成binlog的解析和數據同步;
2. Canal-Server進程會偽裝成MySQL的slave,使用MySQL的binlog同步協議完成數據同步;
3. Canal-Adapter進程負責從canal-server獲取解析后的binlog,並且通過jdbc接口寫入到ClickHouse;
優點:
1. Canal組件原生支持;
缺點:
1. Canal-Adpater寫入時源表和目的表一一對應,靈活性不足;
2. 需要維護兩個Canal組件進程;
二、Kafka+ClickHouse物化視圖方式同步
1. Canal-Server完成binlog的解析,並且將解析后的json寫入Kafka;
2. Canal-Server可以根據正則表達式過濾數據庫和表名,並且根據規則寫入Kafka的topic;
3. ClickHouse使用KafkaEngine和Materialized View完成消息消費,並寫入本地表;
優點:
1. Kafka支持水平擴展,可以根據數據規模調整partition數目;
2. Kafka引入后將寫入請求合並,防止ClickHouse生成大量的小文件,從而影響查詢性能;
3. Canal-Server支持規則過濾,可以靈活配置上游的MySQL實例的數據庫名和表名,並且指明寫入的Kafka topic名稱;
缺點:
1. 需要維護Kafka和配置規則;
2. ClickHouse需要新建相關的視圖、Kafka Engine的外表等;