Elasticsearch 磁盘使用率超过警戒水位线,怎么办?

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch 磁盘使用率超过警戒水位线,怎么办?

1、引言

本系列文章介绍如何修复 Elasticsearch 集群的常见错误和问题。

这是系列文章的第一篇,主要探讨:Elasticsearch 磁盘使用率超过警戒水位线,怎么办?

2、从磁盘常见错误说开去

当客户端向 Elasticsearch 写入文档时候报错:

cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];

在 elasticsearch 的日志文件中报错如下:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only

出现如上问题多半是:磁盘使用量超过警戒水位线,索引存在 read-only-allow-delete 索引块数据。

3、报错释义

基础认知:磁盘三个警戒水位线:

推荐阅读:你不得不关注的 Elasticsearch Top X 关键指标

属性名 属性值 含义
cluster.routing.allocation.disk.watermark.low 85% 低警戒水位线
cluster.routing.allocation.disk.watermark.high 90% 高警戒水位线
cluster.routing.allocation.disk.watermark.flood_stage 95% 洪泛警戒水位线

文章第 2 小节的报错表明数据节点的磁盘空间严重不足,并且已达到磁盘洪泛警戒水位线(磁盘使用率95%+,洪水泛滥的意思)。

为防止磁盘变满,当节点达到洪泛警戒水位线时,Elasticsearch 会阻止向该节点的任何索引分片写入数据,后面还会具体介绍如何阻止。

如果该数据块影响到相关的系统索引,可能会导致 Kibana 或者其他 Elastic Stack 功能不可用。

4、修复指南

4.1 cat shards 验证分片分配

要验证分片是否正在移出受影响的节点,请使用 cat shards API。

GET _cat/shards?v=true

4.2 explain 验证分配细节

如果分片仍然保留在节点上,请使用集群 allocation/explain API 获取其分配状态的说明。

GET _cluster/allocation/explain
{
"index": "my-index",
"shard": 0,
"primary": false,
"current_node": "my-node"
}

如上 API几个参数解释如下:

  • index: 对应索引。
  • shard:分片号。
  • primary:是否主分片。
  • current_node: 节点名称。

四个参数需要结合业务实际进行修改。

4.3 恢复写入,可以上调磁盘警戒水位线。

要立即恢复写入操作,你可以暂时上调磁盘警戒水位并移除写入块。

如下命令行是集群层面更新设置的操作。

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "95%",
"cluster.routing.allocation.disk.watermark.flood_stage": "97%"
}
}

索引块的五种不同状态如下:

  • 状态一:index.blocks.read_only

设置为 "true"可以使索引和索引元数据只读,"false "可以允许写入和元数据改变。

  • 状态二:index.blocks.read_only_allow_delete

类似于index.blocks.read_only,但也允许删除索引释放磁盘资源。

基于磁盘的分片分配器(The disk-based shard allocator)可以自动添加和删除index.blocks.read_only属性的数据块。

这里依然会引申出删除索引文档和删除索引本身的区别等知识点:

(1)删除索引文档会出现删除后磁盘使用率反而增加的现象,因为删除的本质是 version 的 update;只有删除索引才相当于物理删除,会立即释放磁盘空间。

(2)当 index.blocks.read_only_allow_delete 被设置为true时,删除文档是不允许的,仅允许删除索引。

(3)当磁盘使用率达到洪泛警戒水位线 95% 时,Elasitcsearch 会强制所有包含分片数据的索引的数据库设置为:index.blocks.read_only_allow_delete 属性。

(4)当磁盘使用率低于高警戒水位线 90% 时,index.blocks.read_only_allow_delete 属性会自动释放。

  • 状态三:index.blocks.read

设置为 "true",代表禁止对索引进行读操作。

  • 状态四:index.blocks.write

设置为 "true "代表禁止对索引的数据写入操作。

与read_only不同,这个设置并不影响元数据。例如,你可以用一个 write 块关闭一个索引,但是你不能用一个 read_only 块关闭一个索引。

  • 状态五:index.blocks.metadata

设置为 "true "代表禁用索引元数据的读写。

所以,如下的设置本质上是破除磁盘洪泛警戒水位线 95% 的 index.blocks.read_only_allow_delete 的限制,让索引继续可以写入数据。

个人评价:应急可以用。

PUT */_settings?expand_wildcards=all
{
"index.blocks.read_only_allow_delete": null
}

4.4 长期解决方案

作为长期解决方案,我们建议您将节点添加到受影响的数据层或升级现有节点实现节点磁盘扩容以增加磁盘空间。

比如:data_hot 热节点爆满,建议:

  • 添加新的热节点
  • 为已有热节点磁盘扩容。

要释放额外的磁盘空间,你可以使用删除索引 API 删除不需要的索引。

DELETE my-index

4.5 重置磁盘警戒水位线操作

当长期解决方案到位时,可使用如下命令行重置磁盘警戒水位线。

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": null,
"cluster.routing.allocation.disk.watermark.high": null,
"cluster.routing.allocation.disk.watermark.flood_stage": null
}
}

5、小结

为避免磁盘使用率吃紧的问题,建议如下:

  • 第一:“不等下雨天之前就修好屋顶”,而不是“下了雨之后应急修补屋顶”。
  • 第二:做好磁盘使用率监控和预警操作。
  • 第三:提前规划设置 total_shards_per_node 参数,以使得各个节点分片分配数相对均衡。

你在磁盘方面遇到哪些问题?如何解决的?欢迎留言反馈讨论。

和你一起,死磕 Elasticsearch!

参考

https://stackoverflow.com/questions/50609417/elasticsearch-error-cluster-block-exception-forbidden-12-index-read-only-all

https://www.elastic.co/guide/en/elasticsearch/reference/current/fix-common-cluster-issues.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.16/index-modules-blocks.html

推荐

1、重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

2Elasticsearch 7.X 进阶实战私训课(口碑不错)

3、如何系统的学习 Elasticsearch ?


更短时间更快习得更多干货!

已带领88位球友通过 Elastic 官方认证!

比同事抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
监控 安全 API
Elasticsearch实例磁盘占用率高排查及解决
开源 ES 实例健康状态 首先,先介绍下开源 Elasticsearch 的三种健康状态:绿色、黄色和红色。 在分片层面, 绿色:所有的主分片和副本分片都已分配。你的集群是 100% 可用的。 黄色:所有主分片都已经分配,但至少有一个副本分片未被分配。
8856 0
|
6月前
|
索引
Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
【7月更文挑战第2天】Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
|
8月前
|
监控 数据可视化 Java
Elasticsearch JVM 堆内存使用率飙升,怎么办?
Elasticsearch JVM 堆内存使用率飙升,怎么办?
497 0
|
搜索推荐 索引
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
202 3
|
存储 缓存 监控
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
327 2
|
存储 监控 负载均衡
大数据数据存储的搜索引擎Elasticsearch的调优的磁盘读写优化
Elasticsearch是一个可扩展的搜索引擎,可以在同一个集群中部署多个Elasticsearch节点,以提高性能和可用性。
97 0
|
缓存 负载均衡 NoSQL
Elasticsearch实战-磁盘IO被打满
Elasticsearch实战-磁盘IO被打满
|
2月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
85 5
|
3月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
338 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
4月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo