【吃透 Elasticsearch 的核心原理】学习步骤
要真正,需深入以下关键机制(结合最新技术演进):
一、倒排索引机制
- 核心三要素
Term Index
:FST 结构加速前缀匹配(如ap*
查询)Term Dictionary
:存储所有 token 及统计信息(如词频)Posting List
:采用 Roaring Bitmaps 压缩存储文档 ID 列表(参考)
- 动态合并策略
- Segment 合并时的
TieredMergePolicy
算法 - 倒排链的跳跃表(Skip List)优化范围查询
- Segment 合并时的
二、分布式架构原理
- 分片(Shard)机制
- 主分片与副本分片的 写扩散/读负载均衡 策略
- 路由算法:[hash(_routing) % number_of_shards](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\cluster\routing\IndexRouting.java#L434-L436)(源码级)
- 集群协调
- Zen Discovery 协议与 Raft 算法的对比(7.x 后改进)
- 脑裂检测:
discovery.zen.minimum_master_nodes
公式推导
三、Lucene 核心机制
- 段合并(Segment Merge)
IndexWriter
的 [mergePolicy](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\EngineConfig.java#L62-L62) 与 [mergeScheduler](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\InternalEngine.java#L143-L143)- 为什么删除文档不会立即释放磁盘空间?
- 近实时搜索(NRT)
- [refresh](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\InternalEngine.java#L2020-L2023) 操作与 [translog](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\InternalEngine.java#L142-L142) 的协作机制
- 写入流程:
Memory Buffer
→ [Translog](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\translog\Translog.java#L87-L1971) →Segment
→Commit Point
四、查询执行流程
- 分布式查询阶段
- Query Phase:协调节点分发查询到各分片
- Fetch Phase:通过
doc_values
或_source
获取完整数据
- 相关性算分
- TF-IDF 与 BM25 算法对比(ES 5.x 后默认 BM25)
- 自定义 [similarity](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\EngineConfig.java#L64-L64) 模块实现业务相关性
五、数据一致性模型
- 写入一致性
wait_for_active_shards
参数控制写入副本数- 乐观锁机制:
_seq_no
和_primary_term
的 CAS 实现
- 读取可见性
refresh_interval
对近实时性的影响- 通过
preference=_primary
强制读主分片
六、内存与磁盘管理
- JVM 堆内存
Fielddata
与Doc Values
的内存/磁盘权衡- 熔断器(Circuit Breaker)机制防 OOM
- 文件系统缓存
- 如何利用 [mmap](file://D:\code\elasticsearch\x-pack\plugin\blob-cache\src\main\java\org\elasticsearch\blobcache\shared\SharedBytes.java#L71-L71) 加速 Lucene 文件访问
index.store.preload
预热热点数据
七、性能调优底层原理
- 写入吞吐优化
- 批量写入时
_bulk
的自动分段策略 - Translog 的 [durability](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\IndexSettings.java#L856-L856) 参数(
async
vs [request](file://D:\code\elasticsearch\test\framework\src\main\java\org\elasticsearch\test\TestSearchContext.java#L81-L81))
- 批量写入时
- 查询加速技巧
- Filter 上下文利用 BitSet 缓存机制
- 通过
constant_keyword
减少倒排链扫描
附:原理级调试工具
// 查看分片分配细节(源码级调试)
GET _cluster/allocation/explain
{"index": "my_index","shard": 0,"primary": true
}// 分析查询执行计划(需开启profile)
GET /my_index/_search
{"profile": true,"query": {...}
}
建议通过 Elasticsearch 官方源码 结合关键类如 [TransportSearchAction](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\action\search\TransportSearchAction.java#L122-L1995)(搜索入口)、[InternalEngine](file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\InternalEngine.java#L135-L3476)(写入引擎)进行断点级分析,这是真正吃透原理的最佳路径。