系列文字 Elasticsearch集群架构&&如何保证分片数据一致性
本文主要分享ES的数据查询流程
Elasticsearch的数据检索流程涉及多个步骤,从客户端请求到最终返回结果,底层实现依赖于其分布式搜索引擎的架构。以下是Elasticsearch数据检索的基本流程及其底层实现:
数据检索流程
分为根据ID检索和字段检索。
根据ID检索流程
根据 doc id 检索流程.png
- 客户端发送put请求到任意节点,该节点将作为协调节点。
- 使用 doc id 确定数据所在主分片「id 到分片的映射是基于 doc id 的哈希值和集群分片数量计算的」路由到 shard 所在节点。
- 将数据返回协调节点。
- 协调节点处理结果返回客户端。如果启动了缓存,在协调节点命中缓存,会将缓存结果直接返回客户端。
根据字段检索
根据query 字段检索流程.png
- 客户端发送put请求到任意节点,
该节点将作为协调节点。 - 协调节点进行 query 解析,根据索引及解析后的数据,确定相关分分片,并将查询分发到相关分片。
- 相关分片的数据节点执行本地查询,把符合条件的数据id、排序字段等信息返回给协调节点。
- 各分片数据将 TopN 数据返回协调节点。
协调节点将数据合并排序整理后得到最终TopN的id。 - 各分片根据 id 获取数据,将数据返回协调节点。
- 协调节点将检索结果返回客户端。
检索底层实现
倒排索引
Elasticsearch使用倒排索引来实现快速搜索。每个字段都被分析并存储为一个倒排索引,其中包含词条(Term),词条对应的文档列表,以及词条在文档中的位置。
分片和副本
索引被分成多个主分片,每个主分片可以有多个副分片。查询操作会在所有相关的主分片及其副本上执行。
并行处理
查询在多个分片上并行执行,以提高性能。
分布式缓存
Elasticsearch使用两种类型的缓存:查询缓存和文档缓存。查询缓存存储了常见查询的结果,而文档缓存存储了最近访问的文档。
分布式执行
查询操作在所有相关的分片上分布式执行,每个分片生成一个局部排序的结果集。
聚合操作
对于聚合查询,Elasticsearch会在每个分片上执行局部聚合,然后将这些局部聚合结果发送回协调节点进行全局聚合。
故障转移和容错
如果某个分片的节点不可用,Elasticsearch会使用副本分片来处理查询。
优化和简化
Elasticsearch的查询优化器会尝试简化查询,并选择最有效的执行计划。
结果的序列化和传输
最终结果在协调节点上进行序列化,并通过HTTP或其他协议发送回客户端。
Elasticsearch的查询流程和底层实现非常复杂,涉及到大量的优化和并行处理机制,以确保在大规模数据集上也能提供快速和准确的搜索结果。