描述和解决
- 环境
Distributed + MergeTree, 2分片2副本, 4节点 - 问题
数据插入到ck, 每次查询结果不大一样 - 步骤
- 查看所有时钟是否同步, 经排查有一天机器的时间在2020年, 修正后重启, 问题依旧存在
- 检查/etc/metrika.xml配置, internal_replication是否设置为false, 改完后数据查询正常
从官方文档来看这个值的意思是是否启用内部布置, 如果配置了true, 那么写入数据时只会同步到第一个健康的副本, 不会同步所有副本, 那么就会可能导致数据不一致
配置详解
- 非复制表,internal_replication=false。写入单机表时,不同服务器查询结果不同;插入到分布式表中的数据被插入到两个本地表中,如果在插入期间没有问题,则两个本地表上的数据保持同步。我们称之为“穷人的复制”,因为复制在网络出现问题的情况下容易发生分歧,没有一个简单的方法来确定哪一个是正确的复制。
- 非复制表,internal_replication=true。数据只被插入到一个本地表中,但没有任何机制可以将它转移到另一个表中。因此,在不同主机上的本地表看到了不同的数据,查询分布式表时会出现非预期的数据。显然,这是配置ClickHouse集群的一种不正确的方法。
- 复制表,internal_replication=true。插入到分布式表中的数据仅插入到其中一个本地表中,但通过复制机制传输到另一个主机上的表中。因此两个本地表上的数据保持同步。这是官方推荐配置。
- 复制表,internal_replication=false。数据被插入到两个本地表中,但同时复制表的机制保证重复数据会被删除。数据会从插入的第一个节点复制到其它的节点。其它节点拿到数据后如果发现数据重复,数据会被丢弃。这种情况下,虽然复制保持同步,没有错误发生。但由于不断的重复复制流,会导致写入性能明显的下降。所以这种配置实际应该是避免的。