问题表现
报错信息:TOO_MANY_REQUESTS disk usage exceeded flood-stage watermark,index has read-only-allow-delete block
错误信息整体解析
该错误完整含义为:由于磁盘使用量超过了洪水阶段水位线(flood-stage watermark),系统触发了保护机制,将索引设置为"只读-允许删除"(read-only-allow-delete)状态,同时拒绝新的写入请求(TOO_MANY_REQUESTS),防止磁盘被完全占满而影响集群稳定性。
错误原因
- 磁盘空间不足:集群中的一个或多个节点磁盘使用率超过了95%(默认flood-stage阈值)
- 未清理旧数据:日志或历史数据积累过多
- 索引膨胀:数据增长速度超过预期,或索引配置不合理
- 磁盘故障:物理磁盘或挂载点出现问题
解决方案
1. 临时解除只读限制(紧急恢复)
通过API临时允许写入,但这不会解决根本问题:
curl -X PUT "localhost:9200/_all/_settings" -H 'Content-Type: application/json' -d'
{
"index.blocks.read_only_allow_delete": null
}
'
2. 释放磁盘空间
-
删除无用索引:
curl -X DELETE "localhost:9200/old-index-*"
-
调整分片分配:将部分索引迁移到磁盘空间充足的节点
-
缩小索引:对大索引进行rollover或force merge
3. 调整磁盘水印设置(临时缓解)
通过以下命令临时降低警戒水位:
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "95%",
"cluster.routing.allocation.disk.watermark.flood_stage": "98%"
}
}
'
4. 长期优化建议
- 监控磁盘使用:设置告警阈值(建议在75%时触发)
- 配置索引生命周期管理(ILM):自动删除或冻结旧数据
- 增加磁盘空间:挂载更大容量的磁盘或扩展现有卷
- 水平扩展集群:添加更多数据节点分担存储压力
- 优化索引结构:使用合适的分片数和副本数
验证修复
执行以下命令检查集群健康状态和磁盘使用情况:
curl -X GET "localhost:9200/_cluster/health?pretty"
curl -X GET "localhost:9200/_cat/allocation?v"
确保磁盘使用率低于高水位线,并且集群状态变为green或yellow。
如果问题反复出现,建议深入分析数据增长模式并规划长期存储策略。