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 与恢复带宽。