ElasticSearch出现blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]的错误

zmisgod 发布于 2019-3-28 12:41:10 阅读 25 评论 0

今天开始做es的新需求,需要把数据库的数据同步到es中,但是原本简单的同步发现了大问题,同步程序突然报出了错误,提示是

blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]

然后我在网上搜了下,都是需要执行一个curl就可以了

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

我试了一下,是可以的,于是我先执行了这个curl,然后继续批量插入操作,最后es只插入了1条数据,然后继续报上面的错误!

于是我又搜了一下,找到了问题,出现这个问题是因为ES新节点的数据目录data存储空间不足,导致从master主节点接收同步数据的时候失败,此时ES集群为了保护数据,会自动把索引分片index置为只读read-only

我跑去问了下之前用过es的同事,他也遇到了这个问题,也是说把这个read_only_allow_delete操作设置成null就可以了。

于是我把我批量的脚本前先去curl这个设置null就可以插入成功了。php代码如下

exec("curl -XPUT -H \"Content-Type: application/json\"  http://127.0.0.1:9200/your_index/_settings -d '{\"index.blocks.read_only_allow_delete\": null}'");
exec("php artisan some function ".$v);
echo $v . " finish".PHP_EOL;

这样数据就可以轻松的插入进入了,但是这只是缓兵之计,最终解决这个问题还是需要扩展es机器的物理性能。

后续

出现上面的原因,我登录到这台es的服务器中,发现磁盘还剩5%可用,于是对此服务器的相关无用文件进行了删除,然后上面的问题就没有出现。