Elasticsearch系统学习(七)-ES并发控制

一、ES并发控制原理

1.1、ES并发冲突问题

1.2、悲观锁与乐观锁并发控制图解

ES内部基于_version进行乐观锁并发控制:

二、并发控制实践

2.1、基于_version进行乐观锁并发控制

1)构建数据

PUT /test_index/test_type/7
{
  "test_field": "test test"
}

{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "7",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

2)模拟两个客户端,都获取了同一条数据

GET /test_index/test_type/7

{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "7",
  "_version": 1,   #此时版本号是1
  "found": true,
  "_source": {
    "test_field": "test test"
  }
}

3)模拟一个客户端,先更新了这个数据

同时带上数据的版本号,确保说,es中的数据的版本号,跟客户端中的数据的版本号是相同的,才能修改

PUT /test_index/test_type/7?version=1
{
  "test_field": "test client 1"
}

{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "7",
  "_version": 2,   #此时实际版本号已经变成2了
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}

4)另外一个客户端,尝试基于version=1的数据去进行修改,同样带上version版本号,进行乐观锁的并发控制

PUT /test_index/test_type/7?version=1
{
  "test_field": "test client 2"
}

{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[test_type][7]: version conflict, current version [2] is different than the one provided [1]",   #版本冲突
        "index_uuid": "6t1NqhChSpyuYY7m-Eq2jA",
        "shard": "3",
        "index": "test_index"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[test_type][7]: version conflict, current version [2] is different than the one provided [1]",
    "index_uuid": "6t1NqhChSpyuYY7m-Eq2jA",
    "shard": "3",
    "index": "test_index"
  },
  "status": 409
}

5)在乐观锁成功阻止并发问题之后,尝试正确的完成更新

首先获取正确的版本号

GET /test_index/test_type/7

{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "7",
  "_version": 2,
  "found": true,
  "_source": {
    "test_field": "test client 1"
  }
}

基于最新的数据和版本号,去进行修改,带上最新的版本号,可能这个步骤会需要反复执行好几次,才能成功,特别是在多线程并发更新同一条数据很频繁的情况下

PUT /test_index/test_type/7?version=2
{
  "test_field": "test client 2"
}

{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "7",
  "_version": 3,   #修改成功,版本号再次更改
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}

原文地址:https://www.cnblogs.com/hujinzhong/p/11447335.html

时间: 2024-08-30 01:50:24

Elasticsearch系统学习(七)-ES并发控制的相关文章

Elasticsearch系统学习(一)-elasticsearch简单介绍和核心概念

一.ES简单介绍 1.1.es功能 (1)分布式的搜索引擎和数据分析引擎 搜索:百度,网站的站内搜索,IT系统的检索 数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些:新闻网站,最近1个月访问量排名前3的新闻版块是哪些 分布式,搜索,数据分析 (2)全文检索,结构化检索,数据分析 全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%" 结构化检索:我想搜索商品分类为日化用品的

Elasticsearch系统学习(三)-基本操作

一.document数据格式 (1)应用系统的数据结构都是面向对象的,复杂的 (2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦 (3)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能 (4)es的document用json数据格式来表达 { "email": "[email protected]", "firs

Elasticsearch系统学习(八)-partial update

一.partial update介绍 1.1.什么是partial update? 1)PUT /index/type/id 创建文档&替换文档,是一样的语法.一般对应到应用程序中,每次的执行流程基本是这样的: (1)应用程序先发起一个get请求,获取到document,展示到前台界面,供用户查看和修改 (2)用户在前台界面修改数据,发送到后台 (3)后台代码,会将用户修改的数据在内存中进行执行,然后封装好修改后的全量数据 (4)然后发送PUT请求,到es中,进行全量替换 (5)es将老的doc

Elasticsearch系统学习(十一)-mapping

一.知识铺垫 1.1.搜索结果各项含义 GET /_search { "took": 6, #整个搜索请求花费了多少毫秒 "timed_out": false, #是否超时,可以手动指定超时时间 "_shards": { #默认一个搜索请求,会打到index的所有primary shard上去,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard

【好文】ElasticSearch 5学习——安装Elasticsearch、Kibana和X-Pack

安装准备: 安装Elasticsearch唯一的要求是安装官方新版的Java,包括对应的Jdk. 安装Elasticsearch 首先到官网下载最新版本的Elasticsearch压缩包. 可以使用命令,注意将最新的可用的下载链接填入: curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.0.2.zip unzip elasticsearch-5.0.2.zip cd elasticsea

Elasticsearch的学习笔记

在介绍Elasticsearch的用法之前先讲讲为什么要用它吧.首先学习搜索引擎,肯定不可避免的都听过lucene,solr和Elasticsearch都是基于它的.spinx文章很多,但是数据库的入侵性太强(插件模式).Elasticsearch是当下最流行的分布式搜索引擎之一.solr也稍微玩过,文章也多.同时也希望能通过Elasticsearch进一步学习完善自己对于分布式的学习.更深入的同学可以考虑开始学习ELK(Elasticsearch, Logstash, Kibana). 推荐:

AIX系统学习之--卸载软件错误

AIX系统学习之--卸载软件错误 系统环境: 操作系统:AIX 5.3.8 Oracle:  Oracle 10gR2 案例分析: HACMP安装失败,卸载hacmp出现以下错误: [[email protected] /]#smit remove Remove Installed Software Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields]

Linux系统学习之路和常用命令及其他系统相关内容

Linux系统学习之路 目录 Linux系统学习之路[第一篇]:Linux目录和基础知识 Linux系统学习之路[第二篇]:文件操作,文件查看,find查找 Linux系统学习之路[第三篇]:grep,vim,压缩功能详解 Linux系统学习之路[第四篇]:mount,rpm,yum,yum组讲解 Linux系统学习之路[第五篇]:用户和用户组管理 Linux系统学习之路[第六篇]:权限管理 Linux系统学习之路[第七篇]:磁盘和文件管理 Linux系统学习之路[第八篇]:LVM逻辑卷和RAI

全文检索及ElasticSearch框架学习

1.   全文检索的通用步骤: 1.建库步骤: a 分词 b 倒排索引   :  关键词和记录Id的对应关系,1对多. 2.查询步骤: a 分词 b 查索引 c 取交集或并集 2.    产品使用全文检索的一种场景 如上图, 由数据库或者应用软件生成数据,通过logstash导入elasticSearch系统. Kibana提供了可视化界面或者命令模式可以查询分析系统数据. 当然,elasticSearch也提供了rest接口,可以在各种应用程序中自己调用. 当然了,elasticSearch最