文章目录
- allocate_stale_primary
-
- [reroute 是什么](#reroute 是什么)
- [allocate_stale_primary 的作用](#allocate_stale_primary 的作用)
- [为什么必须 accept_data_loss](#为什么必须 accept_data_loss)
- 操作
-
- [0. 前置判断(必须)](#0. 前置判断(必须))
- [1. 找到未分配主分片](#1. 找到未分配主分片)
- [2. 确认原因与可用副本](#2. 确认原因与可用副本)
- [3. 执行 allocate_stale_primary](#3. 执行 allocate_stale_primary)
- [4. 执行后检查与收尾](#4. 执行后检查与收尾)
- [Elasticsearch Shard 分配与 Reroute 参考](#Elasticsearch Shard 分配与 Reroute 参考)
- [一、Shard 分配原理(Allocation Principles)](#一、Shard 分配原理(Allocation Principles))
- [二、Unassigned Shards 问题分析与处理](#二、Unassigned Shards 问题分析与处理)
- [三、Cluster Reroute API(核心运维手段)](#三、Cluster Reroute API(核心运维手段))
-
- [1. Elasticsearch 官方文档](#1. Elasticsearch 官方文档)
- [2. 运维实战与讲解](#2. 运维实战与讲解)
- [四、Stale Primary 与强制分配(高风险操作)](#四、Stale Primary 与强制分配(高风险操作))
- [五、OpenSearch 兼容参考](#五、OpenSearch 兼容参考)
- [Elasticsearch Red / Yellow 状态与 Unassigned Shards 参考](#Elasticsearch Red / Yellow 状态与 Unassigned Shards 参考)
-
- 一、官方权威文档(必读)
-
- [1. Cluster Reroute API](#1. Cluster Reroute API)
- [2. 集群健康状态排查](#2. 集群健康状态排查)
- [3. 分片分配与路由配置](#3. 分片分配与路由配置)
- [二、Unassigned Shards:问题分析与解决路径](#二、Unassigned Shards:问题分析与解决路径)
-
- [1. 经典问题与通用解法](#1. 经典问题与通用解法)
- [2. 特殊触发场景](#2. 特殊触发场景)
- [三、Cluster Reroute API 实战与风险认知](#三、Cluster Reroute API 实战与风险认知)
- [四、allocate_stale_primary & 数据丢失(高危区)](#四、allocate_stale_primary & 数据丢失(高危区))
-
- [1. Stale Primary 分配讨论](#1. Stale Primary 分配讨论)
- [2. accept_data_loss 到底发生了什么?](#2. accept_data_loss 到底发生了什么?)
- [五、分片不一致 / 同步异常(边缘但致命)](#五、分片不一致 / 同步异常(边缘但致命))
- 六、中文资料补充(便于内部分享)

allocate_stale_primary
_cluster/reroute 是 Elasticsearch 用来手动 干预分片分配/迁移的接口;allocate_stale_primary 则是 reroute 里的一个高风险命令,用于在找不到"最新主分片副本"时强行把"过期(stale)副本"提升为主分片以恢复服务,但可能造成数据丢失 。
reroute 是什么
POST /_cluster/reroute 允许对集群内单个分片做显式操作,例如移动分片、取消分片迁移/分配、把未分配分片指定到某节点等 。
需要注意的是:执行完 reroute 指令后,Elasticsearch 仍可能为了均衡而做后续重平衡(在相关配置允许的前提下),因此最终分片分布可能不只包含你指定的那一步变化 。
allocate_stale_primary 的作用
当主分片不可用且集群内找不到"足够新"的可用副本时,系统通常不会自动把一个过期副本提升为主分片,以避免数据回退带来的数据丢失 。
allocate_stale_primary 的目的就是在这种僵局下"强行恢复":把某个节点上保存的 stale 副本强制分配为主分片,让索引从 red 状态中恢复可用性,但这可能丢失该分片上最近写入的数据 。
为什么必须 accept_data_loss
Elastic 文档明确要求该命令必须显式设置 accept_data_loss: true,用来确认操作者理解其后果 。
一个关键后果是:如果稍后有节点重新加入并带回了更"新"的那份分片数据,这份更"新"的数据可能会被删除/覆盖,以服从你强行提升的 stale 主分片副本,从而造成不可逆的数据损失 。
操作
常见请求体结构如下(字段含义:index=索引名,shard=分片号,node=要接收该 stale 主分片的节点名/ID):
POST /_cluster/reroute{"commands":[{"allocate_stale_primary":{"index":"my_index","shard":0,"node":"node1","accept_data_loss":true}}]}
实际操作上,一般应先用 _shard_stores 等方式确认"哪个节点持有该分片的 stale 副本",然后把它分配到确实持有该 stale 副本的节点上;否则可能演变成更彻底的数据不可恢复问题 。
使用 allocate_stale_primary 恢复"过期主分片"的核心流程是:先确认该分片确实没有可恢复的最新副本,再找出哪个节点上存在 该分片的 stale store,最后用 _cluster/reroute 把它强制分配为主分片并显式 accept_data_loss: true(这是强制承认可能丢数据的开关)。
0. 前置判断(必须)
只有在"节点回不来、也无法从快照恢复、而且可接受该分片数据回退/丢失"的情况下,才建议使用 allocate_stale_primary(Elastic 官方把它视作接受数据丢失的手段)。
另外需要知道:如果以后带着"更完整数据"的节点重新加入,Elasticsearch 可能会用你这次强行分配的 stale 主分片去覆盖/删除那份更完整的数据,因此风险是不可逆的 。
1. 找到未分配主分片
先定位哪些主分片处于 UNASSIGNED(通常集群健康为 red)。常用检查方式:
GET /_cluster/health?pretty查看是否 red 以及未分配分片数GET /_cat/shards?v找到UNASSIGNED且p(primary)的分片行(记录 index 与 shard 编号)
2. 确认原因与可用副本
对目标分片用 GET /_cluster/allocation/explain 查看为什么没法分配,以及是否有可用的分片副本/存储可用(帮助判断是不是"真的需要强制")。
然后用 GET /_shard_stores?status=all(或不加过滤)找出该 index/shard 在哪些节点上仍保留了 shard store,并判断哪些是 stale copy(因为 allocate_stale_primary 必须分配到"确实持有该 stale 拷贝"的节点)。
3. 执行 allocate_stale_primary
对每个要恢复的分片,调用 reroute,把 stale 主分片强制分配到"持有该分片 store"的那个节点,并显式写 accept_data_loss: true(不写会被拒绝)。示例:
http
POST /_cluster/reroute
{
"commands": [
{
"allocate_stale_primary": {
"index": "my_index",
"shard": 0,
"node": "node-1",
"accept_data_loss": true
}
}
]
}
该命令的语义是"把 stale copy 提升为主分片并启动",从而让索引从 red 状态往可用方向恢复,但代价是该分片可能回退到旧数据点 。
4. 执行后检查与收尾
执行后观察分片是否进入 INITIALIZING/STARTED,并关注是否还有副本分片 UNASSIGNED(这很常见,可能需要后续让副本重新分配/恢复)。
最后再次检查 GET /_cluster/health?pretty 与 _cat/shards,确认目标主分片已启动;如果集群仍是 yellow 通常意味着副本还没完全分配完(需要等待或排查副本分配原因)。
Elasticsearch Shard 分配与 Reroute 参考
整理了下Elasticsearch 在 Shard 分配机制、未分配分片(Unassigned Shards)、Cluster Reroute API、异常恢复(Stale Primary) 等方面的高质量参考资料,涵盖原理、实战、官方文档与社区经验。
一、Shard 分配原理(Allocation Principles)
解释 Elasticsearch 如何决定分片放在哪个节点,是理解 reroute 和 unassigned 的基础。
-
1\] Elasticsearch 分片分配原理解析
https://elkguide.elasticsearch.cn/elasticsearch/principle/shard-allocate.html
-
5\] Elasticsearch 分片分配与均衡机制
二、Unassigned Shards 问题分析与处理
集群变红 / 变黄的核心原因之一,几乎所有 ES 运维都会遇到。
-
2\] Elasticsearch unassigned shards 问题分析
-
8\] StackOverflow:Unassigned shards 如何修复
-
15\] 官方文档:Red / Yellow 集群状态排查
三、Cluster Reroute API(核心运维手段)
手动干预分片分配的"核按钮",用得对是救命,用错是事故。
1. Elasticsearch 官方文档
-
7\] Elasticsearch Cluster Reroute API(官方)
-
13\] Elasticsearch 8.x Cluster Reroute API
-
6\] Opster:Elasticsearch Reroute API 实战指南
四、Stale Primary 与强制分配(高风险操作)
allocate_stale_primary 是"最后的手段",一定要理解数据丢失含义。
-
14\] Elastic Discuss:Mass allocate stale primary 讨论
五、OpenSearch 兼容参考
如果你在 OpenSearch(或国产 ES 发行版)环境下。
-
10\] OpenSearch Cluster Reroute API
Elasticsearch Red / Yellow 状态与 Unassigned Shards 参考
聚焦 Elasticsearch 集群中最"要命"的几类问题:
- 集群 Red / Yellow 状态
- Unassigned Shards 成因与修复
- Cluster Reroute API
- allocate_stale_primary / accept_data_loss
- 分片不同步、恢复失败等边缘问题
一、官方权威文档(必读)
1. Cluster Reroute API
-
1\] Elasticsearch Cluster Reroute API(通用)
https://www.elastic.co/docs/api/doc/elasticsearch/v8/operation/operation-cluster-reroute
2. 集群健康状态排查
-
2\] 官方文档:Red / Yellow 集群状态排错指南
-
20\] Cluster-level shard allocation \& routing settings
https://www.bookstack.cn/read/elasticsearch-8.17-en/99da80f229399439.md
二、Unassigned Shards:问题分析与解决路径
80% 的 ES 红色告警,根因都在这里。
1. 经典问题与通用解法
-
3\] StackOverflow:Unassigned shards 如何修复(经典)
https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/
-
19\] Sematext:Unassigned Shards 全面分析
https://opster.com/guides/operations/elasticsearch-red-status/
-
8\] 集群卡在 Red 状态、分片无法分配
-
9\] 打开关闭的索引后,健康集群突然变红
-
18\] 应用报错:请求 ES index 失败引发的集群异常
三、Cluster Reroute API 实战与风险认知
reroute 是"手术刀",不是"创可贴"。
-
6\] Opster:Elasticsearch Reroute API 实战指南
四、allocate_stale_primary & 数据丢失(高危区)
这是 ES 运维里"最后一颗子弹"。
1. Stale Primary 分配讨论
-
4\] Elastic Discuss:Mass allocate stale primary
https://discuss.elastic.co/t/unassigned-replicas-after-reroute-allocate-stale-primary/297596
2. accept_data_loss 到底发生了什么?
-
10\] accept_data_loss:数据"丢"到哪里去了?
五、分片不一致 / 同步异常(边缘但致命)
-
15\] ES 5.x:Primary 与 Replica 分片不同步
https://github.com/elastic/elasticsearch/issues/27007
六、中文资料补充(便于内部分享)
-
13\] 腾讯云技术百科:Elasticsearch Unassigned Shards
