重启变更报错:集群状态不健康或存在close索引,不能执行当前操作

更新时间:
复制 MD 格式

本文介绍重启变更报错的详细说明、可能原因及解决方案。

报错说明

当您触发了Elasticsearch实例重启变更时,系统提示“集群状态不健康或存在close索引,不能执行当前操作,建议待集群状态稳定或开启已关闭的索引后再试”。错误码为InstanceHealthStatusError

问题原因及解决方案

当集群存在以下情况,重启或变更实例时会报出此类错误:
  • 集群中存在close状态的索引。

    您可以通过GET /_cat/indices?v命令查看索引状态。如果索引状态为close,可通过POST /<index_name>/_open将索引状态设置为open。

  • 集群处于yellowred状态。
    您可以通过GET /_cat/health?v命令查看集群状态。常见的异常原因及解决方案如下。
    常见异常原因解决方案
    shard自动分配,已经达到最大重试次数5建议通过POST /_cluster/reroute?retry_failed=true命令,重新分配分片。
    某一索引主副本分片分配到一个节点,对应报错信息为:the shard cannot be allocated to the same node on which a copy of the shard already exists建议将副本设置为0,待集群正常后再设置为1。
    已达到节点最大允许同时分配分片个数的限制当前节点正在分配shard,请耐心等待。您可以通过GET _cluster/allocation/explain命令,查看完整的未分配原因。
    节点失联通过GET _cat/nodes?v命令,查看节点是否已脱离集群。建议对脱离集群的节点进行重启。
    磁盘使用率高磁盘使用率达到水位线,当前节点磁盘已降到85%以下,建议对节点进行重启,使诊断回归正位。
    堆内存熔断建议限流,并将历史索引close降低内存开销。
    其他集群存在主分片未分配,需要关注CPU使用率、堆内存使用情况,结合GET _cluster/allocation/explain命令,获取shard未分配信息进行分析。
  • 集群状态正常,但负载过高。
    常见排查方式、异常原因及解决方案如下。
    排查方式常见异常原因解决方案
    • 查看磁盘使用率监控
    • GET _cat/allocation命令
    • GET _cluster/allocation/explain命令
    • 查看日志
    磁盘使用率达到85%磁盘使用率达到85%,影响到分片的创建,建议按照以下方式处理。处理后,可通过查看磁盘监控,判断磁盘使用率是否降到85%以下。
    • 删除历史索引数据。
    • 扩容磁盘。
    • 将索引副本数设置为0。
    查看CPU使用率监控、热线程CPU使用率达到85%CPU使用率达到85%,影响到集群的稳定性。需要降低流量或扩容,关注集群总体读或写入QPS监控。
    查看堆内存监控、日志、old gc collection count、old gc collecting.ms堆内存达到75%以上堆内存过高,将严重影响到降低集群的稳定性,建议按照以下方式处理:
    • 降低读写量。
    • 强制扩容集群规格。
    • 将历史索引的状态设置为close,降低内存使用率。
    查看load_1m监控load_1m>CPU核数load_1m超过CPU核数,说明当前服务器负载大,需要关注集群总体读或写入QPS监控及磁盘吞吐(每秒读写大小)监控,及时降低流量或扩容。
    说明

冷热分离场景 box_type 参数排查

冷热架构中,索引通过 box_type 参数指定分片分配到热节点冷节点box_type 配置错误会导致分片分配异常,影响变更进度。
执行 GET /{index_name}/_settings 查看索引 settings 中 box_type 配置,确保 box_type 值与节点类型匹配:热节点为 hot,冷节点为 warm。

routing _id 字段排查

索引 settings 中 routing 指定 _id 字段会导致分片无法正常分配,影响变更进度。
执行 GET /{index_name}/_settings 检查 index.routing 配置。如果 routing 指定了 _id 字段,将其设为 null 以恢复分片分配。