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年国庆更新版)

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

3、如何系统的学习 Elasticsearch ?

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

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

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

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

  1. 查看Elasticsearch磁盘使用率

    1 需求 需要查看Elasticsearch磁盘使用率,方便扩容,数据迁移 2 命令 http://127.0.0.1:9012/_cat/allocation?v&pretty

  2. shell脚本实战-实现磁盘使用率超过90%就告警的三种方法v1版

    需求 时刻监控磁盘使用率,达到90%就开始告警. 告警可以使用: 邮件告警 钉钉告警 微信告警 今天我们先来看最简单的V1的版本,实现简单需求,后面再增加功能 方法一: awk 嵌套if循环 df - ...

  3. ES7 设置磁盘使用率水位线 allocation.disk.watermark

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  4. Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本

    1.概述 转载:https://www.cnblogs.com/operationhome/p/12150530.html 2.问题 最近在查看线上的 es,发现最近2天的索引没有副本,集群的状态也是 ...

  5. ElasticSearch磁盘达到阈值异常,写不进去数据

    异常信息 {"error": {"root_cause": [{"type": "cluster_block_exception& ...

  6. netty 水位线与oom

    Netty版本4.1.6. 当channel被调用到writAndFlush()的时候,如同字面意思,实现了两次操作,write和flush,其中write的时候并没有将消息直接写入到socket中, ...

  7. AIX和LINUX主机 CPU 内存 磁盘使用率监控

    AIX监控 磁盘使用率监控 df -g|grep -v Filesystem|grep -v proc|awk ' gsub(/%/,"",$4) {print $7 " ...

  8. java 监控linux服务器cpu使用率、内存使用率、磁盘使用率、java进程是否存活等服务

    java 监控linux服务器cpu.内存.java进程是否存活,发现异常发送邮件提醒 前一段时间在维护一个N年前的项目,这个项目有十几个服务器,每个服务器上有十几个服务.接手后的几个星期天天有事,要 ...

  9. 一文理解Flink 水位线(Flink Watermark)

    文章目录 Flink 中的时间语义 `处理时间` `事件时间` 水位线(Watermark) `事件时间和窗口` `什么是水位线` 有序流中的水位线 乱序流中的水位线 `水位线的特性` `如何生成水位 ...

  10. Flink Watermark相关概念(窗口、水位线、迟到事件)

    Flink 为实时计算提供了三种时间,即事件时间(event time).摄入时间(ingestion time)和处理时间(processing time).在进行 window 计算时,使用摄入时 ...

最新文章

  1. 定义Serializer序列化器
  2. How do use my library
  3. string 中的offset_Kafka+Spark Streaming管理offset的几种方法
  4. Go的sync.Cond(四)
  5. Angular之ngx-permissions的管理权限
  6. 关于module_param()宏
  7. C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题
  8. 富人是如何发财的——思考致富的方法
  9. 如何设置Eclipse新建项目的默认编码方式
  10. php上传文件502,PHPStrom上传文件报502错误原因
  11. 周围剃光头顶留长发型_?22岁亿万富翁凯莉登杂志,顶着5斤“鸟窝头”凹造型,绝代艳后...
  12. [Erlang 0127] Term sharing in Erlang/OTP 上篇
  13. linux flash 存储寿命,关于 Flash 存储,你应该知道的一些事情
  14. 史上最全的oracle常用知识总结
  15. 小人有三种,这种最阴险,最好策略不是硬杠
  16. TensorFlow中相关的维度处理函数
  17. html为知笔记模板,为知笔记,模板制作.doc
  18. windows下用cmd卸载程序
  19. PHP关闭Notice错误提示
  20. Solidworks如何绘制螺纹

热门文章

  1. 虚拟IP技术 ip地址漂移技术
  2. 几种常见的Java排序算法
  3. 携号转网查询接口API,手机号码归属地及运营商查询接口
  4. 【数学建模】2018 A题 高温作业专用服装设计(8.22-8.24训练)
  5. 从0开始写sql脚本到执行sql脚本。
  6. 中文文本分析工具总结
  7. 抓包工具之MitmProxy
  8. springboot医院门诊挂号病历管理系统
  9. vue仿网易云音乐播放器
  10. 移远EC20开发环境搭建