首页 > 解决方案 > 关于 ClickHouse 复制的 count() 查询

问题描述

您好 ClickHouse 预计,

我正在测试没有 zookeeper 的 ClickHouse 复制,以了解它是如何工作的并且有 2 个问题。

我是如何测试的:

(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()) 

一些参考资料:

类似问题讨论:

提前致谢。

标签: clickhouse

解决方案


您已经配置了“循环复制”。愿上帝保佑你。

此配置不受支持,也不包含在 CI 中的测试中。

循环复制很难配置,对于新手来说非常不明显。

循环复制提供了很多问题和调试难度。

很多查询会产生不正确的结果。

过去使用循环复制的大多数用户都转移到了通常的设置 N shards * M 副本,现在很开心。

https://kb.altinity.com/engines/

https://youtu.be/4DlQ6sVKQaA

在您的配置DEFAULT_DATABASE属性中丢失,没有它,circle-replication 将无法工作。


推荐阅读