elasticsearch出现只读索引如何操作 blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];')
2021-02-20 leiting (3735阅读)
一个稳定运行的功能忽然收到报错,查明原因是在向Elasticsearch中插入文档时报错:
AuthorizationException: AuthorizationException(403, u'cluster_block_exception', u'blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];')
网上也有其他人报TransportError:
TransportError(403, u'cluster_block_exception', u'blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];')
看错误信息大意是要操作的索引是只读的,不能进行插入或删除。
可是这个索引自从创建,从来也没有修改过配置,为什么忽然报错呢?
从stackoverflow上查到,当Elasticsearch所在磁盘占用大于等于95%时,Elasticsearch会把所有相关索引自动置为只读。(Elasticsearch官方文档有介绍)
那么查看设置(以本机部署9200为例):
curl -GET 'localhost:9200/index_name/_settings?pretty'
返回信息:
{ "index_name" : { "settings" : { "index" : { "number_of_shards" : "5", "blocks" : { "read_only_allow_delete" : "true" }, "provided_name" : "index_name", "creation_date" : "1516454800021", "number_of_replicas" : "1", "uuid" : "6WjhtrARTOOjsEUaOqNzlw", "version" : { "created" : "6010199" } } } } }
发现确实这个索引的 read_only_allow_delete 属性是 true,由此导致了无法再向其中插入文档。
解决方案有两种:
1.清理磁盘,使占用低于95%。
2.调整自动锁阀值,官方文档中有详尽方法。
建议采用第一种,注意解决之后,需要手动把被锁的索引的只读模式关闭。
按照官档去关闭只读模式有坑,HTTP请求头Content-Type如果不对会报错:
curl -XPUT 'localhost:9200/index_name/_settings' -d '{"index.blocks.read_only_allow_delete": null}'
{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
所以自定一下Content-Type,返回成功:
curl -XPUT 'localhost:9200/index_name/_settings' -H 'Content-Type: application/json' -d '{"index.blocks.read_only_allow_delete": null}'
{"acknowledged":true}
再去查看配置信息:
{ "index_name" : { "settings" : { "index" : { "creation_date" : "1516454800021", "number_of_shards" : "5", "number_of_replicas" : "1", "uuid" : "6WjhtrARTOOjsEUaOqNzlw", "version" : { "created" : "6010199" }, "provided_name" : "index_name" } } } }
已经OK了。
再看项目,写入已经正常,问题解决完毕。
在生产环境中,还是要确保磁盘的使用率不能过高,尤其是系统盘,数据的存储还是尽量放到挂载的大硬盘下。
最新评论: