Elasticsearch 索引变为只读问题:原因与解决方案
当 Elasticsearch 集群磁盘空间不足时,可能会触发内置的磁盘保护机制,将索引强制设置为只读状态,导致无法写入或修改数据。本文详细解析这一问题的成因、解决步骤及预防措施。
问题根源:磁盘水位线(Watermark)保护机制
Elasticsearch 为防止磁盘空间耗尽,通过磁盘水位线机制监控节点磁盘使用率,并在达到阈值时采取保护措施:
| 水位线参数 | 默认值 | 触发行为 |
|---|---|---|
cluster.routing.allocation.disk.watermark.low |
85% | 磁盘使用率超过 85% 时,不再向该节点分配新分片。 |
cluster.routing.allocation.disk.watermark.high |
90% | 磁盘使用率超过 90% 时,将该节点上的分片迁移到其他节点。 |
cluster.routing.allocation.disk.watermark.flood_stage |
95% | 磁盘使用率超过 95% 时,将节点上所有索引设置为只读(read_only_allow_delete),仅允许删除操作。 |
触发只读的典型日志
当达到 flood_stage 水位线时,日志会显示类似以下内容:
1 | flood stage disk watermark [95%] exceeded on [node-id][node-name][/path/to/data] |
此时,所有写入、更新操作会失败,仅查询和删除操作可用。
解决步骤:恢复读写能力
紧急处理:释放磁盘空间
首先需释放足够的磁盘空间(建议至少保留 10% 以上空闲空间):
- 删除无用的索引、日志文件或临时文件。
- 迁移部分数据到其他存储(如冷数据归档)。
关闭磁盘水位线检查(临时)
若无法立即扩容,可临时关闭磁盘阈值检查,允许 Elasticsearch 忽略水位线限制:
