Elasticsearch 索引的 read_only_allow_delete 属性详解与解决方案


Elasticsearch 索引的 read_only_allow_delete 属性详解与解决方案

背景

在这台服务器上,不仅运行着 Elasticsearch(ES),还部署了 Kafka。由于 Kafka 的某些 Topic 产生了大量数据,导致磁盘空间被迅速填满,达到了 100%。为了解决这一问题,我及时清理了 Kafka 的数据,并恢复了部分磁盘空间。

由于清理完 Kafka 之后,ES 仍然能够正常运行,因此当时并未对其进行进一步检查或管理。然而,两天后,有用户反馈 Kibana 无法查看日志。在排查过程中,发现 ES 的所有索引均被自动设置为 read_only_allow_delete 状态,导致 Kibana 读取日志失败。最终确认,问题的根本原因是磁盘空间一度耗尽,ES 出于自我保护机制,将索引设置为了只读模式,即使磁盘空间已经恢复,也不会自动解除该限制。

介绍

在 Elasticsearch 中,read_only_allow_delete 是一种索引级别的设置,用于限制对索引的写操作,但允许删除操作。具体来说,当该设置为 true 时,索引会处于只读状态,无法执行新增或更新操作,但允许执行删除操作。这种机制通常用于防止误操作或意外修改,特别是在关键数据上。本文将详细介绍 read_only_allow_delete 的作用、触发条件、解决方法以及如何避免此问题。

如何检查 read_only_allow_delete 状态

我们可以使用 curl 命令检查 Elasticsearch 各索引的 read_only_allow_delete 状态。

查看所有索引的 read_only_allow_delete 状态

curl -X GET "http://192.168.1.100:9200/_all/_settings?pretty"

该命令会返回所有索引的设置,包括 read_only_allow_delete 的状态。

查看特定索引的 read_only_allow_delete 状态

curl -X GET "http://192.168.1.100:9200/logstash-system-log-2025.02.18/_settings?pretty"

上面的命令用于查看 logstash-system-log-2025.02.18 索引的 read_only_allow_delete 状态。

过滤 read_only_allow_delete 相关的设置

如果想快速查找哪些索引被设置为只读,可以使用:

curl -X GET "http://192.168.1.100:9200/_all/_settings?pretty" | grep -A 5 "blocks.read_only_allow_delete"

这条命令会在所有索引的设置中筛选出包含 blocks.read_only_allow_delete 的部分,帮助快速定位受影响的索引。

read_only_allow_delete 的作用

当 Elasticsearch 中的某个索引设置了 read_only_allow_delete: true 时,该索引会被置为只读模式。这个设置的主要目的是保护数据不被无意中更改,但仍允许删除操作。这通常是为了防止磁盘空间不足或其他资源问题导致的数据损坏或丢失。

常见触发条件

Elasticsearch 会在以下情况下自动将索引的 read_only_allow_delete 设置为 true

  • 磁盘空间使用率过高:当集群中的某个节点磁盘使用率超过 95% 时,Elasticsearch 会自动将所有索引的 read_only_allow_delete 设置为 true,以防止新数据写入,避免进一步占用磁盘空间。这是一种防止磁盘耗尽的保护机制。

示例

假设您有一个索引,名为 .kibana_task_manager,在磁盘空间紧张的情况下,Elasticsearch 会将该索引的 read_only_allow_delete 设置为 true,以防止写入操作,确保系统稳定。

{
  ".kibana_task_manager": {
    "settings": {
      "index": {
        "blocks": {
          "read_only_allow_delete": "true"
        }
      }
    }
  }
}

如何解除只读限制

当磁盘空间得到释放或问题解决后,您需要手动解除索引的只读限制。以下是解除索引只读状态的方法:

1. 释放磁盘空间

首先,确保磁盘空间已得到释放。可以通过以下几种方式释放磁盘空间:

  • 删除不再需要的旧索引。
  • 清理无用的日志文件。
  • 删除不必要的 .gz 压缩文件。

2. 手动解除只读限制

当磁盘空间足够后,您可以通过以下请求解除索引的只读限制:

PUT /<索引名称>/_settings
{
  "settings": {
    "index.blocks.read_only_allow_delete": null
  }
}

例如,解除 .kibana_task_manager 索引的只读限制:

PUT /.kibana_task_manager/_settings
{
  "settings": {
    "index.blocks.read_only_allow_delete": null
  }
}

如果发现索引被设置为 read_only_allow_delete: true,可以使用以下命令来解除只读状态:

curl -X PUT "http://192.168.1.100:9200/_all/_settings" -H "Content-Type: application/json" -d '
{
  "index.blocks.read_only_allow_delete": false
}'

执行该命令后,所有索引将恢复为可读写状态。

这样,所有索引的 read_only_allow_delete 属性都会被解除,允许正常进行写入操作。

预防措施

为了避免因磁盘空间不足导致索引被设置为只读,您可以采取以下预防措施:

1. 监控磁盘空间

定期检查磁盘空间,及时清理不必要的数据或日志文件。确保磁盘空间充足,以防止系统因磁盘满而自动将索引设置为只读。

2. 配置磁盘水位线

您可以设置磁盘水位线,当磁盘使用率达到一定水平时,系统会自动采取措施来释放空间。Elasticsearch 提供了以下几种水位线配置:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "85%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%"
  }
}
  • low: 当磁盘使用率达到 85% 时,Elasticsearch 会开始分配新的数据节点。
  • high: 当磁盘使用率达到 90% 时,Elasticsearch 会进行更多的数据迁移操作。
  • flood_stage: 当磁盘使用率达到 95% 时,Elasticsearch 会将所有索引设置为只读模式,以避免进一步填满磁盘。

3. 扩展磁盘空间

如果监控到磁盘使用率过高,可以考虑扩展磁盘容量,增加更多存储资源,避免因为磁盘空间不足而导致索引被自动设置为只读。

注意事项

  • 磁盘空间管理:为了避免频繁触发 read_only_allow_delete 状态,建议定期管理磁盘空间,包括清理不必要的文件和旧索引。
  • 性能影响:当磁盘空间接近满时,Elasticsearch 会自动进入保护模式,这可能会影响到集群的性能。因此,及时处理磁盘空间问题非常重要。

总结

read_only_allow_delete 是 Elasticsearch 中的一种保护机制,用于防止在磁盘空间不足的情况下对索引进行修改操作。通过合理的磁盘空间管理和预警机制,我们可以有效避免索引被设置为只读状态,并确保系统的稳定运行。希望本文能够帮助您理解 read_only_allow_delete 设置的作用,并为您提供一些解决方案,帮助您应对磁盘空间不足的挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMYX-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值