ReplicatedMergeTree +Distributed 查分布式表的时候数据重复
发布于 2 个月前 作者 cocopc 326 次浏览 来自 问答

建表语句及插入数据

create database test; CREATE TABLE test.test_log(date Date, log String) ENGINE = ReplicatedMergeTree(’/clickhouse/{cluster}/tables/test_log’, ‘{replica}’, date, (date,log), 8192) CREATE TABLE test.test_log_all (date Date,log String) ENGINE = Distributed(ch_cluster, ‘test’, ‘test_log’, rand()) insert into test.test_log (date,log) values (‘2018-03-13’, ‘zhangsan’);

查询结果

  1. 从两台机器的test_log 表中查数据都是一条,正常。
  2. 从test_log_all 表查数据是两条。 这是什么原因呀,表复制和集群的分片到底是怎么回事呀,忘大家指导一下。

metrika.xml 配置

<yandex> <clickhouse_remote_servers> <ch_cluster> <shard> <internal_replication>true</internal_replication> <replica> <host>appli002</host> <port>9011</port> </replica> </shard> <shard> <internal_replication>true</internal_replication> <replica> <host>appli004</host> <port>9011</port> </replica> </shard> </ch_cluster> </clickhouse_remote_servers> <macros> <cluster>ch_cluster</cluster> <replica>appli002</replica> </macros> <networks> <ip>::/0</ip> </networks> <zookeeper-servers> <node index=“1”> <host>appli002</host> <port>2181</port> </node> <node index=“2”> <host>appli004</host> <port>2181</port> </node> <node index=“3”> <host>appli005</host> <port>2181</port> </node> </zookeeper-servers> <clickhouse_compression> <case> <min_part_size>10000000000</min_part_size> <min_part_size_ratio>0.01</min_part_size_ratio> <method>lz4</method> </case> </clickhouse_compression> </yandex>

2 回复

问题解决: 表复制和创建zk的节点路径是一致的。 如上所创建的路径,/clickhouse/{cluster}/tables/test_log,所有的节点拥有完整的数据,也就是说appli002 和appli004 上都拥有该表的所有数据,Distributed引擎,是对两个分片的数据做的汇总,就会出现上述查分布式表会有两条数据。 正确的做法是,在每个节点macros定义中添加shared项,每个节点的值是不一样的, 建表的时候/clickhouse/{cluster}/tables/test_log/{shared}.(最好使用macros定义,不要建表的时候写死,这样当集群规模大了,不好管理。 另外,要理解复制表的话,直接去看一下zk的节点信息就更清晰了。

求教,如果集群规模大了,那么 {shared}路径可以更改吗

回到顶部