elasticsearch权威指南 学习3

etting start部分 第三章:Data In,Data Out(续)elasticsearch并发控制相关

http://www.elastic.co/guide/en/elasticsearch/guide/current/version-control.html

Dealing with Conflicts

首先说明一下elasticsearch所能遇到的冲突的场景,比如两个用户同时更新一份数据这种情况。一般应用处理这种问题都是使用以下两种方式:

方式1:悲观锁,简单说就是每次都假设会发生冲突,当对元数据进行改变的时候,就会将源数据那行数据锁住,等到改变完成之后,才会打开锁。

方式2:乐观锁,这种锁与悲观锁相反,它假设每次都不会发生冲突,但是如果在es写和读的之间发生冲突,那么就会将更新操作就会失败,然后将错误反馈给应用去解决或者直接将错误返回给user。


http://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html

Optimistic Concurrency Control

elasticsearch是一个分布式系统,当一个document被创建,更新,或删除时新的version会被发到其它节点的副本上,es是 一个异步并发的系统,这意味着这些发送到副本的请求会在创建索引的时候发送到其他节点上,如果不对elasticsearch进行版本控制,那么这些 document的version变动会在到达其他节点的时候发生混乱,所以elasticsearch需要一种机制来控制这种情况。

我们可以使用_version来证明在我们的elasticsearch在处理版本冲突时所使用是乐观锁机制,在此之前,首先要了解我们可以指定 _version参数来更新我们想更新的document。 所以我们可以使用如下的步骤来验证elasticsearch的乐观锁机制:

步骤1:

创建一个document:

PUT /website/blog/1/_create

{

“title”: “My first blog entry”,

“text”: “Just trying this out…”

}

此时我们的document的_version是1

步骤2:

我们通过指定一个版本的来重新提交document,

发送如下请求:

PUT /website/blog/1?version=1

{

“title”: “My first blog entry”,

“text”: “Starting to get the hang of this…”

}

我们得到的响应:

{“_index”:”website”,”_type”:”blog”,”_id”:”1″,”_version”:2,”found”:true,”_source”:{“title”: “My first blog entry”, “text”: “Starting to get the hang of this…”}}

现在的版本已经变成了2。

步骤3:

再次发送步骤2的请求 即,我们再次指定version=1来更新document,那么我们就会得到下面这条响应:

{“error”:”VersionConflictEngineException[[website][2] [blog][1]: version conflict, current [2], provided [1]]“,”status”:409}

这条响应的意思是我们所指定的version为1的这条document现在的version已经是2,所以我们指定version为1的那个id的document与现在的最新的版本发生了冲突。说白了就是我们指定的version已经不是当前最新的version

使用系统额外版本号

我们可以使用其他数据库的version字段来作为elasticsearch的version,我们使用 version_type=external参数来指定系统额外的version。使用系统额外的version来防止版本冲突的机制和之前说的那种“检 验版本号是否相同”的机制有一点点的不同,这种使用系统外部version的机制是检验最新的版本号是不是大于之前的,如果不大于就会报出和刚才一样的错 误。

请求像如下这样:

PUT /website/blog/2?version=5&version_type=external

{

“title”: “My first external blog entry”,

“text”: “Starting to get the hang of this…”

}

响应略

总结一下:

1.elasticsearch使用的版本控制是乐观锁机制

2.使用elasticsearch自己内部维护的version来防止版本冲突是验证document的version是否相同

3.使用外部系统的version防止版本冲突,是通过验证最新更新的document的version是否大于之前的version。

zhidao.baidu.com/link?url=x3mHE5RllJdDmvMulO59vUtIZrBfMV5qB2I2-lpze7IUpDY9ABNvdxA_yV82-FqgBSY9bu4-bPddqwhl7IiOQq

猜你喜欢

转载自m635674608.iteye.com/blog/2269003