集群磁盘使用率过高和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属性,此时索引将无法写入数据,只能读取和删除对应索引。磁盘使用率

解决方案

冻结索引(_freeze,Elasticsearch 7.x及以下版本支持,8.x已废弃)或关闭索引(_close)不会释放磁盘空间。这两种操作只是将索引设为只读并降低内存等资源占用,数据仍保留在磁盘上。要释放磁盘空间,需要删除索引数据。

  1. 删除数据以释放磁盘空间。

    根据实际需求,选择以下任一方式删除数据:

    • 方式一:删除整个索引

      执行以下命令删除整个索引,物理删除索引数据并立即释放磁盘空间。

      警告

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

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

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

    • 方式二:删除部分文档后强制合并

      如果只需删除索引中的部分或全部文档而保留索引结构,先通过_delete_by_query API删除文档,再执行_forcemerge强制合并segment以回收已删除文档占用的磁盘空间。

      KibanaDev Tools中执行以下命令删除文档(以删除全部文档为例):

      POST /<index-name>/_delete_by_query
      {
        "query": {
          "match_all": {}
        }
      }

      文档删除完成后,执行以下命令强制合并segment以释放磁盘空间:

      POST /<index-name>/_forcemerge?max_num_segments=1
  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命令。未分配分片的原因

    说明

    扩容或清理数据后仍报错:磁盘使用率曾达到100%会导致分片分配失败,并累计失败重试次数。即使随后完成磁盘扩容或清理了数据,部分分片仍可能停留在未分配(unassigned)状态,集群对外表现为查询报503search_phase_execution_exception等错误。此时需手动执行POST /_cluster/reroute?retry_failed=true重试失败的分片分配,命令返回后需等待分片数据恢复完成,集群才能恢复正常服务。

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

问题二:磁盘

常见问题

如何临时调整磁盘水位限制以恢复集群健康状态?

当集群因磁盘水位限制导致状态不健康、存在未分配分片,且无法立即扩容时,可在KibanaDev Tools中执行以下命令,临时调高磁盘水位阈值(以将low阈值调整为88%为例),使受水位限制而未分配的分片重新分配。

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "88%"
  },
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "88%"
  }
}
重要

该操作仅为临时应急方案。集群恢复Green后,请尽快通过控制台进行原地滚动变更升级配置,或清理无用数据,避免长期依赖调高后的水位线。

删除索引后磁盘空间多久开始释放?

删除索引后,磁盘空间通常在几分钟到半小时内开始释放,并在短时间内反映到监控指标中。

如果长时间仍未释放,建议检查是否存在其他占用(例如未删除的索引、快照或日志),或确认监控指标是否存在刷新延迟。

更多信息

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