在集群中添加和删除节点编辑

启动 Elasticsearch 实例时,您将启动一个*节点*。Elasticsearch *集群*是具有相同 cluster.name 属性的一组节点。当节点加入或离开集群时,集群会自动重新组织自身,以将数据均匀分布在可用节点上。

如果您正在运行单个 Elasticsearch 实例,则您拥有一个包含一个节点的集群。所有主分片都驻留在单个节点上。无法分配副本分片,因此集群状态保持黄色。集群功能齐全,但在发生故障时存在数据丢失的风险。

A cluster with one node and three primary shards

您可以向集群添加节点以提高其容量和可靠性。默认情况下,节点既是数据节点,也有资格被选为主节点来控制集群。您还可以为特定目的配置新节点,例如处理摄取请求。有关更多信息,请参阅 节点

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

A cluster with three nodes

将节点注册到现有集群编辑

您可以在本地计算机上注册其他节点,以试验具有多个节点的 Elasticsearch 集群的行为方式。

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

当 Elasticsearch 首次启动时,安全自动配置过程会将 HTTP 层绑定到 0.0.0.0,但仅将传输层绑定到本地主机。这种预期行为可确保您可以在默认情况下启用安全性的情况下启动单节点集群,而无需任何其他配置。

在注册新节点之前,生产集群中通常需要执行其他操作,例如绑定到 localhost 以外的地址或满足引导检查。在此期间,自动生成的注册令牌可能会过期,这就是不自动生成注册令牌的原因。

此外,只有同一主机上的节点才能加入集群,而无需其他配置。如果您希望来自另一台主机的节点加入您的集群,则需要将 transport.host 设置为 支持的值(例如取消注释建议的 0.0.0.0 值),或绑定到其他主机可以访问的接口的 IP 地址。有关更多信息,请参阅 传输设置

要将新节点注册到您的集群,请使用集群中任何现有节点上的 elasticsearch-create-enrollment-token 工具创建注册令牌。然后,您可以使用 --enrollment-token 参数启动新节点,以便它加入现有集群。

  1. 在 Elasticsearch 运行位置以外的单独终端中,导航到您安装 Elasticsearch 的目录,然后运行 elasticsearch-create-enrollment-token 工具为您的新节点生成注册令牌。

    bin\elasticsearch-create-enrollment-token -s node

    复制注册令牌,您将使用它将新节点注册到您的 Elasticsearch 集群。

  2. 从新节点的安装目录中,启动 Elasticsearch 并使用 --enrollment-token 参数传递注册令牌。

    bin\elasticsearch --enrollment-token <enrollment-token>

    Elasticsearch 会在以下目录中自动生成证书和密钥

    config\certs
  3. 对您要注册的任何新节点重复上一步。

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

符合主节点条件的节点编辑

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

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

添加符合主节点条件的节点编辑

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

在主节点选举期间或加入现有已形成的集群时,节点会向主节点发送加入请求,以便正式添加到集群中。

删除符合主节点条件的节点编辑

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

更准确地说,如果您同时关闭一半或更多符合主节点条件的节点,则集群通常将不可用。如果发生这种情况,您可以通过重新启动已删除的节点来使集群恢复在线。

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

如果只剩下两个符合主节点条件的节点,则这两个节点都不能安全删除,因为可靠地取得进展需要这两个节点。要删除其中一个节点,您必须首先通知 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_names=node_name

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

应添加到排除列表中的节点使用 ?node_names 查询参数按名称指定,或使用 ?node_ids 查询参数按其持久节点 ID 指定。如果对投票配置排除 API 的调用失败,您可以安全地重试。只有成功的响应才能保证节点实际上已从投票配置中删除,并且不会恢复。如果从投票配置中排除了当选的主节点,则它将 abdicate 到投票配置中仍然存在的另一个符合主节点条件的节点(如果存在)。

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

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

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

resp = client.cluster.state(
    filter_path="metadata.cluster_coordination.voting_config_exclusions",
)
print(resp)
response = client.cluster.state(
  filter_path: 'metadata.cluster_coordination.voting_config_exclusions'
)
puts response
GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions

此列表的大小受 cluster.max_voting_config_exclusions 设置的限制,该设置默认为 10。请参阅 发现和集群形成设置。由于投票配置排除是持久的且数量有限,因此必须清理它们。通常,在对集群执行某些维护时会添加排除,并且在维护完成后应清除排除。集群在正常运行时不应有任何投票配置排除。

如果某个节点因为要永久关闭而从投票配置中排除,则可以在关闭该节点并将其从集群中删除后删除其排除。如果排除是错误创建的或只是暂时需要的,也可以通过指定 ?wait_for_removal=false 来清除它们。


# 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