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 |
解释结果里的原因链可能是多层的:先解决第一层(例如磁盘水位),再重新请求接口看后续结论,不要同时改多个设置,否则无法判断哪次改动真正起了作用。