在集群中添加和移除节点

编辑

启动 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