写点什么

Elasticsearch partial update

用户头像
escray
关注
发布于: 2021 年 01 月 26 日
Elasticsearch partial update

partial update 似乎已经不再是 Elasticsearch 的主流,但还是记录一下。文字内容整理自 B 站中华石杉的 Elasticsearch 顶尖高手系列课程核心知识篇


partial update,看起来很方便的操作,实际内部的原理是什么样子的,然后它的优点是什么?


其实,Elasticsearch 内部对 partial update 的实际执行跟传统的全量替换方式,是几乎一样的。


  1. 内部先获取 document

  2. 将传过来的 field 更新到 document 的 JSON 中

  3. 将老的 document 标记为 deleted

  4. 将修改后的新的 document 创建出来


partial update 相较于全量替换的优点


  1. 所有的查询、修改和写回操作,都发生在 Elasticsearch 中的一个 shard 内部,避免了所有的网络数据传输的开销(减少了两次网络请求),大大提升了性能。

  2. 减少了查询和修改中的时间间隔,可以有效减少并发冲突的情况。


# 7.7PUT test_index/_doc/11{  "test_field1": "test1",  "test_field2": "test2"}
# 5.2PUT /test_index/test_type/10{ "test_field1": "test1", "test_field2": "test2"}
# 7.7POST test_index/_update/11{ "doc": { "test_field2": "partial updated test2" }}
# 5.2 POST /test_index/test_type/10/_update{ "doc": { "test_field2": "updated test2" }}
复制代码


partial update 同样会自动执行之前讲过的乐观锁的并发控制。


post /index/type/id/_update?retry_on_conflict=5&version=6
复制代码


retry 策略


  1. partial update 失败之后,再次获取 document 数据和新的版本号 version

  2. 基于新的版本号再次去更新,如果成功就结束

  3. 如果失败,重复 1 和 2 的步骤,最多可以重复 retry_on_conflict 指定的次数


后来看了一下官方文档,似乎 partial update 的说法已经不再是主流,简单记录一下。



partial update 的步骤:


  1. client 向 node 1 节点发送更新 update 请求

  2. node 1 节点转发 forward 更新 update 请求到 primary shard 所在的 node 3 节点

  3. node 3 节点从 primary shard 查询 retrieve 文档,修改 _source 元数据中的 JSON,并且试图在 primary shard 上 reindex 文档。如果文档已经被其他进程 process 改变,node 3 会重试 retry_on_conflict 中指定的次数,如果始终无法成功,那么就放弃更新。

  4. 如果 node 3 更新文档成功,它会并行 parallel 转发 forward 新版本的文档给 replica shard 所在的节点 Node 1 和 Node 2。当所有的 replica shards 更新成功,Node 3 才会给 coordinating node 报告更新成功,然后由 coordinating node 告知客户端。


Document-Based Replication


When a primary shard forwards changes to its replica shards, it doesn’t forward the update request. Instead it forwards the new version of the full document. Remember that these changes are forwarded to the replica shards asynchronously, and there is no guarantee that they will arrive in the same order that they were sent. If Elasticsearch forwarded just the change, it is possible that changes would be applied in the wrong order, resulting in a corrupt document.


发布于: 2021 年 01 月 26 日阅读数: 603
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Elasticsearch partial update