--- title: "集群变黄、变红时,你第一步该看什么" date: 2026-02-15 lastmod: 2026-02-15 description: "详解 Easysearch 集群状态异常的标准排查流程,深入讲解 Green/Yellow/Red 状态含义、_cluster/health 与 _cat/shards 诊断、allocation/explain API 根因分析,介绍常见故障类型(磁盘满、节点离线、无有效副本等)及对应解决方案,帮助快速恢复集群健康。" tags: ["集群状态", "故障排查", "分片分配"] summary: "当监控报警响起,Easysearch 集群状态变为 Yellow 或 Red 时,盲目重启节点往往不仅无济于事,甚至会加重故障。本文将提供一套标准化的排查“三板斧”,教你如何利用 _cluster/health、_cat/shards 和 allocation/explain 三个核心 API,在 5 分钟内精准定位故障根因。 对于 Easysearch 管理员来说,最不想看到的颜色就是红色。 Green:健康。所有的主分片(Primary)和副本分片(Replica)都处于活动状态。 Yellow:警告。所有的主分片都正常,但至少有一个副本分片缺失。数据是完整的,搜索和写入也是正常的,但高可用性(HA)受损。 Red:严重。至少有一个主分片缺失。部分数据不可用,针对丢失数据的查询会报错或返回不完整结果。 当集群状态异常时,很多人的第一反应是“重启节点”。请住手! 在搞清楚原因之前,重启可能会导致现场日志丢失,甚至引发数据二次损坏。 请按以下步骤进行“外科手术式”排查。 第一步:确认伤情 —— 哪个索引病了? # 首先,你需要知道是整个集群挂了,还是只是某个具体的索引出了问题。 执行命令: GET /_cluster/health?level=indices 看什么: 关注返回结果中的 indices 部分。找到状态为 yellow 或 red 的具体索引名称。 如果是 yellow,通常是因为正在进行分片恢复,或者某个数据节点离线导致副本无法分配。 如果是 red,说明该索引的主分片挂了。 第二步:精准定位 —— 哪个分片丢了? # 知道是哪个索引还不够,必须定位到具体的分片号(Shard ID)。 执行命令: GET /_cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason 看什么: 这条命令会列出所有状态为 UNASSIGNED(未分配)的分片。 prirep: p 代表主分片(危险!),r 代表副本分片。 unassigned.reason: 简要的未分配原因(如 NODE_LEFT, CLUSTER_RECOVERED 等)。 第三步:寻找根因 —— 为什么无法分配?(核心!) # 这是排查过程中最重要、最强大的一步。Easysearch 提供了一个“解释 API”,它能像医生一样告诉你:为什么这个分片不健康?" --- > 当监控报警响起,Easysearch 集群状态变为 Yellow 或 Red 时,盲目重启节点往往不仅无济于事,甚至会加重故障。本文将提供一套标准化的排查“三板斧”,教你如何利用 `_cluster/health`、`_cat/shards` 和 `allocation/explain` 三个核心 API,在 5 分钟内精准定位故障根因。 --- 对于 Easysearch 管理员来说,最不想看到的颜色就是**红色**。 - **Green**:健康。所有的主分片(Primary)和副本分片(Replica)都处于活动状态。 - **Yellow**:警告。所有的主分片都正常,但至少有一个副本分片缺失。**数据是完整的,搜索和写入也是正常的**,但高可用性(HA)受损。 - **Red**:严重。至少有一个主分片缺失。**部分数据不可用**,针对丢失数据的查询会报错或返回不完整结果。 当集群状态异常时,很多人的第一反应是“重启节点”。**请住手!** 在搞清楚原因之前,重启可能会导致现场日志丢失,甚至引发数据二次损坏。 请按以下步骤进行“外科手术式”排查。 ## 第一步:确认伤情 —— 哪个索引病了? 首先,你需要知道是整个集群挂了,还是只是某个具体的索引出了问题。 **执行命令:** ```bash GET /_cluster/health?level=indices ``` **看什么:** 关注返回结果中的 `indices` 部分。找到状态为 `yellow` 或 `red` 的具体索引名称。 - 如果是 `yellow`,通常是因为正在进行分片恢复,或者某个数据节点离线导致副本无法分配。 - 如果是 `red`,说明该索引的主分片挂了。 ## 第二步:精准定位 —— 哪个分片丢了? 知道是哪个索引还不够,必须定位到具体的**分片号(Shard ID)**。 **执行命令:** ```bash GET /_cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason ``` **看什么:** 这条命令会列出所有状态为 `UNASSIGNED`(未分配)的分片。 - `prirep`: `p` 代表主分片(危险!),`r` 代表副本分片。 - `unassigned.reason`: 简要的未分配原因(如 `NODE_LEFT`, `CLUSTER_RECOVERED` 等)。 ## 第三步:寻找根因 —— 为什么无法分配?(核心!) 这是排查过程中**最重要、最强大**的一步。Easysearch 提供了一个“解释 API”,它能像医生一样告诉你:为什么这个分片不健康? **执行命令:** ```bash GET /_cluster/allocation/explain ``` _注意:如果有很多未分配的分片,该 API 默认只解释第一个。你也可以指定具体的分片:_ ```json GET /_cluster/allocation/explain { "index": "my-index-001", "shard": 0, "primary": true } ``` **看什么:** 返回的 JSON 中,重点关注 `deciders` 列表。这里会列出 Easysearch 尝试分配分片但失败的具体理由。 ### 常见病因与对策 #### 1. 磁盘满了 (DISK_THRESHOLD_DECIDER) **现象**:`explain` 结果显示 `disk_threshold` 相关错误,或者日志中出现 `flood stage disk watermark exceeded`。 **原因**:节点磁盘使用率超过了警戒线(默认 95%),集群为了保护数据,强制将索引设为只读(Read-Only),并拒绝分配分片。 **解决**: 1. 清理磁盘空间(删除旧日志、快照)。 2. **关键一步**:解除索引的只读锁。 ```json PUT /_all/_settings { "index.blocks.read_only_allow_delete": null } ``` 3. 集群通常会自动开始恢复。 #### 2. 重试次数超限 (ALLOCATION_FAILED) **现象**:`explain` 显示 `reached the limit of fair shard recoveries` 或类似错误。 **原因**:分片可能因为某种原因(如 IO 错误、文件损坏)连续 5 次初始化失败,Easysearch 就会放弃治疗,不再尝试分配,防止死循环拖垮集群。 **解决**: 手动触发重试命令(Reroute): ```json POST /_cluster/reroute?retry_failed=true ``` #### 3. 节点离线 (NODE_LEFT) **现象**:集群变 Yellow,`_cat/nodes` 显示节点数少了一个。 **原因**:节点 OOM(内存溢出)崩溃、网络分区或服务器宕机。 **解决**: - 检查离线节点的 Easysearch 日志(`logs/easysearch.log`)和系统日志(`/var/log/messages`)。 - 如果是 OOM,尝试增加堆内存或优化查询。 - 重新启动该节点,待其加入集群后,状态会自动变绿。 #### 4. 无有效副本 (NO_VALID_SHARD_COPY) - **最棘手的情况** **现象**:集群 Red,且 `explain` 显示找不到有效的主分片副本。 **原因**:所有持有该分片最新数据的节点都挂了,或者数据文件被物理损坏。 **解决**: 这通常意味着数据丢失风险。 - **上策**:尝试恢复挂掉的节点。 - **中策**:如果有快照(Snapshot),立即从快照恢复。 - **下策(会丢数据)**:强制分配一个空的主分片(Stale Primary),这将导致该分片的数据清空,但能让集群变绿,抢救其他数据。 ## 预防胜于治疗:Easysearch 的加固建议 1. **开启 ZSTD 压缩**:Easysearch 的 ZSTD 压缩能大幅减少磁盘占用,从根本上降低“磁盘写满”导致集群变 Red 的概率。 2. **设置合理的堆内存**:不要超过 32GB,预留 50% 内存给文件系统缓存,防止 OOM。 3. **监控断路器 (Circuit Breaker)**:Easysearch 优化了断路器机制,能在内存爆炸前拦截大查询。关注 `fielddata` 和 `request` 断路器的统计指标。 ## 结语 当 Easysearch 变黄或变红时,保持冷静: 1. **Look** (`_cluster/health`): 谁病了? 2. **Find** (`_cat/shards`): 哪块肉病了? 3. **Why** (`allocation/explain`): 为什么病了? 掌握这三步,90% 的生产故障你都能做到心中有数,从容应对。