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

向集群中添加/移除节点

当你启动一个 Elasticsearch 实例时,你就是在启动一个节点。 Elasticsearch 集群(cluster)是一组具有相同 cluster.name 属性的节点。 当节点加入或离开集群时,集群会自动进行自我重组,以便在可用节点之间均匀分布数据。

如果你运行的是 Elasticsearch 的单个实例,那么你拥有一个单节点的集群。 所有主分片都驻留在单个节点上。 无法分配副本分片,因此集群状态保持 yellow(黄色)。 虽然这个集群功能齐全,但在发生故障时有丢失数据的风险。

A cluster with one node and three primary shards

你可以向集群中添加节点,以增加其容量和可靠性。 默认情况下,一个节点既是数据节点,也是一个有资格被选为控制集群的主节点。 你还可以为特定目的配置新节点,例如预处理请求。 更多信息请参考 节点

当你向集群中添加更多节点时,它会自动分配副本分片。 当所有主碎片和副本碎片都处于活动状态时,集群状态会变为 green(绿色)。

A cluster with three nodes

你可以在本地机器上运行多个节点,以试验由多个节点组成的 Elasticsearch 集群的行为。 要向本地计算机上运行的集群添加节点,请执行以下操作:

  1. 设置一个新的 Elasticsearch 实例。
  2. 使用配置文件 elasticsearch.yml 中的 cluster.name 设置指定分类的名称。 例如,要将一个节点添加到 logging-prod 集群,请将行 cluster.name: "logging-prod" 添加到 elasticsearch.yml
  3. 启动这个 Elasticsearch 实例。该节点会自动发现并加入指定的集群。

要将节点添加到运行在多台机器上的集群中,还必须设置 set discovery.seed_hosts,以便新节点可以发现集群的其余部分。

有关发现和分片分配的更多信息,请参考 发现和集群形成集群级的分片分配和路由设置

符合主节点条件的节点 (Master-eligible nodes)

随着节点的添加或删除,Elasticsearch 通过自动更新集群的投票配置来保持最佳的容错级别,投票配置是一组 符合主节点条件的节点 ,在做出诸如选举新的主节点或提交新的集群状态等决策时,会计入这些节点的响应。

建议在一个集群中有少量固定数量的符合主节点条件的节点,并且只通过添加和删除不符合主节点条件的节点来扩大和缩小集群。 但是,在某些情况下,可能需要在集群中添加或删除一些符合主节点条件的节点。

添加符合主节点条件的节点 (Adding master-eligible nodes)

如果你希望向集群添加一些节点,只需配置新的节点来找到现有的集群并启动它们。 如果合适的话,Elasticsearch 会将新节点添加到投票配置中。

在主节点选举期间或加入已形成的集群时,节点向主节点发送加入请求,以便正式加入集群。 可以使用 cluster.join.timeout 设置来配置节点在发送加入集群的请求后等待的时间。 其默认值为 30s。 参考 发现和集群形成设置

移除符合主节点条件的节点 (Removing master-eligible nodes)

删除符合主节点条件的节点时,不要同时删除太多节点,这一点很重要。 例如,如果当前有七个符合主节点条件的节点,而你希望将其减少到三个,则不可能简单地一次停止四个节点:这样做将只剩下三个节点,这还不到投票配置的一半,这意味着集群不能采取任何进一步的操作。

更准确地说,如果你同时关闭一半或更多个符合主节点条件的节点,那么集群通常会变得不可用。 如果发生这种情况,可以通过再次启动被移除的节点来使集群重新上线。

只要集群中至少有三个符合主节点条件的节点,一般来说,最好一次移除一个节点,让集群有足够的时间来自动调整投票配置,并使容错级别适应新的节点集。

如果只剩下两个符合主节点条件的节点,则两个节点都不能安全移除,因为两个节点都需要可靠地取得进展。 要删除这些节点中的一个,必须首先通知 Elasticsearch 它不应该是投票配置的一部分,而是应该将投票权给予另一个节点。 然后,你可以让被排除的节点脱机,而不会阻止其他节点继续工作。 添加到投票配置排除列表中的节点仍然正常工作,但 Elasticsearch 试图将其从投票配置中删除,因此不再需要其投票。 重要的是,Elasticsearch 永远不会自动将投票排除列表上的节点移回到投票配置中。 一旦排除的节点成功地从投票配置中自动重新配置出来,就可以安全地将其关闭,而不会影响集群的主节点级别可用性。 可以使用 投票配置排除 API 将节点添加到投票配置排除列表中。例如:

# Add node to voting configuration exclusions list and wait for the system
# to auto-reconfigure the node out of the voting configuration up to the
# default timeout of 30 seconds
POST /_cluster/voting_config_exclusions/node_name

# Add node to voting configuration exclusions list and wait for
# auto-reconfiguration up to one minute
POST /_cluster/voting_config_exclusions/node_name?timeout=1m

在这里,应该添加到排除列表中的节点是使用 节点过滤器(node filters)而不是 node_name 来指定的。 如果对投票配置排除API的调用失败,你可以安全地重试。 只有成功的响应才能保证该节点实际上已经从投票配置中删除,并且不会被恢复。 如果它是从投票配置中删除的活动的主节点,那么它将让位于仍在投票配置中的另一个符合主节点条件的节点,如果这样的节点可用的话。

尽管投票配置在排除 API 对于将两节点集群缩减为单节点集群场景下最有用,但是也可以使用它同时删除多个符合主节点条件的节点。 向排除列表中添加多个节点会使系统尝试从投票配置中自动重新配置所有这些节点,允许它们安全关闭,同时又能保持集群可用。 在上述示例中,将七个主节点的集群缩减到只有三个主节点,你可以将四个节点添加到排除列表中,等待确认,然后同时关闭它们。

只有在短时间内从集群中删除至少一半符合主节点条件的节点时,才需要投票排除。 在删除不符合主节点条件的节点时不需要它们,在删除少于一半的符合主节点条件的节点时也不需要它们。

为节点添加排除项会在投票配置排除列表中为该节点创建一条记录,这将使系统自动尝试重新配置投票配置以删除该节点,并防止它在删除后返回投票配置。 当前的排除列表存储在集群状态中,可以按如下方式进行检查:

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

此列表的大小受 cluster.max_voting_config_exclusions 设置的限制,默认值为 10。 参考 发现和集群形成设置。 由于投票配置排除是持久的且数量有限,因此必须对其进行清理。 通常,在集群上执行某些维护时会添加一个排除项,维护完成后会清除这些排除项。 在正常操作中,集群应该没有投票配置排除。

如果某个节点因为要永久关闭而被排除在投票配置之外,则可以在该节点关闭并从集群中删除后,再将其排除。 如果排除项是误创建的或者只是临时需要的,也可以将其清除:

# Wait for all the nodes with voting configuration exclusions to be removed from
# the cluster and then remove all the exclusions, allowing any node to return to
# the voting configuration in the future.
DELETE /_cluster/voting_config_exclusions

# Immediately remove all the voting configuration exclusions, allowing any node
# to return to the voting configuration in the future.
DELETE /_cluster/voting_config_exclusions?wait_for_removal=false