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

ClickHouse分布式表查询出现重复数据问题求助

ClickHouse集群查询重复数据问题排查

集群部署情况

部署3节点ClickHouse集群,配置为3个分片,每个分片包含2个副本。

集群XML配置

<default_cluster>
   <shard>
      <internal_replication>true</internal_replication>
      <replica>
         <default_database>shard</default_database>
         <host>clickhouse-0</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
      <replica>
         <default_database>replica</default_database>
         <host>clickhouse-2</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
   </shard>
   <shard>
      <internal_replication>true</internal_replication>
      <replica>
         <default_database>shard</default_database>
         <host>clickhouse-1</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
      <replica>
         <default_database>replica</default_database>
         <host>clickhouse-0</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
   </shard>
   <shard>
      <internal_replication>true</internal_replication>
      <replica>
         <default_database>shard</default_database>
         <host>clickhouse-2</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
      <replica>
         <default_database>replica</default_database>
         <host>clickhouse-1</host>
         <port>9000</port>
         <user>default</user>
         <password>default</password>
      </replica>
   </shard>
</default_cluster>

执行的操作

create database test on cluster default_cluster;

CREATE TABLE  test.test_distributed_order_local on cluster default_cluster
(
id integer,
test_column String
) 
ENGINE = ReplicatedMergeTree('/default_cluster/test/tables/test_distributed_order_local/{shard}', '{replica}') 
PRIMARY KEY id
ORDER BY id;

CREATE TABLE  test.test_distributed_order on cluster default_cluster as test.test_distributed_order_local
ENGINE = Distributed(default_cluster, test, test_distributed_order_local, id);

insert into test.test_distributed_order values (1, 'test1');
insert into test.test_distributed_order values (2, 'test2');
insert into test.test_distributed_order values (3, 'test3');

问题现象

查询test.test_distributed_order时结果不一致,存在重复数据:

  • 结果1:出现重复行(如id=1多次出现)
  • 结果2:数据行数与预期插入的3行不符

问题原因与解决方法

1. 核心问题:分片副本的默认数据库不一致

集群配置中每个分片的两个副本指定了不同的default_database(shard和replica),但创建的test库是全局同步的,这会导致:

  • Distributed表路由数据时,错误访问不同数据库下的同名表,副本间表数据同步路径混乱;
  • internal_replication=true配置失效,查询时会遍历同一个分片的所有副本,从而出现重复数据。

修复:
修改集群XML配置,将所有replica的default_database统一设置为test(或留空使用会话默认数据库):

<replica>
   <default_database>test</default_database>
   <!-- 其余host、port等配置保持不变 -->
</replica>

2. ReplicatedMergeTree的ZK路径同步异常

由于副本数据库不一致,ZooKeeper中会出现多个同名表的同步路径,导致副本间数据同步混乱。

修复:
配置修改完成后,删除现有test库及表,重新创建:

DROP DATABASE test ON CLUSTER default_cluster;

重启所有ClickHouse节点后,重新执行创建库、表和插入数据的操作。

3. 数据同步延迟问题

插入数据后,ReplicatedMergeTree副本间同步需要时间,立即查询可能出现数据不一致。

验证:
查询前执行强制同步命令:

SYSTEM SYNC REPLICA test.test_distributed_order_local;

等待同步完成后再查询。

内容的提问来源于stack exchange,提问作者Marius Butan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:40:57