elasticsearch集群的主节点选举
# 正文
ES集群处理的事项里,包含这2个任务:a.选举集群的主节点,b.变更集群状态。这2个事项是master-eligible nodes(拥有主节点候选资质的节点,尾注0)共同做决策的。因为单个节点有可能失效,所以就需要一个制度设计,以保证集群的健壮性。这种制度设计可以表述为:
- ES集群只在收到了一定节点数的成功答复才做出集体决策;
- 这里的“一定节点数”即法定节点数(quorum),它是master-eligible nodes的一个子集,这个子集里的节点即 voting nodes(尾注1)。
这种设计的效果是:某些节点失效不会让整个集群失效,也避免了"split brain"(尾注2)。
ES支持向一个正在运行的集群添加或删除master-eligible节点(尾注3)。
当有节点加入或移除时,elasticserach会更新集群的voting configuration(尾注4),以维持最佳的容错水平。
只有半数以上的voting nodes给出应答后,才做出决策(A decision is made only after more than half of the nodes in the voting configuration have responded)。
为了让集群可用,不能同时停止集群中一半或更多的voting configuration节点。好拗口,看原文吧:To be sure that the cluster remains available you must not stop half or more of the nodes in the voting configuration at the same time。
只要半数以上的votings nodes可用,集群的状态就可用。就是说:
- 拥有3个master-eligible nodes的集群,其中一个失效时,集群仍可用;
- 拥有4个master-eligible nodes的集群,其中一个失效时,集群仍可用(如果2个就不行);
- 拥有2个master-eligible nodes的集群,其中一个失效了,集群就不可用了(故事环节)。
这个很重要:当集群有节点加入或离开后,集群的主节点就会提议更新集群状态(因为需要调整voting configuration),因为需要voting nodes的半数以上做出应答,所以要完成这个动作需要一点时间。想要再给集群加/减节点,一定要等待集群的这个动作完成后再做。
PS: 这里也没说该如何查看集群是否完成了调整voting configuration的动作,看到时再补充吧。
集群最初启动时,以及主节点失效时,es就启动主节点选举程序。
所有master-eligible节点都可能发起一个选举,通常最早发生的选举会成功(有最终结果)。
一般“选举失败”只在有2个节点几乎同时发起选举的情况下才发生,
所以每个节点都有发起选举的时间表,而且这个时间表是随机安排的,以减少“选举失败”的概率。
只要主节点没有被选出,所有master-eligible节点都会重新尝试发起选举,直到主节点被选出。
主节点选举的相关的设置,这里有介绍:
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-discovery-settings.html#master-election-settings
若干集群维护相关的任务都涉及关闭一个或更多的节点,并在稍后启动它们。
大多数情况下,一个节点失效时es集群仍可用。
而且,如果多个节点停止后再启动,集群也会自动恢复(比如整个集群重启的场景);因为主节点相关的设置没有改变,所以没必要做什么干预。
参考资料:尾注n。
# 故事环节:
某大氪户采购的我司产品用的es数据库一度是一个2台设备做成的集群;其中的一台设备(下文称设备B吧,简便)只作为es集群使用。2024年上半年,有2位同事去把设备B制作成新版的产品单独使用了,并在向我介绍这个氪户的情况时说过"ES掉了一个节点还能用"。这不和官网的说法矛盾么,理解不了。想了下,应该是因为设备B上的ES节点不是一个master-eligible node,而是一个data node;否则不会有这个效果。想到这,就抓紧去问当事人"当初做节点是不是作为data node",得到答复曰"这个太早了,当初也不是我部署的,记不住了"。
# 尾注集合
尾注0,eligible的词义

尾注1
有主节点候选资质不代表拥有表决权。
网页的下文提到了这个:如果master-eligible nodes的数量为偶数,那么会有一个节点不具备表决权,以确保voting nodes的数量为奇数,避免投票时五五开。这个网页说到过偶数个有候选资格的节点,但只会给奇数个节点表决权:
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-discovery-voting.html

尾注2
"split brain" 是医学术语,这里指的是一种故障状态:集群分成2片且2片做出的决策不一致
尾注3,如何向es集群添加或删除节点
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/add-elasticsearch-nodes.html
尾注4
原文:
Each Elasticsearch cluster has a voting configuration, which is the set of master-eligible nodes whose responses are counted when making decisions such as electing a new master or committing a new cluster state.
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-discovery-voting.html
尾注n
以上参考:
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-discovery-quorums.html


更多推荐




所有评论(0)