欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:975
  2. 浏览总数:11,897,616
  3. 评论:3925
  4. 分类目录:105 个
  5. 注册用户数:6079
  6. 最后更新:2018年12月9日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

在ElasticSearch中使用外部系统的版本

  有一种非常常见的场景那就是使用其他数据库作为主要的数据存储,而Elasticsearch用来检索数据。这也意味着主数据库发生的一切变更都需要将其拷贝到Elasticsearch中。如果这时候有多个进程负责数据的同步,就会遇到《Elasticsearch乐观锁并发控制(optimistic concurrency control)》文章中提到的并发问题。

  如果你的主数据库已经有了版本号码(Version numbers),或者诸如timestamp字段可以用于作为版本号码,这时候你可以在Elasticsearch中通过增加version_type=external来重新利用这些版本号码。版本号码必须是大于0并且小于9.2e+18的整数。

  Elasticsearch处理外部的版本号码和处理内部版本号码的方式是不一样的。它不检测当前_version是否和请求参数中的版本一致;而是检测当前_version是否小于指定的版本。如果请求成功,那么外部的版本号就会被存储到文档中的_version中。

  外部版本号不仅可以在索引(index)和删除(delete)请求时使用,还可以在创建新文档时使用。

比如,我们现在创建一个版本号为5的博客文章,我们可以如下操作:

PUT /website/blog/2?version=5&version_type=external
{
  "title": "My first external blog entry",
  "text":  "Starting to get the hang of this..."
}

在响应消息中我们可以看到当前_version号码是5:

{
  "_index":   "website",
  "_type":    "blog",
  "_id":      "2",
  "_version": 5,
  "created":  true
}

现在我们更新这个文档,并指定新版本号为10

PUT /website/blog/2?version=10&version_type=external
{
  "title": "My first external blog entry",
  "text":  "This is a piece of cake..."
}

上面的请求被成功执行,并且当前的_version为10

{
  "_index":   "website",
  "_type":    "blog",
  "_id":      "2",
  "_version": 10,
  "created":  false
}

当时如果你重新运行上面的请求,你会遇到之前一样的版本冲突的错误,因为你所指定的外部版本号并没有大于当前Elasticsearch中的版本号。

本文翻译自:https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【在ElasticSearch中使用外部系统的版本】(https://www.iteblog.com/archives/1744.html)
喜欢 (0)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!