es底层原理(ds)
一、核心架构与组件
- 节点与集群
- 节点(Node):ES集群由多个节点组成,每个节点承担不同角色:
- 主节点(Master Node):管理集群状态(如分片分配、节点发现)。
- 数据节点(Data Node):存储数据分片,执行数据操作。
- 协调节点(Coordinating Node):处理客户端请求,路由请求到相关分片并聚合结果。
- 集群(Cluster):通过唯一名称标识,节点间通信实现高可用和负载均衡。
- 节点(Node):ES集群由多个节点组成,每个节点承担不同角色:
- 索引与分片
- 索引(Index):逻辑上类似数据库,存储JSON文档的集合。每个索引可划分为多个分片。
- 分片(Shard):
- 主分片(Primary Shard):数据存储的逻辑单元,支持水平扩展。
- 副本分片(Replica Shard):主分片的冗余副本,提供高可用性和读取负载均衡。
- 分片机制:通过哈希函数和模运算路由文档到主分片,确保同一ID的文档始终路由到同一分片。
-
一、集群管理:节点与协调
-
一、分布式架构:分片与副本
二、数据存储与索引机制
- 倒排索引(Inverted Index)
- 核心原理:将文档中的词条(Term)映射到包含该词条的文档列表,实现快速检索。例如,词条“Elasticsearch”会指向所有包含该词的文档。
- 构建流程:
- 分词:文本经分词器(Analyzer)处理,包括分词、过滤停用词、词干提取等。
- 词汇表(Vocabulary):存储唯一词条并排序,优化检索效率。
- 倒排列表(Posting List):记录词条出现的文档ID、位置和频率。
-
二、核心数据结构:倒排索引(Inverted Index)
- 数据写入流程
- 缓冲区与事务日志:
- 文档写入时先存入内存缓冲区(Buffer),并记录到事务日志(Translog)以确保持久性。
- 刷新与段合并:
- 刷新(Refresh):周期性(默认1秒)将缓冲区数据写入Lucene段(Segment),生成不可变的索引文件。
- 段合并(Segment Merging):定期合并小段,删除重复数据,优化存储和查询性能。
- 异步复制:主分片写入后,数据异步复制到副本分片,确保高可用性。写入确认机制保证数据一致性。
- 缓冲区与事务日志:
- 存储细节
- 段(Segment):Lucene索引的基本单位,不可变且独立存储。
- Doc Values:优化数值字段的聚合和排序性能,通过列式存储实现快速扫描。
- 冷热分离存储:活跃数据存储在高性能介质(如SSD),历史数据存储在低成本介质(如HDD),平衡成本与性能。
三、分布式架构设计
- 分片路由与负载均衡
- 路由策略:文档通过哈希函数和模运算路由到主分片,确保数据均匀分布。
- 负载均衡:协调节点将请求分发到相关分片,支持并发查询,聚合结果后返回。
- 故障恢复与高可用性
- 副本机制:副本分片在主分片故障时接管,通过全量拷贝恢复数据。
- 自动重平衡:集群状态变化时(如节点加入/退出),主节点自动调整分片分布。
- 一致性模型
- 写入一致性:支持配置写入时需确认的副本分片数量,确保数据强一致性。
- 最终一致性:副本分片异步复制,可能短暂存在数据延迟。
四、查询与检索流程
- 两阶段查询
- 查询阶段(Query Phase):
- 协调节点将请求广播到主分片或副本,各分片本地执行查询并返回文档ID和评分。
- 取回阶段(Fetch Phase):
- 协调节点根据ID获取完整文档,合并结果并排序(如按相关性评分)。
- 查询阶段(Query Phase):
- 分析器与分词
- 分词器(Analyzer):支持多种分词策略,如标准分析器(分词、转小写)、简洁分析器(按非字母分词)等。
- 自定义分析器:可配置字符过滤器、分词器和词项过滤器,满足特定场景需求。
- 聚合与排序
- 聚合框架:支持桶聚合(如按字段分组)、度量聚合(如求和、平均值)和管道聚合(如移动平均)。
- 排序机制:支持字段排序、脚本排序和地理距离排序。
四、搜索流程:查询与聚合
五、性能优化策略
- 缓存机制
- 查询缓存(Query Cache):缓存频繁执行的查询结果,减少磁盘I/O。
- 过滤器缓存(Filter Cache):缓存过滤器结果,加速过滤操作。
- 段合并优化
- 合并策略:通过配置合并因子(Merge Factor)控制段合并频率,平衡写入与查询性能。
- 硬件与配置调优
- 内存管理:合理分配堆内存(默认50%系统内存),避免垃圾回收(GC)影响性能。
- 线程池调整:根据负载调整搜索、写入线程池大小,防止资源竞争。
-
五、性能优化设计
-
缓存机制
-
Query Cache:缓存聚合结果(仅对相同查询有效)。
-
Request Cache:缓存分片级查询结果(依赖
size=0
的聚合)。 -
Fielddata Cache:文本字段聚合时内存缓存(谨慎使用)。
-
-
写入优化
-
批量写入(
bulk
API)减少网络开销。 -
调整
refresh_interval
(延长刷新间隔提升写入吞吐)。
-
-
六、底层依赖
-
Apache Lucene
-
ES的核心存储与搜索库,负责:
-
倒排索引/列式存储(Doc Values)。
-
分词器(Analyzer)、评分算法(TF-IDF/BM25)。
-
-
六、核心基础:Lucene 的依赖与扩展
-
-
JVM 管理
-
堆内存分配建议 ≤ 30GB,预留内存给OS Cache(Lucene依赖文件系统缓存加速搜索)。
-
七、实时性保障:近实时搜索(Near Real-Time, NRT)
八、文档处理:映射与分析器
九、容错与恢复
- 数据恢复:依赖事务日志(Translog),节点重启时,未提交到磁盘的段可通过事务日志恢复。
-
数据一致性
-
使用乐观锁(
_version
字段)避免并发冲突。 -
写入需多数分片确认(
wait_for_active_shards
参数控制)。
-
总结:ES核心优势
特性 | 实现原理 |
---|---|
近实时搜索 | 定期Refresh + Translog持久化 |
水平扩展 | 分片自动路由 + 副本负载均衡 |
高可用 | 分片副本 + Master选举机制 |
复杂查询能力 | Lucene倒排索引 + FST/跳表优化 |