Elasticsearch底层原理:数据存储全流程+管理机制深度剖析,彻底吃透ES存储核心
Elasticsearch底层原理:数据存储全流程+管理机制深度剖析,彻底吃透ES存储核心
- 前言
- 一、先搞懂:Elasticsearch 存储的底层基石 —— Lucene
- 1.1 核心结论
- 1.2 为什么段不可变?
- 二、Elasticsearch 底层数据结构(必须记住)
- 2.1 逻辑结构
- 2.2 物理结构
- 三、Elasticsearch 数据写入底层完整流程(超级详细)
- 3.1 一句话总结写入流程
- 3.2 10 步底层写入流程
- 3.3 底层数据写入流程图
- 四、近实时搜索(NRT)底层原理
- 4.1 为什么近实时?
- 4.2 核心机制
- 五、数据可靠性:Translog 底层机制
- 5.1 Translog 是什么?
- 5.2 工作机制
- 5.3 为什么 ES 写入不会丢数据?
- 六、数据删除 & 更新底层原理(面试必考)
- 6.1 核心结论
- 6.2 删除流程
- 6.3 更新流程
- 6.4 删除/更新底层流程图
- 七、段合并(Segment Merge)底层机制
- 7.1 为什么要合并?
- 7.2 合并做什么?
- 7.3 特点
- 八、Elasticsearch 磁盘文件结构(看懂就是高手)
- 九、总结:ES 底层存储 10 条核心真理(背会)
- 十、本文总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
前言
很多开发者天天用 Elasticsearch 做搜索、日志、聚合,但90% 的人都不清楚 ES 底层到底是怎么存数据的。
不知道 Segment、段不可变、倒排索引、刷盘机制、事务日志、段合并,就永远无法真正做好 ES 性能优化、故障排查、集群调优。
本文带你从 0 深入 ES 底层存储,用最通俗的语言 + 流程图 + 核心机制,完整讲解:
ES 数据写入流程 → 磁盘存储结构 → 索引管理 → 数据删除/更新 → 段合并机制。
吃透这篇文章,你对 ES 的理解会直接从“使用级”升到“架构级”。
一、先搞懂:Elasticsearch 存储的底层基石 —— Lucene
ES 自己不实现存储,它的存储底层是Apache Lucene。
1.1 核心结论
- ES = 分布式 Lucene
- Lucene = 最强大的搜索引擎库
- Lucene 索引 = Segment(段) + 倒排索引
- Segment(段)= 只读不可变(ES 所有存储机制都围绕这一点设计)
1.2 为什么段不可变?
- 极高并发读写安全
- 无需锁机制
- 利于缓存
- 利于压缩
- 检索速度极快
代价:不能直接修改/删除,只能新增、标记删除。
二、Elasticsearch 底层数据结构(必须记住)
2.1 逻辑结构
集群(Cluster) ↓ 索引(Index) ↓ 主分片 + 副本分片(Shard) ↓ 每个分片 = 一个独立的 Lucene 索引 ↓ Lucene 索引 = N 个 Segment(段) + 1 个 Translog(事务日志)2.2 物理结构
- Segment(段):真正的数据文件(倒排索引)
- .del 文件:删除标记文件
- Translog:写入防丢失日志
- Commit Point:段清单文件
三、Elasticsearch 数据写入底层完整流程(超级详细)
3.1 一句话总结写入流程
先写内存 → 定时刷成段 → 异步落盘 → 日志保证安全 → 后台合并段
3.2 10 步底层写入流程
- 客户端发送写入请求(PUT/POST/Bulk)
- 协调节点路由到对应主分片
- 数据写入JVM 内存 buffer
- 同时写入Translog(磁盘)保证不丢失
- 每隔
refresh_interval: 1s- buffer 生成新 Segment
- 写入文件系统缓存
- 文档可被检索
- 数据此时不在磁盘,但可搜索(近实时 NRT)
- 随着 Segment 越来越多,触发Flush 操作
- 所有 Segment写入磁盘
- 清空 Translog
- 后台段合并(Merge)优化查询性能
3.3 底层数据写入流程图
四、近实时搜索(NRT)底层原理
ES 不是实时数据库,是近实时搜索(Near Real Time)。
4.1 为什么近实时?
- 数据写入内存后不会立即可查
- 必须等1s refresh生成 Segment 才可以搜索
- 这就是 ES 写入后延迟 1 秒才能查到的根本原因
4.2 核心机制
refresh_interval: 1s(默认)- 内存 buffer → Segment → 可检索
- 不刷盘,只进文件缓存(性能极高)
五、数据可靠性:Translog 底层机制
5.1 Translog 是什么?
预写日志 WAL(Write Ahead Log)
作用:断电不丢数据。
5.2 工作机制
- 写入内存前先写磁盘日志
- 机器宕机,重启后会从 Translog 恢复数据
- Flush 后清空日志
5.3 为什么 ES 写入不会丢数据?
因为任何写入都会先落盘 Translog。
六、数据删除 & 更新底层原理(面试必考)
6.1 核心结论
段不可变 → 不能直接修改/删除
6.2 删除流程
- 不在磁盘删除数据
- 只在.del 文件中标记删除
- 查询时自动过滤掉标记文档
- 段合并时才真正物理删除
6.3 更新流程
更新 = 标记旧文档删除 + 写入新文档
6.4 删除/更新底层流程图
七、段合并(Segment Merge)底层机制
7.1 为什么要合并?
- 每次 refresh 都会生成新段
- 段太多 → 查询变慢 → 打开文件过多 → 性能暴跌
7.2 合并做什么?
- 把 N 个小 Segment → 1 个大 Segment
- 物理删除.del 标记的文档
- 释放磁盘空间
- 大幅提升查询速度
7.3 特点
- 后台异步执行
- 消耗 IO、CPU
- 高写入场景必须优化
八、Elasticsearch 磁盘文件结构(看懂就是高手)
数据真正落在磁盘上的文件:
| 文件名 | 作用 |
|---|---|
.seg | 段文件(倒排索引) |
.fnm | 字段信息 |
.tim | 倒排词典 |
.doc | 文档编号 |
.pos | 词项位置 |
.del | 删除标记 |
translog | 事务日志 |
这些文件共同组成了 Lucene 索引,也就是 ES 分片。
九、总结:ES 底层存储 10 条核心真理(背会)
- ES 底层 =Lucene
- 数据存储在Segment(段)
- 段只读不可变
- 写入先写内存,1秒后可搜索
- Translog 保证不丢数据
- 近实时搜索 = 1s refresh
- 删除=标记删除,不是物理删除
- 更新=删旧+写新
- 段合并 = 真正删除数据 + 提速
- 分片 = 独立 Lucene 索引
十、本文总结
Elasticsearch 底层存储设计非常精妙,用段不可变换取极致检索性能,用异步刷盘换取高吞吐。
你真正理解了:
- 写入流程
- 段机制
- Translog
- 近实时原理
- 删除/更新原理
- 段合并
你就彻底掌握了 Elasticsearch 最核心的底层原理。
以后优化写入、优化查询、排查卡顿、解决磁盘膨胀,都会一眼定位根源。
🌺The End🌺点点关注,收藏不迷路🌺 |
