一句话:只要让“哪个分片分配到哪个节点”发生变化的操作,都会触发 **AllocationService** 跑一次分片分配。下面把常见场景按**入口**和**内部触发**两类列全,开发时看到它们就等价于“分片分配链路会被执行”。
------------------------------------------------
一、用户侧直接入口(REST / Transport API)
| 请求 | 触发点 | 备注 |
|---|---|---|
| `PUT /<index>` 创建索引 | `MetadataCreateIndexService` → 提交状态任务 → `AllocationService#reroute` | 新建主分片必须立即分配 |
| `DELETE /<index>` 删除索引 | `MetadataDeleteIndexService` → 状态任务 → reroute | 副本分片被释放,可能触发其它索引抢占 |
| `POST /_cluster/reroute` | `TransportClusterRerouteAction` → 手工指定分配命令 | 显式调用 allocation 引擎 |
| `PUT /_cluster/settings` 里改 `cluster.routing.*` | `ClusterSettingsUpdater` → reroute | 如禁用分配、调节并发值 |
| `POST /<index>/_open` | `MetadataIndexStateService` → 状态任务 → reroute | 从 close→open 需要重新分配主分片 |
| `POST /<index>/_close` | 同上 | 触发分片取消分配 |
| `PUT /<index>/_settings` 改副本数 | `MetadataUpdateSettingsService` → reroute | 增加副本立即分配,减少副本则取消 |
| `POST /_snapshot/.../_restore` | `RestoreService` → reroute | 恢复过程要批量分配主/副分片 |
| Shrink / Split / Clone API | `MetadataCreateIndexService` (resize) → reroute | 目标索引需要全新分配 |
------------------------------------------------
二、集群自愈/运维内部触发(无用户请求)
| 事件 | 触发点 | 典型表现 |
|---|---|---|
| 节点下线(宕机、优雅离开) | `NodeLeaveClusterStateTask` → `AllocationService#deassociateDeadNodes` → reroute | 立即开始主分片 election + 副本提升 |
| 节点上线(新节点加入) | `NodeJoinClusterStateTask` → reroute | 触发重平衡,把分片挪到新节点 |
| 磁盘水位超标(高/低水位) | `DiskThresholdMonitor` 每 30s 检查 → reroute | 把分片迁到别的节点 |
| 分片初始化失败(INIT → STARTED 超时) | `ShardStateAction#handleFailure` → reroute | 重试分配,可能换节点 |
| 主分片分配失败(UNASSIGNED > 0) | `RetryableReroutePolicy` 定时重试 | 默认 5min 重跑一次 |
| 集群设置动态调整感知属性 | `FilterAllocationDecider` 重新计算权重 | 例如把 `cluster.routing.allocation.awareness.*` 改了 |
| 手工设置分片分配启用/禁用 | `ClusterSettings` 变化 → reroute | 比如 `"cluster.routing.allocation.enable": "none"` → 再改回 `"all"` |
------------------------------------------------
快速记忆口诀
“**建、删、开、关、改副本、调设置、手工 reroute、节点上下线、磁盘报警、恢复快照**”——只要出现这些关键字,就会跑一次 AllocationService,日志里能看到 `reroute` 与 `allocate` 相关 TRACE。

1715

被折叠的 条评论
为什么被折叠?



