【Elasticsearch】副本恢复机制文件级(file-based)操作级(ops-based)顶级理解

两种恢复最终都要**让副本的 Lucene 段文件跟主分片一致**,但"动手对象"不同:

  1. **文件级(file-based)**
  • 直接复制**整个段文件(.cfs、.si、.dvd ...)**到副本节点

  • 副本**原样替换**自己的目录,**不再逐条解析**

  • 过程中**不打开 Lucene 文档**,只搬运字节;最后由副本自己打开 IndexWriter 做一次 commit 即可

  1. **操作级(ops-based)**
  • 不复制段文件,而是**一条条发 Translog.Operation**

  • 副本收到后,**在本地的 IndexWriter 上重放**:addDocument、deleteDocument、updateDocument ...

  • 每条操作都会**实时写副本的 Lucene 段**,也会写副本的 translog,最后 commit

→ 所以:

  • **文件级**:**主分片**的 Lucene 文件 → **副本磁盘**(字节搬运)

  • **操作级**:**主分片**的 Lucene 文档 → **反序列化成操作** → **副本 IndexWriter** → **副本的 Lucene 文件**(逐条写入)

**最终都是让副本的 Lucene 段保持一致,只是路径不同:一个"整块复制",一个"逐条重放"。**

操作级(ops-based)恢复跟**物理 translog 文件**完全无关:

  1. 主分片**不读自己的 `.tlog` 文件**;

  2. 用 `LuceneChangesSnapshot` **直接从 Lucene 倒排表里**按 `_seq_no` 把文档/墓碑捞出来;

  3. 现场包成 `Translog.Index` / `Delete` / `NoOp` 对象发给副本;

  4. 副本收到后,**在自己的 IndexWriter 上重放**这些操作,生成**自己的** Lucene 段。

因此整个流程**既不读主分片的 translog 文件,也不依赖 translog 文件做传输**,只是借用了"Translog.Operation"这个统一的数据结构而已。

相关推荐
日月云棠20 小时前
各版本JDK对比:JDK 25 特性详解
java
用户83071968408221 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide21 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家1 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺1 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602731 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程1 天前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
Turnip12021 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
程序员清风1 天前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试
beata1 天前
Java基础-13: Java反射机制详解:原理、使用与实战示例
java·后端