概要
本篇主要介绍增量更新(partial update,也叫局部更新)的核心原理,介绍6.3.1版本的Elasticsearch脚本使用实例和增量更新的优势。
增量更新过程与原理
简单回顾
前文我们有简单介绍过增量的语法,简单回顾一下请求示例:
POST /music/children/1/_update
{
"doc": {
"length": "76"
}
}
一般从客户端到Elasticsearch,完整的应用请求流程基本是这样的:
- 客户端先发起GET请求,获取到document信息,展现到前端页面上,供用户进行编辑。
- 用户编辑完数据后,点击提交。
- 后台系统处理修改后的数据,并组装好完整的document报文。
- 发送PUT请求到ES,进行全量替换。
- ES将老的document标记为deleted,然后重新创建一个新的document。
Elasticsearch的document是基于不可变模式设计的,所有的document更新,其实都创建了一个新的document出来,再把老的document标记为deleted,增量更新也不例外,只是GET全量document数据,整合新的document,替换老的document这三步操作全在一个shard里完成,毫秒级完成。
增量更新分片之间的交互
增量更新document的步骤:
- Java客户端向ES集群发送更新请求。
- Coodinate Node收到请求,但该document不在当前node上,它将请求转发到Node2节点的P0 shard上。
- Node 2检索document,修改_source下的JSON,并且重新索引该document,如果有其他线程修改过该document,有版本冲突的话,会重新尝试更新document,最大重试retry_on_conflict次,超出重试次数后放弃。
- 如果步骤3操作成功,Node2会将该document的完整内容异步转发到Node1和Node3的replica shard,重新建立索引。一旦所有replica都返回成功,Node2返回成功消息给Coodinate Node。
- Coodinate Node响应更新成功消息给客户端,此时ES集群内primary shard和replica shard都已经更新完成。
注意几点:
-
<