【吃透 Elasticsearch 的核心原理】学习步骤

要真正,需深入以下关键机制(结合最新技术演进):


一、倒排索引机制

  1. 核心三要素
    • Term Index:FST 结构加速前缀匹配(如 ap* 查询)
    • Term Dictionary:存储所有 token 及统计信息(如词频)
    • Posting List:采用 Roaring Bitmaps 压缩存储文档 ID 列表(参考)
  2. 动态合并策略
    • Segment 合并时的 TieredMergePolicy 算法
    • 倒排链的跳跃表(Skip List)优化范围查询

二、分布式架构原理

  1. 分片(Shard)机制
    • 主分片与副本分片的 写扩散/读负载均衡 策略
    • 路由算法:hash(_routing) % number_of_shards(file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\cluster\routing\IndexRouting.java#L434-L436)(源码级)
  2. 集群协调
    • Zen Discovery 协议与 Raft 算法的对比(7.x 后改进)
    • 脑裂检测:discovery.zen.minimum_master_nodes 公式推导

三、Lucene 核心机制

  1. 段合并(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)
    • 为什么删除文档不会立即释放磁盘空间?
  2. 近实时搜索(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

四、查询执行流程

  1. 分布式查询阶段
    • Query Phase:协调节点分发查询到各分片
    • Fetch Phase:通过 doc_values 或 _source 获取完整数据
  2. 相关性算分
    • TF-IDF 与 BM25 算法对比(ES 5.x 后默认 BM25)
    • 自定义 similarity(file://D:\code\elasticsearch\server\src\main\java\org\elasticsearch\index\engine\EngineConfig.java#L64-L64) 模块实现业务相关性

五、数据一致性模型

  1. 写入一致性
    • wait_for_active_shards 参数控制写入副本数
    • 乐观锁机制:_seq_no 和 _primary_term 的 CAS 实现
  2. 读取可见性
    • refresh_interval 对近实时性的影响
    • 通过 preference=_primary 强制读主分片

六、内存与磁盘管理

  1. JVM 堆内存
    • Fielddata 与 Doc Values 的内存/磁盘权衡
    • 熔断器(Circuit Breaker)机制防 OOM
  2. 文件系统缓存
    • 如何利用 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 预热热点数据

七、性能调优底层原理

  1. 写入吞吐优化
    • 批量写入时 _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))
  2. 查询加速技巧
    • Filter 上下文利用 BitSet 缓存机制
    • 通过 constant_keyword 减少倒排链扫描

附:原理级调试工具

java 复制代码
// 查看分片分配细节(源码级调试)
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)(写入引擎)进行断点级分析,这是真正吃透原理的最佳路径。

相关推荐
蒸蒸yyyyzwd32 分钟前
学习笔记 八股手撕
笔记·学习
大大大大晴天2 小时前
每天认识一个组件:Apache Pulsar
大数据
极限挑战哥2 小时前
共享电单车联营平台分账架构实践:二清合规与自动分账零人工方案
java·大数据·人工智能·微信小程序·架构·微信公众平台
QXWZ_IA2 小时前
公路边坡裂缝的自动化监测布设
大数据·人工智能·自动化
留岁3 小时前
大模型推理部署 · 学习文档
学习
meiying88383 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
小李不想当小白3 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
SelectDB4 小时前
Doris 异步物化视图实战:与 Snowflake MV / Dynamic Tables 分层建模对照
大数据·数据库·云原生
张张123y4 小时前
后端第十六课:Multi-Agent 多智能体(让多个 Agent 分工协作)
大数据·数据库·人工智能·python·deepseek·dsh·agent 框架
todoitbo4 小时前
MongoDB迁移之后,Spring Data 和 Hibernate 各自接哪类请求
大数据·数据库·mongodb·spring·hibernate·金仓数据库