首页/数据/NoSQL 速查/_cluster/reroute 手动分片调拨
Elasticsearch89 条

_cluster/reroute 手动分片调拨

reroute 手动执行分片迁移、副本分配或取消迁移动,命令默认仅演练(dry_run),确认可行后再提交;滥用会打乱自动均衡。

NoSQL 速查数据更新于 2026-10-13

reroute 做什么

reroute 是手动干预分片分配的命令:把某个分片迁到指定节点、给未分配的分片安排位置,或者取消正在进行的迁移。命令默认只做演练不落地,确认可行后再正式提交,它是自动分配机制之外的兜底手段。

基本信息

接口POST /_cluster/reroute?dry_run=true|false
常用命令move 迁到指定节点、allocate_replica 分配未分配副本、cancel 取消进行中的迁移
执行顺序先用 dry_run 看响应中的 explanations,确认可行再真实提交
权限要求需要集群管理权限
前置信息节点名用 _cat/nodes 核对,分片位置用 _cat/shards 确认

典型使用场景

  • 节点换盘或扩容后,把分片重新摆布到目标节点
  • 自动分配被过滤规则卡住时手工兜底
  • 取消正在进行的迁移,避免与维护窗口冲突
  • 副本长期未分配时按诊断结论手工指定节点
  • 提交前演练迁移结果,确认目标节点余量足够

常用写法

常用写法
# 先核对节点名与分片位置
GET /_cat/nodes?v&h=name,ip,disk.avail
GET /_cat/shards?v&h=index,shard,prirep,state,node

# 干跑:只返回可行性说明,不改动集群
POST /_cluster/reroute?dry_run=true
{ "commands": [ { "move": { "index": "logs-2024.01", "shard": 0,
    "from_node": "node-1", "to_node": "node-2" } } ] }

# 确认可行后正式提交
POST /_cluster/reroute?dry_run=false
{ "commands": [ { "move": { "index": "logs-2024.01", "shard": 0,
    "from_node": "node-1", "to_node": "node-2" } } ] }

# 给未分配的副本指定节点
POST /_cluster/reroute
{ "commands": [ { "allocate_replica": { "index": "logs-2024.01", "shard": 0, "node": "node-3" } } ] }

常用命令对照

命令作用注意
move把分片从一个节点迁到另一个源与目标都要写,写错直接报错
allocate_replica把未分配副本分配到指定节点目标节点需满足磁盘与规则约束
allocate_empty_primary重建空主分片,原有数据会被丢弃只在确认数据不可恢复时使用
cancel取消正在进行的迁移用于打断卡住的分配动作
把分片强行塞给已经超过水位的节点,很可能触发下一轮自动回迁、形成来回搬动;手动调拨前先确认目标节点的容量与水位设置。
reroute 是兜底手段而不是日常运维方式:自动分配在多数场景下更均衡,反复手动 move 会让集群长期处于搬迁状态,持续占用 IO 与恢复带宽。

易错点

  • 命令里的节点名写错,干跑阶段就会报错,先用 _cat/nodes 核对真实名称可以少走弯路
  • 反复手动 move 会让集群持续搬数据,IO 与恢复带宽被占满,应尽量交给自动均衡机制
  • 给未分配的主分片套用 allocate_replica,命令与状态不匹配会直接报错;重建空主分片要清楚它会丢弃原有数据
  • 跳过 dry_run 直接提交:命令不可行时只返回错误而不改动集群,看似没问题,实际分配问题仍在,需要看 explanations 里的原因

数据来源与参考

  • Elasticsearch Guide: Cluster reroute API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌