ElasticSearch6.8 插入数据时 报错blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
canal-adapter报错提示:
ERROR c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - ES sync commit error ElasticsearchException[Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]]
java.lang.RuntimeException: ES sync commit error ElasticsearchException[Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]]
at com.alibaba.otter.canal.client.adapter.es6x.support.ESConnection$ES6xBulkResponse.processFailBulkResponse(ESConnection.java:480) ~[na:na]
一般导致的原因:
ES 认为磁盘存储百分比低于阈值时自动将其转为只读模式。
由于ES新节点的数据目录data存储空间不足,导致从master主节点接收同步数据的时候失败,此时ES集群为了保护数据,会自动把索引分片index置为只读read-only。
一般的临时解决方案:
1: 调用api查看es 节点状态是否是可读的状态
get http://localhost:9200/索引名称/_settings?pretty
{
"xzb_goods": {
"settings": {
"index": {
"number_of_shards": "1",
"blocks": {
"read_only_allow_delete": "true"
},
"provided_name": "xzb_goods",
"creation_date": "1611971241260",
"number_of_replicas": "0",
"uuid": "po0pKmdSSaSoIodNseKk_Q",
"version": {
"created": "6080099"
}
}
}
}
}
其中 read_only_allow_delete = true就是es当前节点值允许读操作;由此导致了无法再向其中插入文档。
2:清理磁盘,使占用低于95%,需要手动把被锁的索引的只读模式关闭。
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,到此就可以正常同步数据到es服务;
3:生产环境中es的索引数据最好单独存放,不要放于系统盘中。
可以通过elasticsearch.yml配置来修改索引存放磁盘位置;
path.data 属性配置路径;
4:调整自动锁阀值,定时做检测。(官方文档有详细的介绍)
官方地址(https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html)
将低水位标记更新为至少100 GB可用空间,将高水位标记更新为至少50 GB可用空间,将洪水级水印更新为10 GB可用空间,并每分钟更新有关群集的信息的示例
PUT _cluster / settings
{ “ transient” :{ “ cluster.routing.allocation.disk.watermark.low” :“ 100gb” ,“ cluster.routing.allocation.disk.watermark.high” :“ 50gb” ,“ cluster.routing .allocation.disk.watermark.flood_stage“ :” 10gb“ ,” cluster.info.update.interval“ :” 1m“ } }
详情自己按照需求配置