Elasticsearch 深度原理:在保证数据一致性的前提下,如何安全更新倒排索引?

Elasticsearch 深度原理:在保证数据一致性的前提下,如何安全更新倒排索引?

    • 前言
    • [一、核心前提:Lucene 倒排索引不可变](#一、核心前提:Lucene 倒排索引不可变)
      • [1.1 为什么倒排索引不能修改?](#1.1 为什么倒排索引不能修改?)
      • [1.2 不能修改 → 怎么更新?](#1.2 不能修改 → 怎么更新?)
    • [二、ES 保证一致性更新的三大核心机制](#二、ES 保证一致性更新的三大核心机制)
      • [1. **Translog(预写日志)** → 确保数据不丢失](#1. Translog(预写日志) → 确保数据不丢失)
      • [2. **Version 版本号控制** → 确保并发更新一致性](#2. Version 版本号控制 → 确保并发更新一致性)
      • [3. **段(Segment)不可变 + 软删除 / 追加新段** → 安全更新倒排索引](#3. 段(Segment)不可变 + 软删除 / 追加新段 → 安全更新倒排索引)
  • [三、ES 更新倒排索引的完整流程(保证一致性)](#三、ES 更新倒排索引的完整流程(保证一致性))
  • [四、ES 如何保证更新过程中的**强一致性**?](#四、ES 如何保证更新过程中的强一致性?)
    • [1. 原子性更新(Update 原子性)](#1. 原子性更新(Update 原子性))
    • [2. 版本控制(Optimistic Concurrency Control)](#2. 版本控制(Optimistic Concurrency Control))
    • [3. 读写一致性(Read-Consistency)](#3. 读写一致性(Read-Consistency))
    • [4. 主分片 + 副本一致性](#4. 主分片 + 副本一致性)
    • [5. 近实时一致性(NRT)](#5. 近实时一致性(NRT))
  • [五、ES 更新倒排索引的核心原理总结(最重要)](#五、ES 更新倒排索引的核心原理总结(最重要))
    • [1. **永远不修改旧倒排索引**](#1. 永远不修改旧倒排索引)
    • [2. **更新 = 软删除旧 + 追加新**](#2. 更新 = 软删除旧 + 追加新)
    • [3. **倒排索引只增不减**](#3. 倒排索引只增不减)
    • [4. **最终一致性通过段合并实现**](#4. 最终一致性通过段合并实现)
    • [5. **高一致性通过 version + translog + 副本同步实现**](#5. 高一致性通过 version + translog + 副本同步实现)
  • 六、一句话总结(面试/工作必背)
  • 七、适用场景

|-----------------------------|
| 🌺The Begin🌺点点关注,收藏不迷路🌺 |

前言

Elasticsearch 底层基于 Lucene ,而 Lucene 有一个铁律:倒排索引(Segment)一旦生成,就是不可变的(Immutable)

这意味着:你永远不能直接修改倒排索引文件

但我们在业务中必须执行:

  • 更新文档(Update)
  • 删除文档(Delete)
  • 批量修改
  • 实时写入

那么问题来了:

倒排索引不能改,数据如何更新?如何保证一致性、不丢数据、不重复、不乱序?

这篇文章彻底讲透:

ES 如何在"不可变倒排索引"的前提下,安全更新数据并强保证一致性。


一、核心前提:Lucene 倒排索引不可变

1.1 为什么倒排索引不能修改?

倒排索引一旦写入磁盘,永远不能被修改

原因:

  • 极高并发安全
  • 无需锁
  • 缓存友好
  • 检索性能达到极致

1.2 不能修改 → 怎么更新?

ES 的答案:不修改旧数据,只追加新数据 + 标记旧数据。

这是 ES 实现一致性更新的核心架构思想。


二、ES 保证一致性更新的三大核心机制

要保证不丢数据、不重复、不脏读、原子性、事务性,ES 依靠 3 大底层机制:

1. Translog(预写日志) → 确保数据不丢失

2. Version 版本号控制 → 确保并发更新一致性

3. 段(Segment)不可变 + 软删除 / 追加新段 → 安全更新倒排索引


三、ES 更新倒排索引的完整流程(保证一致性)

流程总览

渲染错误: Mermaid 渲染失败: Parse error on line 4: ...--> D标记旧文档为.deleted(软删除)D --> E[写入新文档 -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

详细步骤(强一致性保证)

步骤1:版本校验(并发一致性)

ES 会检查 _version

  • 版本不一致 → 更新失败
  • 版本一致 → 继续

作用:防止并发更新覆盖、脏数据。

步骤2:写入 Translog(确保不丢数据)

更新指令先落盘 Translog

即使节点宕机,重启后也能恢复。

步骤3:软删除旧文档(不修改倒排索引)

不删除旧 Segment 里的数据!

只在 .del 文件 中标记:

复制代码
文档ID = 已删除

旧倒排索引完全不动

步骤4:新文档写入内存,生成新倒排段

新数据 → 内存 buffer → refresh → 新 Segment(新倒排索引)

步骤5:查询时自动合并新旧段

查询时,ES 自动:

  1. 读新 Segment
  2. 读旧 Segment
  3. 过滤软删除文档
  4. 返回最新版本

步骤6:段合并(最终物理删除)

后台异步:

  • 新段写入
  • 旧段删除
  • 空间真正释放

四、ES 如何保证更新过程中的强一致性

1. 原子性更新(Update 原子性)

ES 的更新是原子操作

  • 要么更新成功
  • 要么更新失败
    不会出现中间状态。

2. 版本控制(Optimistic Concurrency Control)

ES 使用 乐观锁

复制代码
if 旧version == 当前version
    更新
else
    失败

保证:

  • 不覆盖
  • 不乱序
  • 并发安全

3. 读写一致性(Read-Consistency)

ES 提供三种级别:

  • quorum(大多数,默认)
  • all
  • one

确保:

写入成功 → 一定能查到。

4. 主分片 + 副本一致性

更新流程:

复制代码
主分片写完 → 同步副本 → 返回成功

确保:

所有分片数据一致

5. 近实时一致性(NRT)

默认 refresh:1s

1 秒内数据可查。

若需要立即可查

复制代码
?refresh=true

五、ES 更新倒排索引的核心原理总结(最重要)

1. 永远不修改旧倒排索引

旧 Segment 只读不动。

2. 更新 = 软删除旧 + 追加新

  • 旧:标记删除
  • 新:写入新段

3. 倒排索引只增不减

段只会增加,不会修改。

4. 最终一致性通过段合并实现

后台真正删除旧数据。

5. 高一致性通过 version + translog + 副本同步实现


六、一句话总结(面试/工作必背)

**ES 不修改旧倒排索引,而是通过"软删除+追加新段"实现更新,

依靠版本号、Translog、副本同步,

在倒排索引不可变的前提下,保证强数据一致性。**


七、适用场景

  • 文档更新
  • 数据删除
  • 批量更新
  • 并发写入
  • 实时搜索
  • 高可用、强一致性系统

文末总结

你现在彻底理解了:

倒排索引不可变

ES 如何更新数据

如何保证一致性

软删除、版本、Translog、段机制的作用

这是 Elasticsearch 最核心、最高频、面试必问的底层原理。


|---------------------------|
| 🌺The End🌺点点关注,收藏不迷路🌺 |

相关推荐
SelectDB1 小时前
Apache Doris 在内容 AI 生产链路中的实践:从内容打标到可追溯数据链路
大数据·agent·图片资源
伟大的大威1 小时前
三台 DGX Spark 部署 DeepSeek V4 Flash NVFP4:从零到可用教程
大数据·分布式·spark
starzy19901 小时前
SparkStreaming 之 updateStateByKey 算子详解及代码实现
大数据·spark
爱吃面的猫1 小时前
大数据Hadoop之——集群环境搭建(了解)
大数据·hadoop·flume
故七月1 小时前
生成式引擎优化(GEO)的底层逻辑与产业实践
大数据·人工智能·机器学习
KKKlucifer2 小时前
异构融合与大规模割接——某电信运营商融合4A平台建设实践
大数据·网络·人工智能·安全
GIR7202 小时前
重构全球关节腔内注射物行业竞争格局:市场占有率、销量排名及主要竞争对手分析
大数据·人工智能
故七月2 小时前
让AI“看见”好服务——生成式引擎优化(GEO)的底层逻辑与产业实践
大数据·人工智能·机器学习
腾视科技-AIoT2 小时前
让安全驾驶有“AI”相伴|腾视科技DMS视频监控一体机,守护每一次出行
大数据·人工智能·科技·安全·行车记录仪·ainas·腾视科技