2.3 Elasticsearch-集群状态:Green/Yellow/Red 排查思路

Elasticsearch集群红黄排查指南

在这里插入图片描述
2.3 Elasticsearch-集群状态:Green/Yellow/Red 排查思路
——让“红绿灯”不再只是玄学


0. 状态速览:一张表先背下来

状态字面含义能否读写能否继续分配 shard典型触发场景用户体感
Green所有主副分片都就位正常读写集群健康无感知
Yellow主分片就位,但有副本未分配正常读写部分受限节点离线、磁盘水位、索引设置有告警,业务无影响
Red至少一个主分片丢失只能读不能写缺失主分片的索引多节点离线、索引损坏、分配失败直接报错,业务受损

1. 排查总纲:30 秒定位“谁红了”

  1. GET _cluster/health?level=indices
    一眼看索引维度,把 Red/Yellow 的索引名记下来。
  2. GET _cluster/allocation/explain?index=<idx>&shard=<id>&primary=true
    官方提供的“一站式”诊断接口,90 % 的场景直接给出原因。
  3. 如果第二步返回“cannot allocate because…” 就顺着 decision 列表往下读;
    如果返回 404,说明集群自己也不知道该 shard 在哪,跳第 3 节“Red 专项”。

2. Yellow 集群:99 % 是副本数 > 存活节点数

2.1 最常见模板
  • 3 节点集群,索引 number_of_replicas=2 → 需要 3 份副本,总共 3×2=6 个分片,但集群只有 3 节点,必然分配不齐。
  • 节点离线一台,副本数仍保持 1,也会 Yellow。
2.2 一键修复
PUT */_settings
{
  "number_of_replicas": 0          // 先降到 0,立刻 Green
}

随后按需调大,或者把节点加回来。

2.3 磁盘水位踩线

GET _cat/allocation?vdisk.indicesdisk.percent,当某个节点超过 cluster.routing.allocation.disk.watermark.low(默认 85 %)时,ES 不再向该节点分配任何 shard,副本悬在空中变成 Yellow。

  • 临时方案:调高阈值
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%"
  }
}
  • 根治:加磁盘或加节点。
2.4 单节点开发环境必踩的坑

开发机只起了一个 ES 进程,却用了 number_of_replicas=1,永远 Yellow。
官方推荐模板:

PUT _template/single-node
{
  "index_patterns": ["*"],
  "settings": {
    "number_of_replicas": 0
  }
}

3. Red 集群:主分片真的丢了

3.1 确认“丢”还是“暂时没分配”

GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason

  • UNASSIGNEDprirep=p,状态 UNASSIGNED,reason 常见:
    NODE_LEFT:节点离线
    ALLOCATION_FAILED:分配失败超过重试上限
    CORRUPTED:段文件校验失败
3.2 节点离线场景
  1. 节点还能启动
    直接重启节点,ES 会把磁盘上的 shard 直接拉起来,集群自动回到 Yellow→Green。
  2. 节点彻底挂掉且数据目录丢失
    进入“抢救 or 接受丢数据”分支:
    • 索引不重要:
DELETE 坏索引
  • 索引必须恢复:
    从快照还原,或者 elasticdump/logstash 从备份集群重新写回。
3.3 分片损坏场景

日志里能看到 CorruptIndexExceptionchecksum failed

  • 先尝试 /_cluster/reroute 命令强制重分配:
POST _cluster/reroute
{
  "commands": [
    {
      "allocate_stale_primary": {
        "index": "shop-order",
        "shard": 2,
        "node": "node-3",
        "accept_data_loss": true
      }
    }
  ]
}

该命令把“过时副本”提拔成主分片,可能丢数据,务必确认业务可接受。

  • 若所有副本都损坏,只能删索引或从快照恢复。
3.4 分配失败重试耗尽

GET _cluster/allocation/explain 返回 max_retry [5] exceeded

  • 先解决根因(磁盘、mapping 冲突、Field limit)。
  • 再手动重试:
POST _cluster/reroute?retry_failed=true

4. 黄/红场景下的可观测三板斧

  1. 日志
    cluster.name.log 里搜 failed to create shard/corrupt,直接给出行号。
  2. Metricbeat 监控
    重点看 elasticsearch.cluster.stats.status=red 的告警,配合 elasticsearch.node.stats.fs.available 预判磁盘踩线。
  3. Kibana Stack Monitoring
    左侧 “Elasticsearch → Indices” 视图,红色索引会高亮,点进去能看到 unassigned reason,省去手写 cat API。

5. 生产级 checklist(复制即可贴 Confluence)

  • 索引模板默认副本数 ≤ 节点数 – 1
  • 磁盘水位 low/high 分别 ≤ 85 %/90 %,并配 flood_stage 告警
  • 快照策略每日自动,Red 时可直接 restore
  • 节点优雅下线:
PUT _cluster/settings
{"transient":{"cluster.routing.allocation.exclude._name":"要下架的节点"}}

等待 GET _cat/shards 无该节点 shard 后再 kill 进程,杜绝人为 Red。

  • 集群重启顺序:先 master-eligible,再 data,最后 coordinate,避免 master 未形成共识导致 shard 乱飞。

6. 小结

Yellow 是“副本没地方放”,Red 是“主分片真的丢了”。
/_cluster/allocation/explain 一把梭,90 % 场景都能把原因定位到“磁盘、节点、副本数、损坏”四大类。
剩下的 10 %,先删索引保集群,再从快照恢复保业务——集群先 Green,再谈数据。
更多技术文章见公众号: 大城市小农民

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔丹搞IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值