ElasticSearch系列---【Es报错:blocked by: [TOO MANY_REQUESTS/12/disk usage exceeded flood-stage watermark,index has read-only-allow-delete】

1.问题

ES突然无法写入了,查看报错日志如下:
blocked by: [TOO MANY_REQUESTS/12/disk usage exceeded flood-stage watermark,index has read-only-allow-delete

2.分析

这个错误通常出现在Elasticsearch中,意味着磁盘使用量已经超过了Elasticsearch为索引设置的水位线限制,该限制被称为洪峰水位线(flood-stage watermark)。当磁盘使用量超过这个限制时,Elasticsearch会自动将索引设置为只读,并且不允许删除操作,以防止进一步的数据丢失。

查看read_only_allow_delete的值,默认是true

# kibana
GET /<index_name>/_settings?pretty

3.解决方案

3.1生产环境直接申请增加磁盘

3.2非生产环境可以采用下面的临时方案

3.2.1把索引副本数改成0个,索引大小直接少一半

如果执行失败,则先解锁索引或删除无用的索引释放一部分空间

PUT 索引名/_settings
{
  "number_of_replicas": 0
}

3.2.2 直接解锁索引

# kibana
PUT  _all/_settings
{
    "index.blocks.read_only_allow_delete":null
}
# shell
curl -XPUT  http://localhost:9200/_all/_settings -H 'Content-Type: application/json' -d '{ "index.blocks.read_only_allow_delete": null }
_all表示解除所有索引,如果要解锁指定索引,则把_all改成具体的索引名称。

3.2.3 先用剩下的磁盘顶一阵

1.关闭磁盘分配保护

# kibana
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.threshold_enabled": false
  }
}

2.关闭索引的只读状态

# kibana
 
PUT _all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

3.磁盘清理或者扩容完毕后,启用磁盘分配保护

# kibana
 PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.threshold_enabled": true
  }
}

3.2.4清除服务器无用的磁盘大日志文件

3.2.5reindex已有的大索引,迁移之后会释放至少三分之一的空间

1.打开kibana的索引管理页面,按存储大小排序,找到大索引。
2.根据原有mapping,新建备份索引。
3.reindex现有的索引到备份索引。
4.删除原索引。
5.给备份索引添加别名为原有索引名。

posted on 2025-06-10 19:26  少年攻城狮  阅读(382)  评论(0)    收藏  举报

导航