You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Elasticsearch使用NEST索引时read_only_allow_delete自动设为true的问题

解决Elasticsearch索引后自动触发read_only_allow_delete的问题

我之前也碰到过一模一样的情况!当你用NEST(或者任何Elasticsearch客户端)执行单文档或批量索引操作后,read_only_allow_delete被自动设为true,手动改回false后又反复触发,核心原因确实是磁盘空间不足触发了Elasticsearch的内置保护机制

为什么会出现这个问题?

Elasticsearch有一套磁盘水位线保护策略,用来防止磁盘被完全占满导致集群崩溃:

  • 当磁盘使用率达到85%(默认阈值)时,集群会自动将所有索引的read_only_allow_delete设为true,进入只读模式
  • 只要磁盘使用率还在阈值之上,即使你手动修改这个设置,Elasticsearch会持续检测并再次把它改回true,这就是为什么你改完又会变回只读的原因

具体解决步骤

  1. 优先清理磁盘空间
    • 删除服务器上不必要的文件、日志,或者直接扩容磁盘
    • 也可以删除Elasticsearch中不需要的旧索引释放空间,执行命令:
      DELETE /old_unused_index
      
  2. 手动解除只读限制
    等磁盘使用率降到阈值以下后,执行以下命令重置只读设置:
    PUT /_all/_settings
    {
      "index.blocks.read_only_allow_delete": null
    }
    
    如果你想用NEST的C#代码执行,也可以这么写:
    var response = await client.Indices.PutSettingsAsync(s => s
        .Index("*")
        .Settings(settings => settings
            .BlockReadOnlyAllowDelete(null)
        )
    );
    
  3. (可选)调整磁盘水位线阈值
    如果你确实需要更高的磁盘使用率,可以修改Elasticsearch配置文件(elasticsearch.yml)中的以下参数:
    • cluster.routing.allocation.disk.watermark.low:默认80%,达到后停止分片分配
    • cluster.routing.allocation.disk.watermark.high:默认85%,达到后触发只读
    • cluster.routing.allocation.disk.watermark.flood_stage:默认95%,达到后强制所有索引只读
      修改后需要重启Elasticsearch生效,不过不建议随意调低阈值,这是集群的重要防护机制。

验证解决效果

执行完上述步骤后,你可以用以下命令检查磁盘状态和索引设置,确认问题已解决:

# 查看磁盘使用率
GET /_cat/disk?v
# 检查索引只读设置
GET /_all/_settings?include=index.blocks.read_only_allow_delete

内容的提问来源于stack exchange,提问作者Reza

火山引擎 最新活动