集群重新路由 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。也可以设置为 -1,表示请求永远不应超时。

请求正文

编辑
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 调用的简短示例

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"
      }
    }
  ]
}