2. 集群健康状态深度解读

集群健康状态是 Elasticsearch 运维中最先被查看、也最容易被误读的一类信息。它并不是一个“好/坏”的布尔值,而是由分片分配状态推导出的聚合结论。理解 _cluster/health、_cat/health、_cat/indices 三类 API 的指标含义与相互关系,才能在出现黄、红状态时快速判断问题出在节点、分片还是索引层面。

一、颜色分级:绿、黄、红的真实含义

集群健康颜色由主分片和副本分片的分配情况决定,判断规则如下:

  • green:所有主分片和副本分片均已分配。集群可正常读写,且具备副本冗余。
  • yellow:所有主分片已分配,但至少有一个副本分片未分配。数据可读写,但缺少冗余,节点故障时存在数据丢失风险。
  • red:至少有一个主分片未分配。该主分片对应的索引部分数据不可读写,属于最高优先级故障。

需要特别强调的是:yellow 不等于“集群不可用”,它表示冗余不足;red 也不等于“整个集群不可用”,而是“部分索引的部分分片不可用”。很多误判都源于把颜色直接等同于业务可用性。

二、_cluster/health 的核心指标

执行 GET _cluster/health 会返回一组聚合指标,常用字段及含义如下:

字段含义异常信号
status集群颜色yellow / red
number_of_nodes当前节点数低于预期节点数
number_of_data_nodes数据节点数为 0 或骤降
active_primary_shards已分配主分片数小于预期主分片总数
active_shards已分配分片总数与主分片差值反映副本缺失
unassigned_shards未分配分片数大于 0 需重点排查
initializing_shards初始化中分片数长时间不下降
relocating_shards迁移中分片数持续偏高说明均衡异常
delayed_unassigned_shards延迟分配分片数与节点重启延迟策略相关

其中 unassigned_shards 是定位问题的关键入口。若该值大于 0,可进一步用 GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason 查看每个未分配分片的具体原因,例如 NODE_LEFT、ALLOCATION_FAILED、CLUSTER_RECOVERED 等。

三、_cat/health 与 _cat/indices 的分工

_cat/health?v 是 _cluster/health 的表格化视图,适合快速巡检,输出包含 epoch、timestamp、cluster、status、node.total、node.data、shards、pri、relo、init、unassign、pending_tasks、max_task_wait_time、active_shards_percent 等列。其中 active_shards_percent 非常直观:它表示已分配分片占总分片的百分比,green 时为 100%,yellow 时通常低于 100% 但不为 0,red 时可能明显偏低。

_cat/indices?v 则把视角下沉到索引级别,常用列包括 health、status、index、pri、rep、docs.count、docs.deleted、store.size、pri.store.size。它的价值在于:集群整体 yellow 时,可以立刻看出是哪些索引的副本未分配;集群 red 时,可以定位到具体索引。例如:

GET _cat/indices?v&s=health:desc
GET _cat/indices?v&h=index,health,pri,rep,docs.count,store.size

按 health:desc 排序后,red 索引会排在最前,便于优先处理。

四、常见异常模式与快速定位路径

实际运维中,健康状态异常通常呈现几种典型模式:

  • 整体 yellow、unassigned_shards 等于副本数:常见于单节点集群或副本数大于数据节点数,副本无处分配。检查 number_of_replicas 与数据节点数量即可。
  • 整体 red、部分主分片未分配:多因节点宕机、磁盘故障或分片数据损坏。需结合 _cat/shards 的 unassigned.reason 与节点日志判断。
  • yellow 且 initializing_shards 长期不降:可能是恢复限流、磁盘水位或网络带宽瓶颈,检查 cluster.routing.allocation 相关设置与节点磁盘使用率。
  • relocating_shards 持续偏高:说明分片在节点间反复迁移,常见于节点频繁上下线或均衡策略与硬件不匹配。
快速定位口诀:先看颜色定级别,再看 unassigned 定范围,最后用 _cat/shards 的 unassigned.reason 定原因。

下面这张图把三类 API 的观察层次、关键指标与判断路径整合在一起,便于在排障时按图索骥。

集群健康状态三层观察与定位路径 第一层:集群聚合视图 GET _cluster/health / GET _cat/health?v status green/yellow/red unassigned_shards 未分配分片数 active_shards_percent 已分配分片占比 relocating / init 迁移/初始化中 node.data 数据节点数 unassigned > 0 时下钻 第二层:索引级视图 GET _cat/indices?v&s=health:desc health 索引颜色 pri / rep 主/副本分片数 docs.count 文档数 store.size 存储大小 定位到具体索引后查分片 第三层:分片级原因定位 GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason state = UNASSIGNED 分片未分配 需看 reason 字段 NODE_LEFT 节点离线 检查节点存活与网络 ALLOCATION_FAILED 分配失败 磁盘水位/分片上限 CLUSTER_RECOVERED 恢复中 等待或限流调整 green:全部分片已分配 yellow:副本未分配 red:主分片未分配

五、从指标到判断:一个可复用的排查顺序

面对健康状态异常,建议按以下顺序推进,避免在无关指标上浪费时间:

  1. 用 _cat/health?v 确认整体颜色、节点数、unassigned 与 active_shards_percent。
  2. 若 unassigned > 0,用 _cat/indices?v&s=health:desc 找出受影响索引,区分是 yellow 还是 red。
  3. 用 _cat/shards?v&h=index,shard,prirep,state,unassigned.reason 查看未分配分片的具体原因。
  4. 根据 reason 分流:节点问题查节点日志与网络,磁盘问题查水位与容量,分配策略问题查 cluster.routing.allocation 配置。
  5. 处理后再用 _cluster/health?wait_for_status=green&timeout=30s 观察是否恢复,确认 unassigned_shards 归零。
不要仅凭颜色下结论。yellow 集群在单副本场景下可能长期存在且业务无感;red 集群也可能只影响个别索引。必须结合 unassigned_shards、active_shards_percent 与分片级 reason 综合判断,才能确定处理优先级。

掌握这三层 API 的分工与指标含义后,健康状态检查就不再是“看颜色猜问题”,而是一条从聚合到索引、再到分片原因的清晰定位链路。