精华 ReplicatedMergeTree +Distributed 查分布式表的时候数据重复

发布于 5 年前 作者 cocopc 9102 次浏览 来自 问答

建表语句及插入数据

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>

12 回复

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

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

一样的问题,求教如何配置?

我也出现了重复数据,一个节点的两个副 ben,macros 应该怎么定义

macros 是宏定义,方便建表的,有了这个可以在不同的节点用相同的SQL建表,进一步可以用create table on cluster语法只在一个节点建表 在全部节点生效。 重复数据排除版本BUG,正常来说都是配置导致的。明白相同ZK路径里面存相同数据,metrika.xml 中相同ZK路径的在同一个shared里面就行了。

网上的例子都是语焉不详,没法理解clickhouse的**。比如:

clickhouse-3-0.clickhouse-3.clickhouse.svc.cluster.local :) ****** TABLE test.test_log(date Date, log String) ENGINE = ReplicatedMergeTree(’/clickhouse/{cluster}/tables/test_log’ , ‘{replica}’, date, (date,log), 8192)

****** TABLE test.test_log ( date Date,
log String )
ENGINE = ReplicatedMergeTree(’/clickhouse/{cluster}/tables/test_log’, ‘{replica}’, date, (date, log), 8192)

Received exception from ****** (version 18.14.9): Code: 62. DB::Exception: Received from 192.168.3.106:9000. DB::Exception: No macro cluster in config.

0 rows in set. Elapsed: 0.048 sec.

上面说macros是宏定义,但是我不清楚怎么用。没有搞明白是否需要替换成config.yml中定义的宏的具体的值。

clickhouse-3-0.clickhouse-3.clickhouse.svc.cluster.local :) select * from ******.clusters;

SELECT * FROM ******.clusters

─cluster──────────shard_num──shard_weight──replica_num──host_name────────────────host_address──port──is_local──user─────default_database─*

  • bitbook-******* * 1 * 1 * 1 * clickhouse-0.clickhouse * 172.19.13.69 * 9000 * 0 * default * *
  • bitbook-******* * 1 * 1 * 2 * clickhouse-1.clickhouse * 172.19.7.27 * 9000 * 0 * default * *
  • bitbook-******* * 2 * 1 * 1 * clickhouse-2.clickhouse * 172.19.6.27 * 9000 * 0 * default * *
  • bitbook-******* * 2 * 1 * 2 * clickhouse-3.clickhouse * 172.19.8.84 * 9000 * 0 * default * *
    ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*

4 rows in set. Elapsed: 0.003 sec.

这里replia和shard,谁能好好讲讲,完全没有搞清楚头绪。

@xiaods 有没有宏定义不影响集群,只是方便建表。 你例子里面建表的{} 都不需要修改,会由ch执行的时候自动替换成config.xml里面配置的值。比如{replica}。这样的好处是比如在分片1上面执行的zk路径是/tbl1/01,在分片2上面就要改成/tbl1/02.有了宏定义,sql就可以统一成/tbl1/{replica}。

@helloworld_001 谢谢解惑,我一直以为需要替换,你的提醒解决了我的疑惑。感谢。

@helloworld_001 不知道如何*作的,在一个shard里面,replica是没有按照宏定义变化的。这个让我很困惑,并且{cluster}这个宏也不起效果

@xiaods 不知道你是怎么看是否起作用的。执行之后看建表语句依然是{}的形式。你可以去zk上看是否在对应的路径创建目录

@helloworld_001 解决了。是我的macro.xml这个没有定义。

回到顶部