Elasticsearch基于仲裁的选举策略

选举主节点和改变集群状态是两个最根本的任务因为所有正常的主节点必须一起正常工作。即使在某些节点挂了时维持这些工作的稳定是非常重要的。ES通过考虑每个动作都收到仲裁节点成功的响应来实现健壮性,仲裁节点是集群中可用主节点的子集。使用一个子集响应的优点是,即使某些节点挂了也不会阻止集群继续执行任务。仲裁节点需要谨慎选取以防集群脑裂,就是说集群被分成了两部分并且每一部分可能做出一些与另一部分不一致的决定。

ES允许你可以在正在运行的集群中增加或者删除节点,大多情况下,只需要简单的启动或者关闭节点即可。

在添加或者删除节点时,ES通过更新集群的投票配置来维护最佳容错级别,投票配置时一组符合符合主节点条件的节点,在做出选择新主节点或者提交新集群状态等决策时,它们的响应会被进行统计。当收到投票配置中半数以上节点的响应时会做出决定。通常来说投票配置中的节点集合与当前集群中所有符合主节点的节点集合保持一致,但在某些情况下会有所不同。

为了确保集群可用,千万不要在同一时间关闭投票配置中半数以上的节点。只要半数以上的投票节点正常工作,集群就会正常工作。比如一个集群中有三个或四个符合主节点条件的节点,集群可以忍受其中一个节点挂掉。如果仅有两个或者一个符合主节点的节点,它们必须全都可用。

在一个节点加入或者离开集群之后,被选举的主节点必须报告集群状态来更新投票配置中的节点,这个过程在很短时间内完成。在从集群中移除更多节点之前等投票配置更新完成是很重要的。

主节点选举

不论在启动或者现有的被选举的主节点失败时,ES都是用一个选择进程来同意一个被选择的节点。任何符合主节点条件的节点都可以开始选举,通常第一次选举就会成功。只有当两个节点碰巧同时开始选举时,选举才会失败,所以每个节点上的选择都是随机时间触发的,以减少这种情况发生的概率。在选出主节点之前节点将重试选举,并在失败时退出,这样保证选举最终会成功。主节点选举的触发事件是可以配置的。

集群维护,滚动重启和维护

需要集群维护任务会涉及到一个或多个节点的暂时下线然后重新上线。默认情况下,如果集群中的一个符合主节点的节点下线,集群依然可用,比如滚动重启。另外,如果多个节点先停掉然后又启动,那么集群会自动回复,比如在整个集群重启阶段。这些情况都无需额外的操作,因为主节点集合不是永久不变的。

原文