文档章节

Elasticsearch学习总结七 ElasticSearch中的版本控制

winstone
 winstone
发布于 2017/06/08 18:40
字数 1006
阅读 928
收藏 26
  • 版本控制:

    在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据。

    ES使用的是乐观并发控制(又名”乐观锁”,Optimistic Concurrency Control,缩写”OCC)。 ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。

  • ES中的乐观锁

当我们发送get请求的时候 post /exindex/exindex/AVyAgBvA9tISzc84d_4i/返回值为:

 {
   "_index": "exindex",
    "_type": "exindex",
    "_id": "AVyAgBvA9tISzc84d_4i",
    "_version": 1,
    "found": true,
    "_source": {
    "school": "支付宝在扣款事务提交之前,向实时消息服务请求发送消息",
    "name": "sony",
    "age": "14"
  }
}
  •  这里_version是1,我们从ES中查询到一条记录,修改完成以后重新PUT建立索引,这时候我们要把_version作为一个参数传递过去,ES会用该参数和实际的数据进行比对,如果相同则进行重建索引,如果不同则返回错误信息。
    

    请求url 带上本次版本号,并且指定docId,请求如下:

curl -XPUT http://121.49.129.155:9200/exindex/exindex/AVyAgBvA9tISzc84d_4i?version=1 -d'
{
  "name": "Jane",
  "age": 80,
  "school": "清华大学"
}'

文档修改结束后,返回成功后再次查询后得到的版本号已经变更完毕,_version已经变更为2

{
  "_index": "exindex",
  "_type": "exindex",
  "_id": "AVyAgBvA9tISzc84d_4i",
  "_version": 2,
  "found": true,
  "_source": {
    "name": "Jane",
    "age": 80,
    "school": "清华大学"
  }
}

当我们再次传递版本号为_version=1去尝试更新文档的时候,会报出版本冲突错误 "error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[exindex][AVyAgBvA9tISzc84d_4i]: version conflict, current [2] ,当我们将版本号变更_version=2作为参数传递后,再次修改文档更新成功,版本号自动增加。

{
  "_index": "exindex",
  "_type": "exindex",
  "_id": "AVyAgBvA9tISzc84d_4i",
  "_version": 3,
  "found": true,
  "_source": {
    "name": "Jane",
    "age": 80,
    "school": "北京大学"
  }
}

  • 使用外部版本号控制系统

    一种比较常见的架构应用就是使用一些其他的数据库作为主应用数据库,es只是作为一个检索引擎使用,这也就不可避免的考虑到数据的一致性,数据的版本问题也就出现了。

    如果你的数据库已经存在了版本号,或者是可以代表版本timestamp的时间戳。这时就可以在es的查询url后面添加version_type=external来使用这些号码。 注意:版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。

    外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查_version是否与请求中指定的一致,而是检查是否小于指定的版本。如果请求成功,外部版本号就会被存储到_version中。

    例如,创建一个包含外部版本号为5的新的文档,我们可以这样做: curl -XPOST '/testindex/fulltext/1?version=5&version_type=external' -d'{"title":"external log","content":"hello es"}'

查询返回的结果为:

{
  "_index": "testindex",
  "_type": "fulltext",
  "_id": "1",
  "_version": 5,
  "found": true,
  "_source": {
    "title": "external log",
    "content": "hello es"
  }
}

现在我们更新文档将文档的版本号指定为8:

{
  "_index": "testindex",
  "_type": "fulltext",
  "_id": "1",
  "_version": 8,
  "found": true,
  "_source": {
    "title": "external log second operate",
    "content": "hello es"
  }
}

版本号已经变更为"_version": 8,重新执行请求,返回的异常同样为版本冲突错误。

总结:在实际开发中根据不同的业务场景使用不同的版本控制,这个还是需要业务场景具体选择。

© 著作权归作者所有

winstone
粉丝 38
博文 14
码字总数 17575
作品 0
南京
程序员
私信 提问
如何在 Linux 上安装 Elasticsearch 和 Kibana

获取我们关于安装两者的简化说明。 如果你渴望学习基于开源 Lucene 库的著名开源搜索引擎 Elasticsearch,那么没有比在本地安装它更好的方法了。这个过程在 Elasticsearch 网站中有详细介绍,...

作者: Seth Kenlon
08/13
0
0
如何在 MacOS 上安装 Kibana

Elasticsearch 安装好了之后,Kibana 插件可以为这个功能强大的搜索工具添加可视化功能。 在我之前的文章中,我向 Mac 用户介绍了安装 Elasticsearch 的步骤,这是世界上最受欢迎的企业级搜索...

作者: Lauren Maffeo
07/22
0
0
Elastic 在年度用户大会 Elastic{ON} 2018 上发布众多新功能和技术预览

下载超过 2.25 亿次,Elastic 公开 X-Pack 源代码 旧金山 (Elastic{ON} 2018) – 2018 年 2 月 27 日 – Elastic,Elasticsearch 和 Elastic Stack背后的公司,今天宣布其产品累计下载次数达...

Medcl
2018/03/01
7
0
Elastic Search 上市了,市值翻倍,这群人财务自由了!

国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分人可...

Java技术栈
2018/10/07
0
0
AWS 为 Elasticsearch 推出开源发行版

AWS 近日宣布为 Elasticsearch 推出开源发行版 Open Distro for Elasticsearch。 Elasticsearch 是一个分布式、面向文档的搜索和分析引擎,它支持结构化和非结构化查询,并且不需要提前定义模...

linux-tao
03/27
41
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
今天
4
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部