📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

当监控报警响起,Easysearch 集群状态变为 Yellow 或 Red 时,盲目重启节点往往不仅无济于事,甚至会加重故障。本文将提供一套标准化的排查“三板斧”,教你如何利用 _cluster/health_cat/shardsallocation/explain 三个核心 API,在 5 分钟内精准定位故障根因。


对于 Easysearch 管理员来说,最不想看到的颜色就是红色

  • Green:健康。所有的主分片(Primary)和副本分片(Replica)都处于活动状态。
  • Yellow:警告。所有的主分片都正常,但至少有一个副本分片缺失。数据是完整的,搜索和写入也是正常的,但高可用性(HA)受损。
  • Red:严重。至少有一个主分片缺失。部分数据不可用,针对丢失数据的查询会报错或返回不完整结果。

当集群状态异常时,很多人的第一反应是“重启节点”。请住手! 在搞清楚原因之前,重启可能会导致现场日志丢失,甚至引发数据二次损坏。

请按以下步骤进行“外科手术式”排查。

第一步:确认伤情 —— 哪个索引病了? #

首先,你需要知道是整个集群挂了,还是只是某个具体的索引出了问题。

执行命令:

GET /_cluster/health?level=indices

看什么:
关注返回结果中的 indices 部分。找到状态为 yellowred 的具体索引名称。

  • 如果是 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”,它能像医生一样告诉你:为什么这个分片不健康?

执行命令:

GET /_cluster/allocation/explain

注意:如果有很多未分配的分片,该 API 默认只解释第一个。你也可以指定具体的分片:

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. 关键一步:解除索引的只读锁。
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}
  1. 集群通常会自动开始恢复。

2. 重试次数超限 (ALLOCATION_FAILED) #

现象explain 显示 reached the limit of fair shard recoveries 或类似错误。
原因:分片可能因为某种原因(如 IO 错误、文件损坏)连续 5 次初始化失败,Easysearch 就会放弃治疗,不再尝试分配,防止死循环拖垮集群。
解决
手动触发重试命令(Reroute):

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 优化了断路器机制,能在内存爆炸前拦截大查询。关注 fielddatarequest 断路器的统计指标。

结语 #

当 Easysearch 变黄或变红时,保持冷静:

  1. Look (_cluster/health): 谁病了?
  2. Find (_cat/shards): 哪块肉病了?
  3. Why (allocation/explain): 为什么病了?

掌握这三步,90% 的生产故障你都能做到心中有数,从容应对。