Elasticsearch partial update
partial update 似乎已经不再是 Elasticsearch 的主流,但还是记录一下。文字内容整理自 B 站中华石杉的 Elasticsearch 顶尖高手系列课程核心知识篇
partial update,看起来很方便的操作,实际内部的原理是什么样子的,然后它的优点是什么?
其实,Elasticsearch 内部对 partial update 的实际执行跟传统的全量替换方式,是几乎一样的。
内部先获取 document
将传过来的 field 更新到 document 的 JSON 中
将老的 document 标记为 deleted
将修改后的新的 document 创建出来
partial update 相较于全量替换的优点
所有的查询、修改和写回操作,都发生在 Elasticsearch 中的一个 shard 内部,避免了所有的网络数据传输的开销(减少了两次网络请求),大大提升了性能。
减少了查询和修改中的时间间隔,可以有效减少并发冲突的情况。
partial update 同样会自动执行之前讲过的乐观锁的并发控制。
retry 策略
partial update 失败之后,再次获取 document 数据和新的版本号 version
基于新的版本号再次去更新,如果成功就结束
如果失败,重复 1 和 2 的步骤,最多可以重复 retry_on_conflict 指定的次数
后来看了一下官方文档,似乎 partial update 的说法已经不再是主流,简单记录一下。
partial update 的步骤:
client 向 node 1 节点发送更新 update 请求
node 1 节点转发 forward 更新 update 请求到 primary shard 所在的 node 3 节点
node 3 节点从 primary shard 查询 retrieve 文档,修改 _source 元数据中的 JSON,并且试图在 primary shard 上 reindex 文档。如果文档已经被其他进程 process 改变,node 3 会重试 retry_on_conflict 中指定的次数,如果始终无法成功,那么就放弃更新。
如果 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.
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/31d14df55a3277536c2972dae】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论