对 ClickHouse 复制的 count() 查询
count() query on ClickHouse replication
你好 ClickHouse 期待,
我正在不使用 zookeeper 测试 ClickHouse 复制以了解其工作原理并有 2 个问题。
我是如何测试的:
- 在不同的虚拟机(21.9.4 修订版 54449)上设置 3 clickhouse-server(CH1、CH2、CH3)
- 有一个使用这 3 个服务器的集群(配置见下文)
- 有一个 MergeTree (log_local) 和一个 Distributed (log_all) tables
- 通过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(或不同名称)的 select count() 产生 100M 而不是 200M。
Configs(为了不显示隐私信息,我修改了一些原来的名字):
# 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 上方的 Distributed table 和 internal_replication=false 集群设置,但在那种情况下,无法保证所有副本都具有100% 相同的数据,所以我宁愿不推荐这种情况。”
类似问题讨论:
- https://github.com/ClickHouse/ClickHouse/issues/1443
- https://github.com/ClickHouse/ClickHouse/issues/6735
提前致谢。
您已经配置了一个“循环复制”。上帝保佑你。
此配置不受支持,并且未包含在 CI 中的测试中。
Circle-replication 很难配置,对新手来说很不明显。
循环复制提供了很多问题和调试难度。
很多查询产生不正确的结果。
过去使用循环复制的大多数用户现在转移到通常的设置 N 分片 * M 副本并且很高兴。
https://kb.altinity.com/engines/
在您的配置中缺少 DEFAULT_DATABASE
属性,没有它循环复制将无法工作。
你好 ClickHouse 期待,
我正在不使用 zookeeper 测试 ClickHouse 复制以了解其工作原理并有 2 个问题。
我是如何测试的:
- 在不同的虚拟机(21.9.4 修订版 54449)上设置 3 clickhouse-server(CH1、CH2、CH3)
- 有一个使用这 3 个服务器的集群(配置见下文)
- 有一个 MergeTree (log_local) 和一个 Distributed (log_all) tables
- 通过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(或不同名称)的 select count() 产生 100M 而不是 200M。
Configs(为了不显示隐私信息,我修改了一些原来的名字):
# 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 上方的 Distributed table 和 internal_replication=false 集群设置,但在那种情况下,无法保证所有副本都具有100% 相同的数据,所以我宁愿不推荐这种情况。”
类似问题讨论:
- https://github.com/ClickHouse/ClickHouse/issues/1443
- https://github.com/ClickHouse/ClickHouse/issues/6735
提前致谢。
您已经配置了一个“循环复制”。上帝保佑你。
此配置不受支持,并且未包含在 CI 中的测试中。
Circle-replication 很难配置,对新手来说很不明显。
循环复制提供了很多问题和调试难度。
很多查询产生不正确的结果。
过去使用循环复制的大多数用户现在转移到通常的设置 N 分片 * M 副本并且很高兴。
https://kb.altinity.com/engines/
在您的配置中缺少 DEFAULT_DATABASE
属性,没有它循环复制将无法工作。