Elasticsearch 是分布式的。当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。
Elasticsearch 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许顺序是乱的 。
Elasticsearch 需要一种方法确保文档的旧版本不会覆盖新的版本。
<br/>
当我们之前讨论 index的GET 和 delete 请求时,我们指出每个文档都有一个 `_version `(版本)号,当文档被修改时版本号递增。 Elasticsearch 使用这个 version 号来确保变更以正确顺序得到执行。如果旧版本的文档在新版本之后到达,它可以被简单的忽略。
<br/>
我们可以利用 version 号来确保应用中相互冲突的变更不会导致数据丢失。我们通过指定想要修改文档的 version 号来达到这个目的。 如果该版本不是当前版本号,我们的修改请求将会失败。
<br/>
老版本 es 使用 version,但是新版本不支持了,会报下面的错误,提示我们用 `if_seq_no`和 `if_primary_term`来代替。演示如下:
**1. 新增一个文档**
```json
PUT /shopping/_create/1001
{
"title": "华为手机"
}
得到的响应如下:
{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "1001",
"_version" : 1, # 版本号为1
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0, # _seq_no、_primary_term与乐观并发控制相关
"_primary_term" : 1
}
```
**2. 使用version更改文档会失败**
提示我们用 `if_seq_no`和 `if_primary_term`来代替。
```json
POST /shopping/_update/1001?version=1
{
"doc": {
"title": "华为手机123"
}
}
得到的响应如下:
{
"error" : {
"root_cause" : [
{
"type" : "action_request_validation_exception",
"reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
}
],
"type" : "action_request_validation_exception",
"reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
},
"status" : 400
}
```
**3. 用 `if_seq_no`和 `if_primary_term`更改文档**
```json
#if_seq_no=0和if_primary_term=1需要已经存在
#如为"_seq_no" : 0、"_primary_term" : 1
#每更新一次文档_seq_no就会增1
POST /shopping/_update/1001?if_seq_no=0&if_primary_term=1
{
"doc": {
"title": "华为手机123"
}
}
响应内容如下:
{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "1001",
"_version" : 2, # 版本号由1变更为2
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1, # 由0变更为1
"_primary_term" : 1
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch与Solr
- 数据结构
- 安装Elasticsearch
- Linux单机安装
- Windows单机安装
- 安装Kibana
- Linux安装
- Windows安装
- es基本语句
- 索引操作
- 文档操作
- 映射操作
- 高级查询
- es-JavaAPI
- maven依赖
- 索引操作
- 文档操作
- 高级查询
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 类型(Type)
- 文档(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系统架构
- 分布式集群
- 单节点集群
- 故障转移
- 水平扩容
- 应对故障
- 路由计算
- 分片控制
- 写流程
- 读流程
- 更新流程
- 多文档操作流程
- 分片原理
- 倒排索引
- 文档搜索
- 动态更新索引
- 近实时搜索
- 持久化变更
- 段合并
- 文档分析
- 内置分析器
- 分析器使用场景
- 测试分析器
- 指定分析器
- 自定义分析器
- 文档处理
- 文档冲突
- 乐观并发控制
- 外部系统版本控制
- es优化
- 硬件选择
- 分片策略
- 合理设置分片数
- 推迟分片分配
- 路由选择
- 写入速度优化
- 批量数据提交
- 优化存储设备
- 合理使用合并
- 减少Refresh的次数
- 加大Flush设置
- 减少副本的数量
- 内存设置
- 重要配置
- es常见问题
- 为什么要使用Elasticsearch
- master选举流程
- 集群脑裂问题
- 索引文档流程
- 更新和删除文档流程
- 搜索流程
- ES部署在Linux时的优化方法
- GC方面ES需要注意的点
- ES对大数据量的聚合实现
- 并发时保证读写一致性
- 字典树
- ES的倒排索引
- Spring Data Elasticsearch
- 环境搭建
- 索引操作
- 文档操作