预先验证节点移除 API编辑

此功能专为 Elasticsearch 服务Elastic Cloud EnterpriseElastic Cloud on Kubernetes 的间接使用而设计。不支持直接使用。

预先验证节点移除。

请求编辑

POST /_internal/prevalidate_node_removal

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,则必须具有 monitormanage 集群权限 才能使用此 API。

描述编辑

此 API 检查尝试从集群中移除指定节点是否可能成功。对于没有未分配分片的集群,移除任何节点都被认为是安全的,这意味着移除节点很可能成功。

如果集群具有 red 集群健康状态,它将验证移除节点不会冒移除未分配分片的最后一个剩余副本的风险。如果集群中存在红色索引,则 API 会检查红色索引是否为 可搜索快照 索引,如果不是,则会向 API 调用中指定的每个节点发送请求,以验证节点是否可能包含红色索引的本地分片副本,这些副本不是可搜索快照索引。此请求在每个接收节点上进行处理,方法是检查节点是否具有任何红色索引分片的 shard 目录。

响应包括移除指定节点的整体安全性,以及每个节点的详细响应。响应的特定于节点的部分还包括有关为什么移除该节点可能不成功的更多详细信息。

请注意,必须使用查询参数之一(namesidsexternal_ids)来指定节点集。

请注意,如果一组节点的预验证结果返回 true(即很可能成功),这并不意味着所有这些节点都可以一次成功移除,而是每个单独节点的移除都可能成功。实际的节点移除可以通过 节点生命周期 API 处理。

查询参数编辑

master_timeout
(可选,时间单位) 等待主节点的时间段。如果在超时时间到期之前主节点不可用,则请求失败并返回错误。默认为 30s。也可以设置为 -1,表示请求永远不会超时。
timeout
(可选,时间单位) 等待响应的时间段。如果在超时时间到期之前未收到响应,则请求失败并返回错误。默认为 30s
names
(可选,字符串) 以逗号分隔的节点名称列表。
ids
(可选,字符串) 以逗号分隔的节点 ID 列表。
external_ids
(可选,字符串) 以逗号分隔的节点外部 ID 列表。

响应主体编辑

is_safe
(布尔值) 是否安全移除所有提供的节点。
message
(字符串) 提供有关操作为何被认为安全或不安全的更多详细信息的消息。
nodes

(对象) 移除每个提供的节点的预验证结果。

nodes 的属性
<node>

(对象) 包含有关特定节点的移除预验证的信息。

<node> 的属性
id
(字符串) 节点 ID
name
(字符串) 节点名称
external_id
(字符串) 节点外部 ID
result

(对象) 包含节点的移除预验证结果。

result 的属性
is_safe
(布尔值) 是否安全移除节点。
reason

(字符串) 指定预验证结果为何被认为安全或不安全的字符串。它可以是以下值之一

  • no_problems: 预验证没有发现任何可能阻止安全移除节点的问题。
  • no_red_shards_except_searchable_snapshots: 节点可以安全移除,因为所有红色索引都是可搜索快照索引,因此移除节点不会冒移除该索引从集群中的最后一个副本的风险。
  • no_red_shards_on_node: 节点不包含任何红色非可搜索快照索引分片的副本。
  • red_shards_on_node: 节点可能包含一些非可搜索快照红色索引的分片副本。message 字段中指定了可能在节点上的分片列表。
  • unable_to_verify_red_shards: 联系节点失败或超时。message 字段中提供了更多详细信息。
message
(可选,字符串) 有关移除预验证结果的详细信息。

示例编辑

此示例验证移除节点 node1node2 是否安全。响应表明安全移除 node1,但可能不安全移除 node2,因为它可能包含指定红色分片的副本。因此,移除这两个节点的整体预验证返回 false

POST /_internal/prevalidate_node_removal?names=node1,node2

API 返回以下响应

{
  "is_safe": false,
  "message": "removal of the following nodes might not be safe: [node2-id]",
  "nodes": [
    {
      "id": "node1-id",
      "name" : "node1",
      "external_id" : "node1-externalId",
      "result" : {
        "is_safe": true,
        "reason": "no_red_shards_on_node",
        "message": ""
      }
    },
    {
      "id": "node2-id",
      "name" : "node2",
      "external_id" : "node2-externalId",
      "result" : {
        "is_safe": false,
        "reason": "red_shards_on_node",
        "message": "node contains copies of the following red shards: [[indexName][0]]"
      }
    }
  ]
}