集群重新路由 API
编辑集群重新路由 API编辑
更改集群中分片的分配。
请求编辑
POST /_cluster/reroute?metric=none
描述编辑
重新路由命令允许手动更改集群中单个分片的分配。例如,可以将分片从一个节点显式移动到另一个节点,可以取消分配,并且可以将未分配的分片显式分配到特定节点。
重要的是要注意,在处理任何重新路由命令后,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
- 将已启动的分片从一个节点移动到另一个节点。接受
index
和shard
用于索引名称和分片号,from_node
用于要从中移动分片的节点,以及to_node
用于要将分片移动到的节点。 -
cancel
- 取消分片(或恢复)的分配。接受
index
和shard
用于索引名称和分片号,以及node
用于要取消分片分配的节点。这可用于强制从主分片重新同步现有副本,方法是取消它们并允许它们通过标准恢复过程重新初始化。默认情况下,只能取消副本分片的分配。如果需要取消主分片的分配,则还必须在请求中包含allow_primary
标志。 -
allocate_replica
- 将未分配的副本分片分配到节点。接受
index
和shard
用于索引名称和分片号,以及node
用于将分片分配到的节点。考虑 分配决定器。
还有两个命令可用,允许将主分片分配到节点。但是,应谨慎使用这些命令,因为主分片分配通常由 Elasticsearch 全自动处理。主分片无法自动分配的原因包括以下原因
- 创建了一个新索引,但没有满足分配决定器的节点。
- 在集群中的当前数据节点上找不到数据的最新分片副本。为了防止数据丢失,系统不会自动将陈旧的分片副本提升为主分片。
以下两个命令很危险,可能会导致数据丢失。它们旨在用于无法恢复原始数据且集群管理员接受丢失的情况。如果您遇到了可以修复的临时问题,请参阅上面描述的
retry_failed
标志。为了强调:如果执行了这些命令,然后一个包含受影响分片副本的节点加入集群,那么新加入节点上的副本将被删除或覆盖。-
allocate_stale_primary
- 将主分片分配到包含陈旧副本的节点。接受
index
和shard
用于索引名称和分片号,以及node
用于将分片分配到的节点。使用此命令可能会导致提供的分片 ID 的数据丢失。如果稍后一个包含数据良好副本的节点重新加入集群,则该数据将被删除或覆盖,并使用使用此命令强制分配的陈旧副本的数据。为了确保充分理解这些含义,此命令要求显式将标志accept_data_loss
设置为true
。 -
allocate_empty_primary
- 将空主分片分配到节点。接受
index
和shard
用于索引名称和分片号,以及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" } } ] }