集群重新路由 API编辑

更改集群中分片的分配。

请求编辑

POST /_cluster/reroute?metric=none

先决条件编辑

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

描述编辑

重新路由命令允许手动更改集群中单个分片的分配。例如,可以将分片从一个节点显式移动到另一个节点,可以取消分配,并且可以将未分配的分片显式分配到特定节点。

重要的是要注意,在处理任何重新路由命令后,Elasticsearch 将像往常一样执行重新平衡(尊重 cluster.routing.rebalance.enable 等设置的值)以保持平衡状态。例如,如果请求的分配包括将分片从 node1 移动到 node2,那么这可能会导致将分片从 node2 移动回 node1 以使事情变得均匀。

可以使用 cluster.routing.allocation.enable 设置将集群设置为禁用分配。如果分配被禁用,那么将执行的唯一分配是使用 reroute 命令给出的显式分配,以及由于重新平衡而导致的后续分配。

可以通过使用 ?dry_run URI 查询参数或在请求正文中传递 "dry_run": true 来以“试运行”模式运行 reroute 命令。这将计算将命令应用于当前集群状态的结果,并在应用命令(和重新平衡)后返回生成的集群状态,但不会实际执行请求的更改。

如果包含 ?explain URI 查询参数,则响应中将包含有关命令为何可以或不能执行的详细说明。

集群将尝试最多连续 index.allocation.max_retries 次(默认为 5)分配分片,然后放弃并使分片保持未分配状态。这种情况可能是由结构性问题引起的,例如具有引用所有节点上不存在的停用词文件的分析器。

一旦问题得到纠正,就可以通过使用 ?retry_failed URI 查询参数调用 reroute API 来手动重试分配,这将尝试对这些分片进行一次重试轮。

查询参数编辑

dry_run
(可选,布尔值) 如果为 true,则请求仅模拟操作并返回结果状态。
explain
(可选,布尔值) 如果为 true,则响应包含对命令为何可以或不能执行的解释。
metric

(可选,字符串) 将返回的信息限制为指定的指标。除了 none 之外的所有选项都已弃用,应避免为此参数使用。默认为除元数据之外的所有内容。以下选项可用

用于 metric 的选项
_all
显示所有指标。
blocks
显示响应的 blocks 部分。
master_node
显示响应中选定的 master_node 部分。
metadata
显示响应的 metadata 部分。如果您提供逗号分隔的索引列表,则返回的输出将仅包含这些索引的元数据。
nodes
显示响应的 nodes 部分。
none
从响应中排除整个 state 字段。
routing_table
显示响应的 routing_table 部分。
version
显示集群状态版本。
retry_failed
(可选,布尔值) 如果为 true,则重试由于太多后续分配失败而被阻止的分片的分配。
master_timeout
(可选,时间单位) 等待主节点的时间段。如果在超时时间到期之前主节点不可用,则请求失败并返回错误。默认为 30s。也可以设置为 -1,表示请求永远不会超时。
timeout
(可选,时间单位) 等待响应的时间段。如果在超时时间到期之前未收到响应,则请求失败并返回错误。默认为 30s

请求正文编辑

commands

(必需,对象数组) 定义要执行的命令。支持的命令是

用于 commands 的属性
move
将已启动的分片从一个节点移动到另一个节点。接受 indexshard 用于索引名称和分片号,from_node 用于要从中移动分片的节点,以及 to_node 用于要将分片移动到的节点。
cancel
取消分片(或恢复)的分配。接受 indexshard 用于索引名称和分片号,以及 node 用于要取消分片分配的节点。这可用于强制从主分片重新同步现有副本,方法是取消它们并允许它们通过标准恢复过程重新初始化。默认情况下,只能取消副本分片的分配。如果需要取消主分片的分配,则还必须在请求中包含 allow_primary 标志。
allocate_replica
将未分配的副本分片分配到节点。接受 indexshard 用于索引名称和分片号,以及 node 用于将分片分配到的节点。考虑 分配决定器

还有两个命令可用,允许将主分片分配到节点。但是,应谨慎使用这些命令,因为主分片分配通常由 Elasticsearch 全自动处理。主分片无法自动分配的原因包括以下原因

  • 创建了一个新索引,但没有满足分配决定器的节点。
  • 在集群中的当前数据节点上找不到数据的最新分片副本。为了防止数据丢失,系统不会自动将陈旧的分片副本提升为主分片。

以下两个命令很危险,可能会导致数据丢失。它们旨在用于无法恢复原始数据且集群管理员接受丢失的情况。如果您遇到了可以修复的临时问题,请参阅上面描述的 retry_failed 标志。为了强调:如果执行了这些命令,然后一个包含受影响分片副本的节点加入集群,那么新加入节点上的副本将被删除或覆盖。

allocate_stale_primary
将主分片分配到包含陈旧副本的节点。接受 indexshard 用于索引名称和分片号,以及 node 用于将分片分配到的节点。使用此命令可能会导致提供的分片 ID 的数据丢失。如果稍后一个包含数据良好副本的节点重新加入集群,则该数据将被删除或覆盖,并使用使用此命令强制分配的陈旧副本的数据。为了确保充分理解这些含义,此命令要求显式将标志 accept_data_loss 设置为 true
allocate_empty_primary
将空主分片分配到节点。接受 indexshard 用于索引名称和分片号,以及 node 用于将分片分配到的节点。使用此命令会导致先前已启动的此分片中索引的所有数据的完全丢失。如果稍后一个包含数据副本的节点重新加入集群,则该数据将被删除。为了确保充分理解这些含义,此命令要求显式将标志 accept_data_loss 设置为 true

示例编辑

这是一个简单的重新路由 API 调用的简短示例

resp = client.cluster.reroute(
    metric="none",
    body={
        "commands": [
            {
                "move": {
                    "index": "test",
                    "shard": 0,
                    "from_node": "node1",
                    "to_node": "node2",
                }
            },
            {
                "allocate_replica": {
                    "index": "test",
                    "shard": 1,
                    "node": "node3",
                }
            },
        ]
    },
)
print(resp)
POST /_cluster/reroute?metric=none
{
  "commands": [
    {
      "move": {
        "index": "test", "shard": 0,
        "from_node": "node1", "to_node": "node2"
      }
    },
    {
      "allocate_replica": {
        "index": "test", "shard": 1,
        "node": "node3"
      }
    }
  ]
}