预验证节点移除 API

编辑

此功能旨在供 Elasticsearch ServiceElastic Cloud EnterpriseElastic Cloud on Kubernetes 间接使用。不支持直接使用。

预验证节点移除。

请求

编辑

POST /_internal/prevalidate_node_removal

先决条件

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

描述

编辑

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

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

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

请注意,只能使用一个查询参数(namesidsexternal_ids)来指定节点集。

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

查询参数

编辑
master_timeout
(可选,时间单位) 等待主节点的时间段。如果主节点在超时到期之前不可用,则请求失败并返回错误。默认为 30s。也可以设置为 -1 表示请求永远不应超时。
timeout
(可选,时间单位) 更新集群元数据后,等待来自集群中所有相关节点的响应的时间段。如果在超时到期之前没有收到响应,则集群元数据更新仍然适用,但响应会表明它没有被完全确认。默认为 30s。也可以设置为 -1 表示请求永远不应超时。
names
(可选,字符串) 节点名称的逗号分隔列表。
ids
(可选,字符串) 节点 ID 的逗号分隔列表。
external_ids
(可选,字符串) 节点外部 ID 的逗号分隔列表。

响应正文

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

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

nodes 的属性
<节点>

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

<节点> 的属性
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

resp = client.perform_request(
    "POST",
    "/_internal/prevalidate_node_removal",
    params={
        "names": "node1,node2"
    },
)
print(resp)
const response = await client.transport.request({
  method: "POST",
  path: "/_internal/prevalidate_node_removal",
  querystring: {
    names: "node1,node2",
  },
});
console.log(response);
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]]"
      }
    }
  ]
}