騰訊大牛教你ClickHouse實時同步MySQL數據


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的外表等;


免責聲明!

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



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