Elasticsearch 磁盘使用率超过 85% 导致只读怎么解锁?

文章导读
遇到 Elasticsearch 因磁盘使用率过高进入只读模式,最稳妥的做法是先清理磁盘空间或调整水位线配置,再手动解除索引的只读锁。需注意,默认触发只读保护的水位线是 95%(flood_stage),85% 仅为低水位线警告。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

遇到 Elasticsearch 因磁盘使用率过高进入只读模式,最稳妥的做法是先清理磁盘空间或调整水位线配置,再手动解除索引的只读锁。需注意,默认触发只读保护的水位线是 95%(flood_stage),85% 仅为低水位线警告。

先说结论:这是触发了磁盘水位线保护机制,需先释放空间或调整阈值,再清除只读标记

  • 先确认:检查集群磁盘使用率及水位线配置(默认 flood_stage 为 95%)
  • 先处理:清理磁盘空间或临时调高水位线阈值(有风险)
  • 再验证:确认索引读写状态恢复正常

命令速用版

如果已确认磁盘空间安全,可直接执行以下命令解除只读锁:

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

为什么会这样

Elasticsearch 内置了磁盘水位线(Disk Watermark)机制。默认配置如下:

  • low (85%): 停止分配新分片到此节点。
  • high (90%): 尝试迁移分片离开此节点。
  • flood_stage (95%): 强制将所有索引设置为只读允许删除(read_only_allow_delete)。

当磁盘使用率超过 flood_stage 时,集群会强制停止写入以避免节点崩溃。

分步处理

1. 检查磁盘水位状态

使用以下命令查看集群健康状态和磁盘使用情况:

Elasticsearch 磁盘使用率超过 85% 导致只读怎么解锁?
GET _cluster/health?v
GET _cat/nodes?v&h=name,disk.used_percent

2. 释放磁盘空间(推荐)

方案 A:清理旧索引。确认无用数据后删除,将使用率降至 95% 以下:

DELETE /log-2023.01.01

方案 B:清理快照。如果使用快照仓库,清理旧快照释放空间:

DELETE /_snapshot/my_backup/snapshot_1

方案 C(临时风险):调整水位线配置。若无法立即清理,可临时调高阈值,但需尽快扩容,否则可能导致节点 OOM 崩溃:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.flood_stage": "97%"
  }
}

3. 解除只读锁

空间充足或配置调整后,执行“命令速用版”中的 API 清除只读标记。

怎么验证是否生效

执行以下命令查看索引状态,确认 blocks 列是否为空或不含 read_only:

Elasticsearch 磁盘使用率超过 85% 导致只读怎么解锁?
GET _cat/indices?v

尝试写入一条测试数据,确认不再报错 403 Forbidden。

常见坑

1. 只解锁不清理:如果磁盘空间未释放,解锁后很快会再次触发保护进入只读模式。

2. 主节点问题:如果主节点磁盘已满,可能导致集群状态无法更新,需优先保障主节点空间。

3. 配置未持久化:使用 transient 调整配置重启后会失效,生产环境建议结合扩容计划修改 persistent 配置。

4. 版本差异:7.x 及以上版本默认启用磁盘水位线,早期版本可能需手动开启。

参考来源

1. Elastic 官方文档 - Disk Allocation Decider
URL: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html#disk-allocation