Elasticsearch 原理解析

介绍

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

实时分析的分布式搜索引擎。

可以扩展到上百台服务器,处理 PB 级别的结构化或非结构化数据。

基本概念

名词解析
集群(cluster):由一个或多个节点组成, 并通过集群名称与其他集群进行区分

节点(node):单个 ElasticSearch 实例

索引(index):在 ES 中, 索引是一组文档的集合

分片(shard):因为 ES 是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES 自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是 20 亿.

副本(replica):ES 默认为一个索引创建 5 个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由 5 个主分片成本, 而每个主分片都相应的有一个 copy.

分片及副本的分配是高可用及快速搜索响应的设计核心。主分片与副本都能处理查询请求, 它们的唯一区别在于只有主分片才能处理索引请求。

架构

在这里插入图片描述

节点架构图:

在这里插入图片描述

分片

每一个 shard 就是一个 Lucene Index,包含多个 segment 文件,和一个 commit point 文件。

在 es 配置好索引后,集群运行中是无法调整分片配置的。如果要调整分片数量,只能新建索引对数据进重新索引(reindex),该操作很耗时,但是不用停机。

分片时主要考虑数据集的增长趋势,不要做过度分片。

每个分片都有额外成本:

每个分片本质上就是一个 Lucene 索引, 因此会消耗相应的文件句柄, 内存和 CPU 资源

每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降

每个搜索请求会遍历这个索引下的所有分片

ES 使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差

es 推荐的最大 JVM 堆空间时 30~32G,所以如果分片最大容量限制为 30G,假如数据量达到 200GB,那么最多分配 7 个分片就足够了。过早的优化是万恶之源,过早的分片也是。

读写数据流程、搜索流程

写入数据

客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node (协调节点)

coordinating node,对 document 进行路由,将请求转发给对应的 node

实际上的 node 上的 primary shard 处理请求,然后将数据同步到 replica node

coordinating node,如果发现 primary node 和所有的 replica node 都搞定之后,就会返回请求到客户端

其中步骤 3 中 primary 直接落盘 IO 效率低,所以参考操作系统的异步落盘机制:

在这里插入图片描述
ES 使用了一个内存缓冲区 Buffer,先把要写入的数据放进 buffer;同时将数据写入 translog 日志文件(其实是些 os cache)。

refresh:buffer 数据满/1s 定时器到期会将 buffer 写入操作系统 segment file 中,进入 cache 立马就能搜索到,所以说 es 是近实时(NRT,near real-time)的

flush:tanslog 超过指定大小/30min 定时器到期会触发 commit 操作将对应的 cache 刷到磁盘 file,commit point 写入磁盘,commit point 里面包含对应的所有的 segment file

translog 默认 5s 把 cache fsync 到磁盘,所以 es 宕机会有最大 5s 窗口的丢失数据

读取数据

客户端发送任何一个请求到任意一个 node,成为 coordinate node

coordinate node 对 document 进行路由,将请求 rr 轮训转发到对应的 node,在 primary shard 以及所有的 replica 中随机选择一个,让读请求负载均衡,

接受请求的 node,返回 document 给 coordinate note

coordinate node 返回给客户端

搜索过程

客户端发送一个请求给 coordinate node

协调节点将搜索的请求转发给所有的 shard 对应的 primary shard 或 replica shard

query phase:每一个 shard 将自己搜索的结果(其实也就是一些唯一标识),返回给协调节点,有协调节点进行数据的合并,排序,分页等操作,产出最后的结果

fetch phase ,接着由协调节点,根据唯一标识去各个节点进行拉去数据,最总返回给客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值