ES 支持乐观锁吗?如何实现的?
1 个回答
醉后不知天在水,满船清梦压星河。小王子-B996### **1. Elasticsearch 中的乐观锁支持** #### **1.1 什么是乐观锁?** 乐观锁是一种并发控制机制,假定冲突较少,允许多个线程并发读取资源,但在修改资源时会检查资源是否被其他线程更改过。如果检测到资源已被修改,则当前操作会失败。 #### **1.2 Elasticsearch 的乐观锁** Elasticsearch 使用文档的元信息(如 `if_seq_no` 和 `if_primary_term`)来实现乐观锁。更新操作时会检查文档的状态是否与预期一致,确保只有预期状态下的文档才能被更新。 ### **2. 使用 `if_seq_no` 和 `if_primary_term` 实现乐观锁** #### **2.1 基础字段** - **`if_seq_no`**:文档的序列号,递增的整数,记录文档的每次修改。用于标识当前文档的修改版本。 - **`if_primary_term`**:主分片的任期号,随着主分片重新分配或节点故障切换时递增。用于确保分布式系统中的一致性。 #### **2.2 更新操作示例** 假设有一个文档: ```json GET /products/_doc/1 { "_seq_no": 312, "_primary_term": 2, "_source": { "name": "Coffee", "price": 20 } } ``` 现在需要更新这个文档,同时进行乐观锁控制: ```http POST /products/_doc/1?if_seq_no=312&if_primary_term=2 { "name": "Coffee", "price": 22 } ``` #### **2.3 操作结果** 1. 如果 `if_seq_no` 和 `if_primary_term` 匹配,文档更新成功,返回类似以下的响应: ```json { "_index": "products", "_type": "_doc", "_id": "1", "_version": 2, "result": "updated", "_seq_no": 313, "_primary_term": 2 } ``` 2. 如果文档在操作前已被其他进程修改,`if_seq_no` 或 `if_primary_term` 不匹配,返回冲突错误: ```json { "error": { "type": "version_conflict_engine_exception", "reason": "[products][_doc][1]: version conflict, required seqNo [312], primaryTerm [2]. current seqNo [313], primaryTerm [2]" }, "status": 409 } ``` ### **3. 为什么不再使用 `_version` 实现乐观锁** #### **3.1 `_version` 的局限性** - **单一递增机制的不足**:`_version` 仅为递增整数,在分布式环境中缺乏足够的上下文信息。无法反映分片主节点的状态变化。 - **分布式场景中的问题**:当主分片切换或发生网络分区时,基于 `_version` 的控制可能导致数据不一致。例如,旧主分片上递增的版本号可能覆盖新主分片上的更新数据。 #### **3.2 `if_seq_no` 和 `if_primary_term` 的改进** - **细化的冲突检测**:`if_seq_no` 表示文档的修改历史,`if_primary_term` 标识主分片的任期,防止因分片切换导致的不一致。 - **结合分布式协议**:这两个值能更精确地描述分布式系统中文档的状态和变更历史,确保操作的正确性。 ### **4. 乐观锁的常见场景** #### **4.1 并发更新** 多个客户端尝试同时更新同一个文档时,可以通过 `if_seq_no` 和 `if_primary_term` 确保更新只在预期状态下成功。 #### **4.2 防止数据覆盖** 通过乐观锁,可以防止因客户端缓存的旧数据覆盖新版本数据。 ### **5. 总结** Elasticsearch 支持乐观锁,通过 `if_seq_no` 和 `if_primary_term` 提供高效的并发控制机制: 1. `if_seq_no` 记录文档的修改历史,确保操作基于最新状态。 2. `if_primary_term` 标识主分片的当前任期,防止分布式场景下的数据冲突。 3. 相较 `_version` 的机制,`if_seq_no` 和 `if_primary_term` 更精确地描述文档状态和变更历史,适应分布式环境中的高并发和故障场景。发布于 2024-12-28 11:13 •IP属地举报评论收藏
公众号进入网站体验更佳

