从多台ClickHouse服务器向目标节点同步数据的方案咨询
解决方案:4台ClickHouse到第5台的高吞吐量同步方案
针对你每秒10万条插入、24小时高负载的场景,以下是无需文件中转的持续推送/拉取、定时加载方案:
一、实时拉取:Materialized View + Distributed表
这是ClickHouse原生支持的实时拉取方案,无需额外组件,适配高吞吐量需求。
操作步骤
- 在目标ClickHouse的配置文件中定义所有源服务器的集群信息:
<remote_servers> <source_cluster_1> <shard> <replica> <host>source1-ip</host> <port>9000</port> </replica> </shard> </source_cluster_1> <!-- 依次配置source_cluster_2、source_cluster_3、source_cluster_4 --> </remote_servers>
- 在目标机创建指向各源表的Distributed表:
CREATE TABLE source1_distributed AS source_db.source_local_table ENGINE = Distributed(source_cluster_1, source_db, source_local_table, rand());
- 创建Materialized View将源数据实时同步到目标本地表:
CREATE MATERIALIZED VIEW mv_sync_source1 TO target_db.target_local_table AS SELECT * FROM source1_distributed;
优势与注意事项
- 优势:原生适配ClickHouse,吞吐量高,能实时同步数据,无需额外维护成本
- 注意:源表与目标表结构必须一致;若源表有更新/删除操作,目标表需使用
ReplacingMergeTree或CollapsingMergeTree保证数据一致性
二、实时推送:Kafka Engine解耦方案
通过Kafka做中间层,解耦源与目标,应对峰值流量冲击,支持Exactly-Once语义。
操作步骤
- 源端配置:创建Kafka引擎表和推送数据的Materialized View
-- 源端创建Kafka队列表 CREATE TABLE kafka_sync_source1 ( -- 与源表结构完全一致 id UInt64, content String, create_time DateTime ) ENGINE = Kafka SETTINGS kafka_broker_list = 'kafka-node1:9092,kafka-node2:9092', kafka_topic_list = 'ck_sync_source1', kafka_group_name = 'ck_source1_producer', kafka_format = 'JSONEachRow'; -- 源端创建Materialized View,将数据推送到Kafka CREATE MATERIALIZED VIEW mv_push_to_kafka TO kafka_sync_source1 AS SELECT * FROM source_db.source_local_table;
- 目标端配置:创建Kafka消费表和写入本地的Materialized View
-- 目标端创建Kafka消费表 CREATE TABLE kafka_consumer_source1 ( -- 与源表结构一致 id UInt64, content String, create_time DateTime ) ENGINE = Kafka SETTINGS kafka_broker_list = 'kafka-node1:9092,kafka-node2:9092', kafka_topic_list = 'ck_sync_source1', kafka_group_name = 'ck_target_consumer', kafka_format = 'JSONEachRow'; -- 目标端创建Materialized View,将Kafka数据写入本地表 CREATE MATERIALIZED VIEW mv_consume_to_target TO target_db.target_local_table AS SELECT * FROM kafka_consumer_source1;
优势与注意事项
- 优势:解耦源与目标,Kafka可缓冲峰值流量,支持分布式部署扩展吞吐量
- 注意:需额外维护Kafka集群;建议根据吞吐量配置足够的Kafka分区数(10万条/秒建议20+分区);目标表需处理重复消息,可结合
ReplacingMergeTree
三、定时增量拉取:脚本+定时任务
适用于对实时性要求不高(分钟级)的场景,实现简单,可控性强。
操作步骤
- 在目标机创建指向各源表的Distributed表(同方案一)
- 编写同步脚本
ck_sync.sh:
#!/bin/bash # 获取上次同步的时间戳 LAST_SYNC=$(clickhouse-client --query "SELECT max(create_time) FROM target_db.target_local_table") # 同步source1的数据 clickhouse-client --query "INSERT INTO target_db.target_local_table SELECT * FROM source1_distributed WHERE create_time > '$LAST_SYNC'" # 依次同步source2、source3、source4的数据
- 用cron设置定时执行(每分钟一次):
* * * * * /path/to/ck_sync.sh >> /var/log/ck_sync.log 2>&1
优势与注意事项
- 优势:实现成本极低,无需额外组件,可控制同步频率和数据量
- 注意:需确保源表有可靠的增量标识(如时间戳、自增ID);若源表有大量更新,同步时需加
FINAL关键字获取最新数据
四、官方工具:ClickHouse Data Transfer
ClickHouse官方提供的可视化同步工具,支持全量+增量实时同步,配置化操作,适合企业级场景。
核心特性
- 支持ClickHouse到ClickHouse的实时同步、增量同步、全量初始化
- 可配置同步表、过滤条件、并发数等参数,适配高吞吐量需求
- 内置监控,可查看同步进度、吞吐量、错误日志
优势与注意事项
- 优势:官方维护,适配全版本ClickHouse,无需自行开发代码
- 注意:需部署Data Transfer服务;需确保源与目标网络连通,配置合适的同步并发数避免源服务器过载
选型建议
- 实时同步+无额外组件:选Materialized View + Distributed表
- 解耦源目标+应对峰值:选Kafka Engine方案
- 低实时性+低成本:选定时增量拉取
- 企业级配置化需求:选ClickHouse Data Transfer
内容的提问来源于stack exchange,提问作者Majid Chaudhary
相关产品推荐
相关产品推荐

