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
相关产品推荐
相关产品推荐

