文章背景图

Elasticsearch 集群状态变红:未分配分片、磁盘水位与恢复方法

2026-08-08
1
-
- 分钟

Elasticsearch 集群变为 RED,表示至少一个主分片不可用。此时部分索引可能无法读取或写入,必须优先保护现场并确认数据副本,不能一看到 RED 就删除索引或强制分配分片。

一、快速判断影响

curl -s http://127.0.0.1:9200/_cluster/health?pretty
curl -s 'http://127.0.0.1:9200/_cat/nodes?v'
curl -s 'http://127.0.0.1:9200/_cat/indices?v&health=red'
curl -s 'http://127.0.0.1:9200/_cat/shards?v'

重点确认:

  • 哪些索引的主分片为 UNASSIGNED

  • 是否有节点离线或频繁加入、离开集群;

  • 节点磁盘是否超过水位;

  • 集群管理节点是否稳定;

  • 最近是否发生扩缩容、重启、版本升级或存储故障。

二、解释未分配原因

curl -s -X GET 'http://127.0.0.1:9200/_cluster/allocation/explain?pretty' \
  -H 'Content-Type: application/json' \
  -d '{"index":"your-index","shard":0,"primary":true}'

该接口会说明分片为何不能分配,例如磁盘水位、分配过滤、节点属性不匹配、副本不足或历史分片副本失效。先读懂解释,再决定操作。

三、常见根因

  1. 节点宕机,唯一有效的主分片副本随节点离线。

  2. 磁盘超过 low、high 或 flood-stage 水位,分片停止迁移或索引被只读保护。

  3. 分片数量过多,节点资源不足,恢复速度极慢。

  4. 分配规则、机架感知或节点角色配置不合理。

  5. 存储损坏、文件权限异常,或节点使用了错误的数据目录。

  6. 集群重启顺序和最小主节点配置不当,导致集群状态不稳定。

四、应急恢复思路

  • 节点只是暂时离线:优先恢复原节点和原数据目录。

  • 磁盘水位过高:释放可确认的无用空间或扩容,等待分片自动恢复。

  • 有可用副本:确认分配限制后恢复正常分配。

  • 无有效副本:优先从快照恢复;强制分配陈旧主分片可能造成数据丢失,必须经过业务确认。

恢复过程中持续观察 pending tasks、recovery 和集群日志,避免并发执行大量 reroute 操作。

五、长期治理

  • 配置并验证快照仓库,定期做恢复演练。

  • 控制单节点分片数、单分片大小和索引生命周期。

  • 对磁盘水位、未分配分片、节点离线和集群状态设置告警。

  • 生产集群至少保留合理副本,并将副本分散到不同故障域。

  • 扩容和版本升级前检查分片迁移空间与恢复带宽。

处理 RED 集群时,优先级应是“确认数据安全 → 找到不能分配的原因 → 恢复有效副本 → 再做容量治理”。

原创

Elasticsearch 集群状态变红:未分配分片、磁盘水位与恢复方法

本文链接: Elasticsearch 集群状态变红:未分配分片、磁盘水位与恢复方法

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录