Elasticsearch干货(一):Elasticsearch锁机制(并发控制)

Elasticsearch和数据库一样,在多线程并发访问修改的情况下,会有一个锁机制来控制每次修改的均为最新的文档。大体上主要有乐观锁和悲观锁两类。

乐观锁

在Elasticsearch通过_version来记录文档的版本,在文档创建时会有一个初始version,默认为1。在对文档进行修改和删除时,version会递增,也可以由用户指定。只有当版本号大于当前版本时,才会修改删除成功,否则失败。当并发请求时,先修改成功的,version会增加,这个时候其他请求就会犹豫version不匹配从而修改失败。

由于segment时不能被修改的,所以当对一个文档执行DELETE之后,在插入相同id的文档,version版本不会是0,而是在DELETE操作的version上递增。

外部版本号和内部版本号区别
对于内在_version=1,只有在后续请求满足?_version=1的时候才能够更新成功;对于外部_version=1,只有在后续请求满足?_version>1才能够修改成功。

es提供了一个外部版本号的乐观控制方案来替代内部的_version。
?version=1&version_type=external

悲观锁

悲观锁类似于数据库中的锁。当线程1在修改或删除doc时,会对数据上锁,这个时候其它线程不能对数据进行操作的。这种方式保证了只有一个线程在同时操作数据。这种方式的缺点是对系统性能有影响,会降低整个系统并发能力,因为其他线程要等待。

悲观锁主要有以下几种方式:

全局锁

对整个index上锁,类似数据库的表锁。

当对文档进行操作时,会对整个index。
上锁

##上锁
PUT /fs/lock/global/_create
{}
##释放锁
DELETE /fs/lock/global

文档锁

在文档级别上锁,类似数据库的行锁。

create上锁

PUT /fs/lock/_bulk
{ "create": { "_id": 1}} 
{ "process_id": 123    } 
{ "create": { "_id": 2}}
{ "process_id": 123    }

update上锁,需要用脚本。

POST /fs/lock/1/_update
{
  "upsert": { "process_id": 123 },
  "script": "if ( ctx._source.process_id != process_id )
  { assert false }; ctx.op = 'noop';"
  "params": {
    "process_id": 123
  }
}

如果update文档不存在,则走上面的create。如果文档存在,脚本会查看文档中的process_id是否和要修改的process_id匹配,如果匹配不会执行update,但是会返回为成功。如果不匹配即上锁失败。

树锁

参考https://www.elastic.co/guide/cn/elasticsearch/guide/current/concurrency-solutions.html


更多文章关注公众号
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210325093921176.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW95dV9CRA==,size_16,color_FFFFFF,t_70
更多:Elasticsearch深入理解专栏
——————————————————————————————————
作者:桃花惜春风
转载请标明出处,原文地址:
https://blog.csdn.net/xiaoyu_BD/article/details/81941631
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作最大的动力,谢谢!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,"org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception Data too large"错误是由于数据大小超过了Elasticsearch的限制引起的[^1]。具体来说,错误信息中提到了"circuit_breaking_exception",这是Elasticsearch中的一种机制,用于防止节点过载。当数据大小超过了限制时,Elasticsearch会触发断路器并抛出此异常。 为了解决这个问题,可以尝试以下方法: 1. 增加Elasticsearch的限制:可以通过修改Elasticsearch的配置文件来增加限制。具体来说,可以增加`indices.breaker.total.limit`和`indices.breaker.request.limit`的值,以适应更大的数据量。但是需要注意,增加限制可能会导致节点负载过高,因此需要根据实际情况进行调整。 2. 减少数据量:如果数据量超过了Elasticsearch的限制,可以考虑减少数据量。可以通过以下方法来减少数据量: - 分批处理数据:将大数据集分成多个较小的批次进行处理,以避免超过限制。 - 压缩数据:使用压缩算法对数据进行压缩,以减少数据的大小。 - 删除不必要的字段:如果数据中包含不必要的字段,可以考虑删除这些字段以减少数据量。 3. 增加Elasticsearch集群的规模:如果以上方法无法解决问题,可以考虑增加Elasticsearch集群的规模,以提供更多的资源来处理大数据量。 请注意,具体的解决方法可能因为你的具体情况而有所不同。建议根据实际情况选择适合的方法来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值