在集群中添加和删除节点

编辑

当您启动一个 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。此预期行为确保您可以在默认启用安全性的情况下启动单节点集群,而无需任何其他配置。

在注册新节点之前,通常需要在生产集群中执行其他操作,例如绑定到 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 将节点添加到投票配置排除列表中。例如

resp = client.cluster.post_voting_config_exclusions(
    node_names="node_name",
)
print(resp)

resp1 = client.cluster.post_voting_config_exclusions(
    node_names="node_name",
    timeout="1m",
)
print(resp1)
const response = await client.cluster.postVotingConfigExclusions({
  node_names: "node_name",
});
console.log(response);

const response1 = await client.cluster.postVotingConfigExclusions({
  node_names: "node_name",
  timeout: "1m",
});
console.log(response1);
# 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 的调用失败,您可以安全地重试。只有成功的响应才能保证该节点实际上已从投票配置中删除并且不会被恢复。如果选出的主节点从投票配置中排除,那么如果还有这样的节点可用,它将退位给仍然在投票配置中的另一个有资格成为主节点的节点。

虽然投票配置排除 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
const response = await client.cluster.state({
  filter_path: "metadata.cluster_coordination.voting_config_exclusions",
});
console.log(response);
GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions

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

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

resp = client.cluster.delete_voting_config_exclusions()
print(resp)

resp1 = client.cluster.delete_voting_config_exclusions(
    wait_for_removal=False,
)
print(resp1)
const response = await client.cluster.deleteVotingConfigExclusions();
console.log(response);

const response1 = await client.cluster.deleteVotingConfigExclusions({
  wait_for_removal: "false",
});
console.log(response1);
# 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