CSS集群索引写入数据失败
问题描述
向Elasticsearch/OpenSearch集群索引中写入数据失败,返回如下报错信息:
"reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
索引被设置为只读模式(read-only / allow delete),所有写入操作(包括创建、更新文档)均被阻止。
问题原因
当数据节点的磁盘使用率超过95%时,Elasticsearch/OpenSearch为了防止节点耗尽磁盘空间导致系统崩溃,自动将索引设置为只读模式(“index.blocks.read_only_allow_delete”设置为“true”)。在此模式下,所有写入请求被拒绝,仅保留删除权限以释放空间。
不同版本的自动恢复机制存在差异:
- Elasticsearch 7.10.2及OpenSearch版本:磁盘使用率下降后自动关闭只读模式,无需手动解除。
- Elasticsearch 7.10.2之前的版本:磁盘使用率下降后不会自动关闭只读模式,需手动解除。
解决方法
- 检查集群的监控指标,确认磁盘使用率,如磁盘使用率超过95%,则需清理或扩容磁盘。
- 清理磁盘空间或扩容磁盘。
- 解除索引只读模式。
- Elasticsearch 7.10.2及OpenSearch版本
该版本的集群磁盘使用率下降后会自动关闭只读模式。等待约1~2分钟后,重新尝试写入数据验证是否恢复正常。
- Elasticsearch 7.10.2之前的版本
该版本的集群磁盘使用率下降后不会自动关闭只读模式,需手动解除只读模式。
- 执行以下命令,解除所有索引的只读模式:
PUT /_all/_settings { "index.blocks.read_only_allow_delete": null }
执行此命令前需确保磁盘使用率已下降至安全水位,否则解除只读模式后磁盘仍可能再次触发只读保护。
- 等待约1~2分钟后,重新尝试写入数据验证是否恢复正常。
- 执行以下命令,解除所有索引的只读模式:
- Elasticsearch 7.10.2及OpenSearch版本
- 为避免故障再次发生,建议:
- 定期监控节点磁盘使用率,配置告警阈值(建议85%)。
- 定期清理过期索引和文档,释放磁盘空间。
- 规划充足的存储容量,预留15%~20%的磁盘冗余空间。