【发布时间】:2021-12-05 18:02:31
【问题描述】:
你好 ClickHouse 期望,
我正在测试没有 zookeeper 的 ClickHouse 复制,以了解它的工作原理并有 2 个问题。
我是如何测试的:
- 在不同的 VM 上设置 3 clickhouse-server(CH1、CH2、CH3)(21.9.4 修订版 54449)
- 拥有一个使用这 3 台服务器的集群(请参阅下面的配置)
- 有一个 MergeTree (log_local) 和一个分布式 (log_all) 表
- 通过log_all向一台服务器(CH1)发送100M日志;使用位于不同 VM 中的 clickhouse-client
(Q1) 插入后,我从所有 3 台服务器查询 log_local 的 count(),总数符合预期(即 200M)。但是,当我使用 log_all 查询时,服务器之间的结果是不同的(接近 200M 但不准确)。更奇怪的是,即使在同一台服务器内,计数也会发生变化。你能解释一下这种行为吗?会不会是配置问题?没有副本 (3shards_1replica) 测试,我看不到这个计数差异。
我认为这不是推荐的,所以最终我会使用集群协调器 - 希望届时 clickhouse-keeper 能够投入生产。在那个阶段之前,我正在评估是否可以将其用作具有可解释缺点的临时解决方案。
(Q2)这更像是一个关于复制的通用问题。 log_all 的计数是 200M,其中包括副本。我在没有副本的情况下查询它的实用方法是什么?即,从 log_all(或其他名称)中选择 count() 会产生 100M 而不是 200M。
配置(为了不显示私人信息,我已经修改了一些原始名称):
# remote_servers
<log_3shards_2replicas>
<shard>
<replica>
<host>CH1</host>
<port>9000</port>
</replica>
<replica>
<host>CH2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>CH2</host>
<port>9000</port>
</replica>
<replica>
<host>CH3</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>CH3</host>
<port>9000</port>
</replica>
<replica>
<host>CH1</host>
<port>9000</port>
</replica>
</shard>
</log_3shards_2replicas>
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(my_time)
ORDER BY my_time
SETTINGS index_granularity = 8192
ENGINE = Distributed(‘log_3shards_2replicas', ‘my_db’, ‘log_local', rand())
一些参考资料:
- https://github.com/ClickHouse/ClickHouse/issues/2161 fillimonov 评论道:“实际上,您可以在没有 Zookeeper 和 ReplicatedMergeTree 的情况下创建复制,只需使用 MergeTree 上方的分布式表和 internal_replication=false 集群设置,但在这种情况下,无法保证所有副本都具有 100% 相同的数据,所以我宁愿不推荐这种情况。”
类似问题讨论:
- https://github.com/ClickHouse/ClickHouse/issues/1443
- https://github.com/ClickHouse/ClickHouse/issues/6735
提前致谢。
【问题讨论】:
-
更新:根据 Denny 的信息,我使用 NxM 设置(2 个分片和 2 个副本)进行了测试,我的 2 个问题中的查询都正确产生了 100M。再次感谢丹尼。
标签: clickhouse