OpenSearch触发flood-stage watermark报错但存储空间充足问题排查
问题根因
- 触发磁盘洪泛水位线后,OpenSearch会给对应索引加上
read-only-allow-delete只读块,这个块是持久化生效的,不会因为后续磁盘空间恢复自动移除,这是你明明剩余存储空间充足依然无法写入的直接原因。 - 你是单节点部署,但索引默认配置了1个副本分片,OpenSearch不允许主副分片分配到同一个节点,导致副本分片长期处于未分配状态,集群状态持续为Yellow,从你调用
_cluster/allocation/explain返回的same_shard拦截规则就能验证这个问题。 - 你当前使用的配置文件是多节点生产集群模板,其中
gateway.recover_after_nodes: 3等配置和单节点部署模式不匹配,会干扰集群恢复阶段的状态判断,增加异常触发概率。 - MacOS本地APFS文件系统的可用空间计算机制、Homebrew安装版本的目录权限问题,偶尔会导致OpenSearch拿到的磁盘可用空间数值和系统实际显示值不一致,也可能是最初触发洪泛水位线的诱因。
修复步骤
按顺序执行以下操作即可恢复正常写入:
- 清除所有索引的只读块
执行如下命令调用集群设置接口,移除全局的只读限制:
执行完等待10秒左右可以先尝试写入,确认429报错是否消失。curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}' - 调整副本配置适配单节点模式
单节点部署不需要保留副本分片,先修改默认索引模板,保证后续新建的索引默认副本数为0:
再修改现有问题索引的副本数,清除未分配的异常分片:curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_template/single_node_default -d '{"index_patterns":["*"],"settings":{"number_of_replicas":0}}'
执行完成后调用curl -XPUT -H "Content-Type: application/json" http://localhost:9200/english_minus_nouns/_settings -d '{"number_of_replicas":0}'http://localhost:9200/_cluster/health查看集群状态,确认status变为Green即可。 - 修正配置文件的不兼容项
打开你的opensearch.yml配置文件,注释或删除以下和单节点部署不匹配的配置项:
修改完成后重启OpenSearch服务,Homebrew安装版本可直接执行# 注释掉该行,单节点恢复不需要等待3个节点上线 #gateway.recover_after_nodes: 3 # 本地测试环境建议注释锁内存配置,避免MacOS权限不足导致启动异常 #bootstrap.memory_lock: truebrew services restart opensearch完成重启。 - (可选)调整磁盘水位线阈值适配本地环境
如果后续依然偶发磁盘水位线误报,可以通过接口调宽松阈值,本地开发环境使用无风险:curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.watermark.low": "90%", "cluster.routing.allocation.disk.watermark.high": "95%", "cluster.routing.allocation.disk.watermark.flood_stage": "99%" } }'
注意事项
- 以上配置仅适用于本地单节点测试环境,生产多节点集群请勿调整副本数为0,也不要过度放宽磁盘水位线阈值。
- 日常使用如果遇到磁盘占满触发只读块的情况,清理磁盘空间后也需要手动执行第一步的清除块命令,集群不会自动恢复写入权限。
内容的提问来源于stack exchange,提问作者Xavi Font
相关产品推荐
相关产品推荐

