8.es更新文档通过版本号实现并发控制

【README】       

  • 1.本文介绍了es更新文档时的并发控制策略;
  • 2.通过版本号实现并发控制(类似于mysql中基于版本号的乐观锁);
  • 3.Es为支持并发控制,为每篇文章设置了版本号_version。初始值为1,每更新1次加1。
  • 4.文档初始数据如下:
get localhost:9200/myshare/_doc/12{"_index": "myshare","_type": "_doc","_id": "12","_version": 5,"_seq_no": 20,"_primary_term": 2,"found": true,"_source": {"addr": "sichuan chengdu12 after update by post with _update2","age": "12","email": "12@gmai.com","name": "zhang san12 after update by post with _update2"}
}

【1】通过version版本号更新文档(报错

post localhost:9200/myshare/_doc/12?version=5
{"doc":{"addr":"sichuan chengdu12 after update by version=5        , "name":"zhang san12 after update by version=5"}    
} // 结果:抛出异常 
{"error": {"root_cause": [{"type": "action_request_validation_exception","reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"}]         },"status": 400
}

【异常报文解说】

  • "reason": "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;" (内部版本号不能用于并发控制,请使用 _seq_no 和 primary_term)

【2】通过 seq_no 和 primary_term作为版本号更新文档 (成功

post localhost:9200/myshare/_doc/12?if_seq_no=20&if_primary_term=2
{"doc":{"addr":"sichuan chengdu12 after update by if_seq_no=20&if_primary_term=2"        , "name":"zhang san12 after update by if_seq_no=20&if_primary_term=2"}    
}
// 响应报文 
{"_index": "myshare","_type": "_doc","_id": "12","_version": 6,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 22,"_primary_term": 2
}

【解说】

  • 显然,更新成功了;
  • 版本号 _version=6, _seq_no =22 加1, _primary_term 没变 ;

【3】通过外部版本号更新文档

【3.1】根据 version=6&version_type=external 外部版本号更新文档(报错

post localhost:9200/myshare/_doc/12?version=6&version_type=external
{"doc":{"addr":"sichuan chengdu12 after update by version_type=external"        , "name":"zhang san12 after update by version_type=external"}    
}// 响应报文
{"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[12]: version conflict, current version [6] is higher or equal to the one provided [6]","index_uuid": "FpuW3cmhR9Ws3M5JRzRgZA","shard": "0","index": "myshare"}],…},"status": 409
} 

【解说】报错原因:

  • "reason": "[12]: version conflict, current version [6] is higher or equal to the one provided [6]",
  • 版本号冲突,当前版本号6大于等于给定的版本号6。
  • 即文档当前版本号应该小于 给定版本号。
  • 小结:在使用外部版本做文档更新并发控制时,传入的版本号需要大于文档本身版本号
  • 【3.2】使用外部版本号且版本号大于文档本身版本号更新文档(成功

  • post localhost:9200/myshare/_doc/12?version=7&version_type=external
    {"doc":{"addr":"sichuan chengdu12 after update by version_type=external"        , "name":"zhang san12 after update by version_type=external"}    
    }// 响应报文 
    {"_index": "myshare","_type": "_doc","_id": "12","_version": 7,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 23,"_primary_term": 2
    }

    【4】 补充

  • 【4.1】primary term (主项)

  • es集群每次故障转移期间不同的分片成为主分片时,primary term 都会增加
  • 这有助于解决重新联机的旧主节点上发生的更改与新主节点上发生的更改。

refer2 What is seq_no and primary_term in elasticsearch? - DevOpsSchool.com

每次故障转移期间不同的分片成为主分片时,主项都会增加。这有助于解决重新联机的旧主节点上发生的更改与新主节点上发生的更改(新的胜利)。
复制组的主要术语只是主分片更改次数的计数器。
这些主要术语是增量的,并且在提升主要术语时会发生变化。它们保持在集群状态中,因此代表了集群所在的一种“版本”或“一代”的主节点。
为了确保文档的旧版本不会覆盖新版本,对文档执行的每个操作都由协调该更改的主分片分配一个序列号。
假设您的索引由 5 个主分片组成(这是版本 7 之前的默认值)。索引和更新请求是针对主分片执行的。如果您有多个主分片,elasticsearch 能够将传入请求(例如巨大的批量请求)并行化/分发到多个分片以提高性能。
因此,primary_term 提供了有关执行/协调更改/更新的主分片(在此示例中为#1、#2、#3、#4 或#5)的信息。


  • 【4.2】_version 与 _seq_no 的区别

  • 1)_version :是一个序号,用于统计文档被更新(或创建)的次数;
    • 2)_seq_no:是一个序号,用于统计索引被操作的次数;
    • 【例子】 _version 与 _seq_no 区分

    • 1)索引文档20221106
    • put localhost:9200/myshare/_doc/20221106
      {"addr":"sichuan chengdu-20221106", "age":"20221106", "email":"20221106@gmai.com", "name":"zhang san-20221106"
      }// 响应报文 
      {"_index": "myshare","_type": "_doc","_id": "20221106","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 25,"_primary_term": 3
      }

      【解析】

    1. _version 等于1;

    2. _seq_no 等于 25;

  • 2)索引文档 20221107

  • put localhost:9200/myshare/_doc/20221107
    {"addr":"sichuan chengdu-20221107", "age":"20221107", "email":"20221107@gmai.com", "name":"zhang san-20221107"
    }// 响应报文 
    {"_index": "myshare","_type": "_doc","_id": "20221107","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 26,"_primary_term": 3
    }

    【解析】

    1. _version 等于1;

    2. _seq_no 等于 26;

  • 我想应该可以理解 seq_no 与 version的区别了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷,难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统,微软也不得不考虑如何加以应对,毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理?Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE,ΔBCF,ΔCDG,ΔDAH。则:EGFH,EG⊥FH。关于上述定理的几点说明:(1),条件是任意四边形,所…

java迭代实现二叉树先中后序遍历(非递归)

【README】 本文复习了通过java迭代实现 二叉树先序,中序,后序遍历; 本文引入了 栈,替换了递归,对二叉树进行遍历; 补充:使用递归遍历二叉树缺点: 众所周知,每次递归…

漫画:什么是分布式锁

转载自 漫画:什么是分布式锁分布式锁的实现有哪些?1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题,大概是说中国比国外好的有哪些方面,网友们例举了一大堆,其中有一条是说“在中国找工作比较容易”。 是的,特别对于我们IT从业者来说,找工作真的是小菜一碟;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展,对我们服务的支持又有了新的要求,比如在对接第三方服务时,需要自定义数据结构等。为此,经过 32 次的需求讨论会以及工程师们的紧张开发后,知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1) 本文总结于 数据结构与算法分析个人的学习心得体会,源代码均为原创; 0.2) 本文列出了数据结构中基本上所有的数据结构排序算法, 整理了相关的博文(源代码); 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则(FailedRequest Tracing Rules)是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则,并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中,因为日期的特殊性,大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些?如何运用?可以实现什么样的功能?今天小编就为大家整理出来并详细介绍一下常用的日期函…

软件开发的微信公众号分享

一、已阅 (1)程序员面试(mvpjob)(2)程序员小灰(chengxuyuanxiaohui)(3)Hollis(hollischuang)(4)Java技术栈&am…

算法递归简论

【0】README 0.1) 本文总结于 数据结构与算法分析,旨在了解设计 递归程序 的相关法则和技巧; 0.2) 我记忆尤新的一点是: 凡事可以用循环代替的递归函数,它就不是一个好的递归函数,对我帮助很大…

python三维矩阵可视化_科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)...

Mlab了解Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。过程为:.建立数据源.使用Filter(可选)对数据进行加工.添加可视化模块,我们可以通过修改可视化模块的属…

程序员求职面试三部曲之二:提高面试的成功率

一、选择有招聘诚意的企业 一则好的招聘信息应该是准确、清晰和真实的。任何夸大宣传、提供虚假信息的企业都可以认为缺乏招聘诚意。 我们通过解读企业的招聘信息,主观上能够判断这家企业是否很有招聘诚意,我觉得主要体现为以下两个方面: 1.、…

秒杀系统设计的 5 个要点:前端三板斧+后端两条路

转载自 秒杀系统设计的 5 个要点:前端三板斧+后端两条路高并发,cache,锁机制基于缓存架构redis,Memcached的先进先出队列。稍微大一点的秒杀,肯定是分布式的集群的,并发来自于多个节点的JVM,syn…

http响应消息的响应状态码和意义

200:表示一切正常;400:无效请求,指出客户机请求中有不正确的语法格式;404:找不到, 服务器上不存在客户机所请求的资源;(常见状态码)405:不允许此请…

python网络模块_Python的pyroute2网络模块-阿里云开发者社区

Pyroute2是纯python的netlink库,只需要python标准库不需要其他第三方的库。最常用的是监控事件,例如监控磁盘空间事件:from pyroute2 import DQuotSocketwith DQuotSocket() as ds:for messagein ds.get():print(message)或者监控IP路由from …

ASP.NET Core 开发-中间件(Middleware)

ASP.NET Core开发,开发并使用中间件(Middleware)。 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件。 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组分在管道中调用之后执行特定操作。 具体如图: 开发中间…

高性能、高可用平台架构的演变过程

转载自 高性能、高可用平台架构的演变过程开篇概述 在如今移动互联网、互联网、大数据的时代,各类的互联网网站、平台异常突起,如同雨后春笋,有种“忽如一夜春风来,千树万树梨花开”感觉。 对于移动互联网时代的平台来说&#xff…

6 使用soap客户端_网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议

上一节我们了解 RPC 的经典模型和设计要点,并用最早期的 ONC RPC 为例子,详述了具体的实现。而时代在进步,ONC RPC 逐渐因为各种问题被替代,SOAP 协议就是替代者之一。ONC RPC 存在的问题ONC RPC 将客户端要发送的参数&#xff0c…