Elasticsearch 集群 health 的 green、yellow、red 分别代表什么?
简化版
green 表示所有主分片和副本分片都已分配;yellow 表示主分片已分配但部分副本未分配,数据可用但冗余不足;red 表示至少有主分片未分配,部分数据不可用。排查要看 unassigned shards、节点状态、磁盘水位、分片分配规则和 allocation explain。
详细版
集群健康状态主要围绕分片分配:
| 状态 | 含义 | 影响 |
|---|---|---|
| green | 主副分片都正常 | 最健康 |
| yellow | 主分片正常,副本缺失 | 可读写,但高可用下降 |
| red | 主分片缺失 | 部分索引不可用 |
常用排查命令包括 _cluster/health、_cat/shards、_cat/allocation、_cluster/allocation/explain。面试要强调:yellow 不等于数据不可用,red 才说明有主分片不可用;但 yellow 长期存在也要处理,因为节点再挂可能丢可用性。
完整版教学
一、health 看的核心是分片分配
Elasticsearch 的索引被拆成 primary shard 和 replica shard。集群 health 并不是笼统说机器好不好,而是看分片是否被正确分配。
index
primary shard 0
replica shard 0
primary shard 1
replica shard 1
只要主分片可用,数据通常还能读写;副本缺失影响的是冗余和查询分摊。
记忆钩子:green 看主副都齐,yellow 看主在副缺,red 看主缺数据缺。
二、green 是主副分片都已分配
green 表示所有 primary 和 replica shard 都处于 active 状态。它是最理想状态。
{
"status": "green",
"active_primary_shards": 10,
"active_shards": 20,
"unassigned_shards": 0
}
这意味着副本能提供冗余。即使某个节点故障,集群也更有机会通过副本继续服务。
但 green 不代表性能一定好。慢查询、GC、磁盘高水位、线程池拒绝仍可能存在。health 是可用性指标,不是完整性能诊断。
三、yellow 是主分片在,副本没齐
yellow 最常见原因是单节点集群设置了副本数。比如只有 1 个节点,索引设置 number_of_replicas: 1,副本不能和主分片放在同一节点,所以永远 yellow。
1 node
primary shard -> node1
replica shard -> cannot assign to same node
status -> yellow
解决方式可以是增加节点,或者在开发环境把副本数改成 0。
PUT /my-index/_settings
{
"number_of_replicas": 0
}
生产环境不能因为想变 green 就随便降副本,要看高可用要求。
四、red 表示至少有主分片不可用
red 是更严重状态,表示至少一个 primary shard 没有分配成功。对应索引的部分数据不可读写。
常见原因包括节点丢失、磁盘损坏、分片分配被禁止、磁盘水位过高、索引损坏、集群恢复失败。
primary shard missing
-> index partial unavailable
-> search may fail or return partial
-> writes to that shard fail
red 时优先恢复主分片,而不是先关心副本。要查清是节点临时离线、磁盘问题,还是没有可用 shard copy。
五、排查 unassigned shard 的固定路径
常用命令:
GET /_cluster/health?pretty
GET /_cat/shards?v
GET /_cat/allocation?v
GET /_cluster/allocation/explain
allocation/explain 会告诉你某个分片为什么不能分配,例如磁盘超过水位、节点属性不匹配、同一分片副本不能放同节点、分配规则禁止等。
排查顺序可以是:
看 health -> 找 unassigned shard -> allocation explain -> 修复原因 -> 等待恢复
这套路径比背一堆可能原因更实用。
六、磁盘水位和分配规则是高频原因
ES 有磁盘水位保护。节点磁盘使用率过高时,集群可能不再往该节点分配分片,甚至迁移分片。
| 水位 | 含义 | 常见影响 |
|---|---|---|
| low watermark | 开始限制新分片分配 | 新分片不进高磁盘节点 |
| high watermark | 更积极迁移 | 分片搬离高磁盘节点 |
| flood stage | 写保护 | 索引可能变只读 |
另一个常见原因是 shard allocation filtering 或 awareness 配置不合理,比如要求分片只能去某类节点,但这类节点不存在。
七、常见误区与追问
- 误区:yellow 表示数据不可用。 yellow 通常主分片可用,数据仍可读写,但副本缺失导致冗余不足。
- 误区:green 就代表没有任何问题。 green 只代表分片分配正常,不代表查询性能、GC、磁盘都健康。
- 误区:red 只要重启集群就行。 red 要定位主分片未分配原因,盲目重启可能扩大恢复时间。
- 追问:单节点为什么经常 yellow? 副本不能和主分片放同一节点,单节点有副本配置就无法分配副本。
- 追问:allocation explain 有什么用? 它解释分片无法分配的具体决策原因,是排查 unassigned shard 的关键。
- 追问:磁盘水位会导致什么问题? 高水位会限制或迁移分片,flood stage 可能让索引进入只读保护。
八、加强记忆
集群 health 记成“主副分片状态灯”。green 是主副都齐,yellow 是主在副缺,red 是主缺导致数据不可用。排查时别靠猜,按 _cluster/health、_cat/shards、allocation/explain 走,重点看节点、磁盘水位、分配规则和是否还有可用 shard copy。