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
- 環境搭建
- 索引操作
- 文檔操作