clickhouse - 关于 ClickHouse 复制的 count() 查询
问题描述
您好 ClickHouse 预计,
我正在测试没有 zookeeper 的 ClickHouse 复制,以了解它是如何工作的并且有 2 个问题。
我是如何测试的:
- 在不同的虚拟机上设置 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% 相同的数据,所以我不推荐这种情况。”</li>
类似问题讨论:
- https://github.com/ClickHouse/ClickHouse/issues/1443
- https://github.com/ClickHouse/ClickHouse/issues/6735
提前致谢。
解决方案
您已经配置了“循环复制”。愿上帝保佑你。
此配置不受支持,也不包含在 CI 中的测试中。
循环复制很难配置,对于新手来说非常不明显。
循环复制提供了很多问题和调试难度。
很多查询会产生不正确的结果。
过去使用循环复制的大多数用户都转移到了通常的设置 N shards * M 副本,现在很开心。
https://kb.altinity.com/engines/
在您的配置DEFAULT_DATABASE
属性中丢失,没有它,circle-replication 将无法工作。
推荐阅读
- atg - 如何编写 RQLQuery?
- python - 在python中将字符串转换为日期时间对象
- r - 使用 RDCOMClient 创建新的 Excel 应用程序
- ios - 如何在快速滑动推送和弹出视图控制器时保持导航屏幕
- javascript - VueJS 只允许基于类名选择 1 个复选框
- python - 用于在训练之外的对象级别上从语义分割评估预测边界框的度量
- selenium - 如何使用 Sibling 为下一个 Div 编写 Xpath
- android - react native 卡在配置 react-native-gesture-handler
- autodesk-forge - 如何在面板上禁用 Autodesk-forge mouseHover
- c - How to change the Hex dump of a process in C