You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从多台ClickHouse服务器向目标节点同步数据的方案咨询

解决方案:4台ClickHouse到第5台的高吞吐量同步方案

针对你每秒10万条插入、24小时高负载的场景,以下是无需文件中转的持续推送/拉取、定时加载方案:

一、实时拉取:Materialized View + Distributed表

这是ClickHouse原生支持的实时拉取方案,无需额外组件,适配高吞吐量需求。

操作步骤

  1. 在目标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>
  1. 在目标机创建指向各源表的Distributed表:
CREATE TABLE source1_distributed 
AS source_db.source_local_table
ENGINE = Distributed(source_cluster_1, source_db, source_local_table, rand());
  1. 创建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语义。

操作步骤

  1. 源端配置:创建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;
  1. 目标端配置:创建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

三、定时增量拉取:脚本+定时任务

适用于对实时性要求不高(分钟级)的场景,实现简单,可控性强。

操作步骤

  1. 在目标机创建指向各源表的Distributed表(同方案一)
  2. 编写同步脚本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的数据
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:29:58