首页/数据/NoSQL 速查/allocation explain 定位未分配分片
Elasticsearch89 条

allocation explain 定位未分配分片

分片一直 UNASSIGNED 时,allocation explain 给出分配决策链与原因(如磁盘水位、分配过滤规则、已有同分片副本无法共存),并附带可执行的修复建议。

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

allocation explain 是什么

分片长期停在 UNASSIGNED 状态时,从 _cat/shards 只能看到状态,看不到原因。allocation explain 接口会给出完整的分配决策链:这块分片当前是什么状态、现在能不能分配、每个候选节点分别因为什么被拒绝,并附带可执行的修复建议,是定位未分配分片的首选工具。

基本信息

接口POST /_cluster/allocation/explain
请求体{ "index": "...", "shard": 0, "primary": true }
不带参数随机挑一块未分配分片并解释它,适合先探路
关键返回current_state、can_allocate、allocate_explanation、node_allocation_decisions
权限需要集群管理相关权限,只读操作

典型使用场景

  • 分片迟迟不分配,确认是被磁盘水位挡住还是被分配过滤规则排除
  • 副本 UNASSIGNED,判断是节点数不足还是原节点未回归
  • 节点下线后确认剩余节点是否满足分配约束
  • 恢复期间分配停滞,确认是否受恢复限速或并发上限影响
  • 改配置前先看解释结果,避免同时改动多个变量导致无法归因

定位与处理

定位与处理
# 不知道从哪块查起:不带参数,接口随机解释一块未分配分片
GET /_cluster/allocation/explain

# 指定索引与分片,primary 为 true 表示查主分片
POST /_cluster/allocation/explain
{ "index": "logs-2024.01", "shard": 0, "primary": false }

# 先看清有哪些未分配分片
GET /_cat/shards?v&h=index,shard,prirep,state,node&s=state

# 确认诊断结论正确后再手动重新路由
POST /_cluster/reroute
{ "commands": [ { "allocate_replica": { "index": "logs-2024.01", "shard": 0, "node": "node-2" } } ] }

关键返回字段

字段含义怎么用
current_state分片当前状态UNASSIGNED 表示尚未分配
can_allocate现在能否分配yes 时可直接 reroute,no 要看原因
allocate_explanation不能分配的总体原因先解决这一层再看节点级细节
node_allocation_decisions各候选节点的判断与理由找第一条 decision 为 yes 的节点
unassigned_info.reason分片最初变为未分配的原因如 NODE_LEFT、ALLOCATION_FAILED
解释结果里的原因链可能是多层的:先解决第一层(例如磁盘水位),再重新请求接口看后续结论,不要同时改多个设置,否则无法判断哪次改动真正起了作用。

易错点

  • 看到 node_left 就立刻手动 reroute 到别的节点:真实原因可能是在等原节点回归,强行分配会引发额外的分片搬迁与数据复制
  • 同时修改水位阈值与分配过滤规则,导致无法归因,排查应当单变量推进
  • 只依赖 explain 的输出而忽略 _cat/shards 与集群健康的整体视图,容易修好一块分片却漏掉共性问题
  • 对主分片未分配的场景套用 allocate_replica 命令,命令语义不匹配会直接报错,重分配主分片要用对应的主分片命令并评估数据丢失风险

数据来源与参考

  • Elasticsearch Guide: Cluster allocation explain API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌