集群磁盘使用率过高和read_only问题的排查与处理方法

更新时间:
复制 MD 格式

本文介绍当您遇到磁盘使用率超过85%,甚至达到100%,导致阿里云Elasticsearch集群或Kibana无法正常提供服务时,采用的排查方式。

重要

免责声明:本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不进行任何暗示或其他形式的承诺。

问题一:集群磁盘使用率过高,并且报错index read_only

问题描述

  • 在进行索引请求时,返回类似index read_only的报错。例如FORBIDDEN/12/index read-only / allow delete (api)];]

  • 集群处于Red状态,严重情况下存在节点未加入集群的情况(可通过GET _cat/nodes?查看),并且存在未分配的分片(可通过GET _cat/allocation?v查看)。

    说明

    Red状态代表部分主分片不可用,可能已经丢失数据。

  • 通过Kibana控制台创建管道、注册Beats时报错:internal server error

  • 通过阿里云Elasticsearch控制台的集群监控页面,或者登录Kibana控制台进入监控页面,动态查看近一段时间的集群负载,磁盘使用率曾达到100%。

问题原因

上述问题是由于磁盘使用率过高导致的。数据节点的磁盘使用率存在以下三个水位线,超过水位线可能会影响阿里云ElasticsearchKibana服务:

  • 超过85%,会导致新的分片无法分配。

  • 超过90%,阿里云Elasticsearch会尝试将对应节点中的分片迁移到其他磁盘使用率比较低的数据节点中。

  • 超过95%,系统会对阿里云Elasticsearch集群中的每个索引强制设置read_only_allow_delete属性,此时索引将无法写入数据,只能读取和删除对应索引。磁盘使用率

除数据节点磁盘水位线外,以下情况也可能导致写入失败或告警,需一并排查:

  • 分片数达到上限:ES 集群数据节点默认单节点支持 1000 个分片。当分片数超限时,会导致 Logstash 无法写入日志或无法创建新索引。

    执行以下命令查看当前分片数上限:

    GET /_cluster/settings?include_defaults=true&flat_settings=true

    查看返回结果中的cluster.max_shards_per_node参数值。

    临时解决方法:执行以下命令将分片数上限调整为 2000。

    PUT /_cluster/settings
    {
      "transient": {
        "cluster": {
          "max_shards_per_node": 2000
        }
      }
    }
    说明

    PUT与路径之间需加空格。此为临时方案,长期建议清理过期无用索引或扩容数据节点数量。

  • 系统索引生命周期策略:若磁盘使用率频繁波动但未配置自定义 ILM 策略,可能是由系统索引(如.monitoring-es-*.monitoring-kibana-*)的默认生命周期策略导致。这些索引每天会自动创建并删除旧索引,属于正常现象,无需额外处理。

  • 资源关联影响:磁盘使用率过高可能伴随 JVM 内存使用率升高(如达 90%)及节点异常,进而导致 Kibana 无法连接。此时需同时扩容磁盘和内存资源。若集群状态不健康,升配时需开启强制变更,且建议在业务低峰期操作以避免重启影响业务。

解决方案

  1. 执行以下命令删除数据。

    警告

    数据删除后将无法恢复,请谨慎操作。您也可以选择保留数据,但需进行磁盘扩容,详情请参见升配集群

    curl -u <username>:<password> -XDELETE http://<host>:<port>/<index-name>
    • <host>表示阿里云Elasticsearch实例的公网或私网地址,建议使用前先确认相关白名单是否开启。

    • 执行命令后,如果集群无法响应,建议触发强制重启,在重启阶段尝试执行删除命令。

  2. 检测集群索引是否依然为read_only状态,如果是,执行以下命令,将集群中所有索引的index.blocks.read_only_allow_delete属性设置为null,使集群中不再存在read_only状态的索引。

    PUT _settings
    {  
       "index.blocks.read_only_allow_delete": null
    }
  3. 检测集群是否依然为Red状态,如果是,可使用_cat/allocation?v命令查看集群中是否存在未分配的分片。

  4. 如果存在未分配的分片,可执行GET _cluster/allocation/explain命令查看未分配分片的原因。如果原因如下图,请手动执行POST /_cluster/reroute?retry_failed=true命令。未分配分片的原因

  5. 等待分片下发完成后,查看集群状态。如果集群状态依然为Red,请联系阿里云技术支持工程师解决。

问题二:磁盘

常见问题

为什么 Elasticsearch 控制台显示集群状态正常,但仍收到磁盘使用率告警?

控制台显示的集群状态(Green/Yellow/Red)反映集群的可用性和分片健康状况,与磁盘使用率属于不同维度的指标。集群状态正常仅表示当前所有分片已正常分配、集群可以提供服务,但磁盘使用率可能已达到告警阈值(如 91%)。

高磁盘使用率虽未立即触发 read_only 模式,但已接近危险水位(95% 将强制只读),随时可能导致写入业务中断。建议立即采取以下措施:

  1. 通过阿里云 Elasticsearch 控制台的集群监控页面核实具体磁盘使用率数值。

  2. 及时扩容磁盘或清理无用索引以消除隐患。

更多信息

为避免磁盘使用率过高影响阿里云Elasticsearch服务,建议开启磁盘使用率监控报警,及时查收报警短信,提前做好防御措施,详情请参见配置集群报警