原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/modules-discovery-voting.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/modules-discovery-voting.html

投票配置 (Voting configurations)

每个 Elasticsearch 集群都有一个投票配置,这是一组符合主节点条件的节点,在做出决策(如选举新的主节点或提交新的集群状态)时,会计入这些节点的响应。 只有在投票配置中的大多数(超过一半)节点响应后,才能做出决策。

通常,投票配置与集群中当前所有符合主节点条件的节点集相同。 但是,在某些情况下,它们可能会有所不同。

为了确保集群保持可用,你不能同时停止投票配置中一半或更多的节点。 只要有一半以上的选举节点可用,集群仍然可以正常工作。 这意味着,如果有三个或四个符合主节点条件的节点,集群可以容忍其中一个节点不可用。 如果有两个或更少的符合主节点条件的节点,它们都必须保持可用。

节点加入或离开集群后,Elasticsearch 会自动对投票配置进行相应的更改,以确保集群尽可能具有弹性。 在从集群中删除更多节点之前,请等待调整完成,这一点很重要。 更多信息请参考 添加和移除节点

当前投票配置存储在集群状态中,因此你可以按如下方式检查其当前内容:

GET /_cluster/state?filter_path=metadata.cluster_coordination.last_committed_config

当前的投票配置不一定与集群中所有可用的符合主节点条件的节点集相同。 更改投票配置涉及选举,因此当节点加入或离开集群时,需要一些时间来调整配置。 此外,还存在最具弹性的配置包括不可用节点或不包括一些可用节点的情况。 在这些情况下,投票配置不同于集群中可用的符合主节点条件的节点集。

较大的投票配置通常更有弹性,因此 Elasticsearch 通常倾向于在加入集群后将符合主节点条件的节点添加到投票配置中。 类似地,如果投票配置中的一个节点离开集群,而集群中有另一个符合主节点条件的节点不在投票配置中,那么最好交换这两个节点。 因此,投票配置的大小保持不变,但其弹性增加了。

在节点离开集群后,从投票配置中自动删除节点并不容易。 不同的策略有不同的优点和缺点,因此正确的选择取决于如何使用集群。 可以使用 cluster.auto_shrink_voting_configuration 设置来控制投票配置是否自动收缩。

如果 cluster.auto_shrink_voting_configuration 设置为 true (这是默认值,也是推荐值),且集群中至少有三个符合主节点条件的节点,只要除了一个符合主节点条件的节点之外的所有节点都正常,Elasticsearch 就能够处理集群状态更新。

在某些情况下,Elasticsearch 可能会容忍多个节点的丢失,但这并不能保证在所有故障序列下都是如此。 如果 cluster.auto_shrink_voting_configuration 设置为 false,必须手动从投票配置中删除脱离的节点。 使用 选举排除 API 实现所需的弹性级别。

无论如何配置,Elasticsearch 都不会遭遇“大脑分裂”式的不一致。 cluster.auto_shrink_voting_configuration 设置仅影响其某些节点出现故障时的可用性,以及节点加入和离开集群时必须执行的管理任务。

偶数个符合主机条件的节点 (Even numbers of master-eligible nodes)

一个集群中通常应该有奇数个符合主节点条件的节点。 如果是偶数,Elasticsearch 会将其中一个排除在投票配置之外,以确保其大小为奇数。 实际上,稍微改进了一下:如果集群受到网络分区的影响,网络分区将集群分成大小相等的两半,那么其中一半将包含大多数投票配置,并能够继续运行。 如果来自符合主节点条件的节点的所有投票都被计算在内,则任何一方都不会包含绝对多数的节点,因此集群将无法取得任何进展。

例如,如果集群中有四个符合主节点条件的节点,并且投票配置包含所有这些节点,则任何基于法定人数的决策都需要至少其中三个节点的投票。 这种情况意味着集群只能容忍一个符合主节点条件的节点的丢失。 如果将此集群分成相等的两半,则任何一半都不会包含三个符合主节点条件的节点,集群将无法取得任何进展。 但是,如果投票配置只包含四个符合主节点条件的节点中的三个,虽然集群仍然只能完全容忍一个节点的丢失,但是基于法定人数的决策只需要来自三个表决节点中的两个的投票。 在平均分割的情况下,其中一半将包含三个选举节点中的两个,因此另一半将保持可用。

设置初始投票配置

当一个全新的集群第一次启动时,它必须选举它的第一个主节点。 为了进行这种选举,它需要知道一组符合主节点条件的节点,这些节点的投票应该被计算在内。 这种初始投票配置称为引导配置 (bootstrap configuration),在 集群引导过程 中设置。

重要的是,引导配置准确地识别哪些节点应该在第一次选举中投票。 还需要注意的是,引导配置必须来自集群外部:没有安全的方法让集群自己正确地确定引导配置。

如果引导配置设置不正确,当你启动一个全新的集群时,可能会意外形成两个独立的集群,而不是一个。 这种情况可能会导致数据丢失:你可能在发现有任何问题之前就开始使用这两个集群,并且以后不可能将它们合并在一起。

为了说明将每个节点配置为特定集群大小的问题,假设启动一个三节点集群,其中每个节点都知道自己将成为三节点集群的一部分。 三个节点中的大多数是两个节点,所以通常是最先发现彼此的两个节点形成一个集群,第三个节点在短时间后加入它们。 但是,假设错误地启动了四个节点,而不是三个。 在这种情况下,有足够的节点形成两个独立的集群。 当然,如果每个节点都是手动启动的,那么就不太可能启动太多节点。 但是,如果您使用的是自动化的 协调器(orchestrator),则肯定有可能出现这种情况——特别是在协调器不能适应网络分区等故障的情况下。

只有在整个集群第一次启动时才需要初始化法定人数。 加入已建立的集群的新节点可以从已选出的主节点安全地获得它们需要的所有信息。 以前属于集群的节点在重新启动时会将所需的所有信息存储到磁盘中。