为何单节点Elasticsearch集群未满足法定人数仍可索引文档?
为何单节点Elasticsearch集群在看似未满足法定人数时仍能索引文档?
嘿,这个问题的关键其实在于你可能误解了法定人数的计算逻辑,以及单节点场景下Elasticsearch的默认配置细节。让我给你掰扯清楚:
首先,Elasticsearch判断是否能执行写操作的法定人数(quorum),是基于你索引配置里指定的副本数,而不是当前集群中实际跑起来的副本数。而且这个计算是针对每个分片的「副本组」来的——也就是一个主分片加上它配置的所有副本分片组成的小集合。
法定人数的计算公式是这样的:
int( (1 + number_of_replicas) / 2 ) + 1
这里的number_of_replicas是你在索引设置里写的那个数字,不是当前活跃的副本数量。
那回到单节点集群的情况:
- 当你在单节点上创建索引时,Elasticsearch会自动把
number_of_replicas设为0——毕竟没其他节点能放副本分片啊。这时候代入公式算法定人数:int( (1+0)/2 ) +1 = 1。意思就是,只要这个分片组里有1个活跃分片(也就是主分片本身),就满足要求。而单节点上的主分片肯定是活的,所以自然能正常索引文档。 - 要是你手动把
number_of_replicas改成1(比如之前是多节点集群,后来改成单节点但没调整索引配置),这时候法定人数就变成int( (1+1)/2 ) +1 =2。但单节点只有主分片在运行,副本分片根本没法分配,这时候就真的不满足法定人数了,再尝试索引就会报错,和你提到的那种“无法索引”的场景完全一致。
所以你觉得的“未满足法定人数却允许操作”其实是个错觉——单节点默认配置下,副本数为0,刚好踩中了满足法定人数的条件而已。
内容的提问来源于stack exchange,提问作者Lone Learner
相关产品推荐
相关产品推荐

