Clickhouse同一条sql执行结果不同

描述和解决

  • 环境
    Distributed + MergeTree, 2分片2副本, 4节点
  • 问题
    数据插入到ck, 每次查询结果不大一样
  • 步骤
  1. 查看所有时钟是否同步, 经排查有一天机器的时间在2020年, 修正后重启, 问题依旧存在
  2. 检查/etc/metrika.xml配置, internal_replication是否设置为false, 改完后数据查询正常

    官方文档来看这个值的意思是是否启用内部布置, 如果配置了true, 那么写入数据时只会同步到第一个健康的副本, 不会同步所有副本, 那么就会可能导致数据不一致

配置详解

四种复制模式

  1. 非复制表,internal_replication=false。写入单机表时,不同服务器查询结果不同;插入到分布式表中的数据被插入到两个本地表中,如果在插入期间没有问题,则两个本地表上的数据保持同步。我们称之为“穷人的复制”,因为复制在网络出现问题的情况下容易发生分歧,没有一个简单的方法来确定哪一个是正确的复制。
  2. 非复制表,internal_replication=true。数据只被插入到一个本地表中,但没有任何机制可以将它转移到另一个表中。因此,在不同主机上的本地表看到了不同的数据,查询分布式表时会出现非预期的数据。显然,这是配置ClickHouse集群的一种不正确的方法。
  3. 复制表,internal_replication=true。插入到分布式表中的数据仅插入到其中一个本地表中,但通过复制机制传输到另一个主机上的表中。因此两个本地表上的数据保持同步。这是官方推荐配置。
  4. 复制表,internal_replication=false。数据被插入到两个本地表中,但同时复制表的机制保证重复数据会被删除。数据会从插入的第一个节点复制到其它的节点。其它节点拿到数据后如果发现数据重复,数据会被丢弃。这种情况下,虽然复制保持同步,没有错误发生。但由于不断的重复复制流,会导致写入性能明显的下降。所以这种配置实际应该是避免的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容