es-问题处理-read-only/allow delete

当Elasticsearch出现read-only/allow delete错误时,可能是由于内存不足或磁盘空间紧张导致。内存不足时,ES会触发保护机制禁止写入;磁盘使用率超过85%则停止分配分片。临时解决方案包括删除旧数据,彻底解决方法涉及磁盘扩容、调整索引副本数量或增加数据节点。

一、现象:

1.read-only/allow delete

2.ES只能读,不能增、删

3.取出的数据排序混乱

 

二、排错与验证

检查服务器状况:内存、磁盘使用情况,磁盘使用率为95%

df -vh   #查看挂载磁盘空间
free -g  #内存

 

三、界定问题

1.内存不足

JVMMemoryPressure 超过92%并持续30分钟时,ES触发保护机制,并且阻止写入操作,以防止集群达到红色状态,启用写保护后,写入操作将失败,并且抛出 ClusterBlockException ,无法创建新索引,并且抛出 IndexCreateBlockException ,当五分钟内恢复不到88%以下时,将禁用写保护。

2.磁盘空间不足

es的默认磁盘水位警戒线是85%,一旦磁盘使用率超过85%,es不会再为该节点分配分片,es还有一个磁盘水位警戒线是90%,超过后,将尝试将分片重定位到其他节点。

 

四、处理方式:

1.临时应对方案:

删除三个月前的交易日志,可以采用curl或者postMan,以下是curl的示例

步骤:

  • es磁盘已满而无法索引更多文档,则elasticsearch将切换为只读。它确保了只读查询的可用性。Elasticsearch不会自动切换回来,可以使用如下方法切换回正常模式。

curl -XPUT -H "Content-Type: application/json" http://esIP:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

验证:查看指定索引的设置信息

curl -XPUT -H "Content-Type: application/json" http://esIp:9200/索引名称/_settings -d
'{"index": {"blocks": { "read_only_allow_delete": "false"}}}'

验证结果

{"acknowledged":true}
  • 根据时间进行数据删除

curl -X POST "http://esIP:9200/索引名称/_delete_by_query?pretty" -H 'Content-Type: application/json' -d 
'{"query":{ "range": {
      "你要使用删除的时间字段": {  
          "lt": "now-90d",   #保留的数据的时间
          "format": "epoch_millis" #默认就好,可以自定义
      }
  }
}}'
  • 返回数据格式,告诉你用时和删除多少数据等

{
    "took" : 147,
    "timed_out": false,
    "deleted": 119,
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
      "bulk": 0,
      "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "total": 119,
    "failures" : [ ]
}

2.彻底解决方案

磁盘扩容

3.其他:

删除无用索引

将旧索引的副本数调小

  • 修改索引副本数量为1,配置生效后集群开始删除index副本数据,datanode 节点磁盘空间逐步释放。

curl -XPUT -H "Content-Type: application/json" http://esIp:9200/索引名称/_settings -d '{"index": {"number_of_replicas": "1"}}'

增加数据节点

检查定时任务是否按时删除数据

 

 

 

<think>嗯,用户遇到了Elasticsearch的FORBIDDEN/12/index read-only/allow delete错误,需要解决。首先,我得回忆一下这个错误的原因。通常,这个错误是因为Elasticsearch的索引进入了只读模式,可能是因为磁盘空间不足导致的。Elasticsearch默认会在磁盘使用超过95%时把索引设为只读,防止进一步写入导致磁盘爆满。所以,第一步应该检查磁盘空间,看看是不是这个问题。 如果磁盘确实快满了,用户需要清理空间,比如删除不必要的索引、日志文件,或者扩容磁盘。清理之后,可能还需要手动解除只读状态,因为即使空间释放了,Elasticsearch不会自动恢复可写状态。这时候需要用curl命令发送PUT请求,把index.blocks.read_only_allow_delete设为null,或者false,具体要看ES的版本。根据引用中的例子,用户可能需要执行类似curl -XPUT的命令,调整设置。 另外,可能还要调整集群的设置,比如设置磁盘水位线,避免再次触发只读模式。比如,把cluster.routing.allocation.disk.watermark.low和high调低,比如到85%和90%,这样提前预警,避免达到95%。不过修改集群设置需要权限,用户可能需要有相应的权限才能操作。 然后,还要考虑是否有其他原因导致索引进入只读模式,比如文件系统权限问题,或者索引损坏。但最常见的是磁盘空间问题。所以步骤应该是先检查磁盘,清理空间,然后解除只读,最后调整配置防止再次发生。 用户提供的引用里提到了使用curl命令来修改索引设置,其中引用2和3给出了具体的命令示例。需要确认用户使用的Elasticsearch版本,因为不同版本的命令可能略有不同,但大多数情况下,设置index.blocks.read_only_allow_delete为null应该有效。另外,如果_all或者index_*无法使用,可能需要指定具体的索引名称。 总结解决步骤:检查磁盘空间,清理空间,解除只读状态,调整水位线设置。同时,确保操作命令正确,比如正确的端点、JSON格式等。可能还要提醒用户定期监控磁盘使用情况,避免问题再次发生。</think>### Elasticsearch索引只读错误解决方法 #### 原因分析 Elasticsearch索引进入只读模式的主要原因是**磁盘空间使用超过95%的默认阈值**,系统为防止数据丢失自动触发保护机制。此时索引只能执行读取和删除操作,无法写入或修改数据[^1][^2][^3]。 $$ \text{索引状态} = \begin{cases} \text{可读写} & \text{当磁盘空间} < 95\% \\ \text{只读模式} & \text{当磁盘空间} \geq 95\% \end{cases} $$ #### 解决步骤 1. **检查磁盘空间** ```bash df -h /path/to/elasticsearch/data ``` 若使用率≥95%,需清理旧索引或扩容存储 2. **临时解除只读模式** ```bash curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{ "index.blocks.read_only_allow_delete": null }' ``` 该命令对所有索引生效[^2] 3. **永久解决方案** ```bash # 修改磁盘水位阈值(需重启) curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "persistent": { "cluster.routing.allocation.disk.watermark.low": "85%", "cluster.routing.allocation.disk.watermark.high": "90%", "cluster.routing.allocation.disk.watermark.flood_stage": "95%" } }' ``` 4. **验证状态** ```bash curl -XGET http://localhost:9200/_settings?include_defaults=true ``` #### 操作示例 ```bash # 清理10GB旧日志 rm -rf /var/log/elasticsearch/old_indices/* # 解除特定索引只读状态 curl -XPUT -H "Content-Type: application/json" \ http://localhost:9200/my_index/_settings -d '{ "index.blocks.read_only_allow_delete": null }' ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值