ElasticSearch性能原理拆解

目录

逐层拆分ElasticSearch的概念

索引和分片、副本

Segment

Inverted Index(倒排索引)

Stored Fields(存储字段)

Document Values

Es的缓存

ElasticSearch的文档索引过程

集群视角索引文档

分片内部索引时具体在做什么

refresh过程中segment的活动

flush过程中segment的活动

segement的 merge

ElasticSearch的检索过程

查询整体过程

查询时segment内部具体在做什么


逐层拆分ElasticSearch的概念

  • Cluster:集群,Es是一个可以横向扩展的检索引擎(部分时候当作存储数据库使用),一个Es集群由一个唯一的名字标识,默认为“elasticsearch”。在配置文件中指定相同的集群名,Es会将相同集群名的节点组成一个集群。

  • Node:节点,集群中的任意一个实例对象,是一个节点

  • Index:索引,存放相同类型数据的一个集合,索引有唯一的名字,相比于关系型数据库,可以理解为一个表(6.0.0废除type之后)

  • Shard:分片,物理存储单位,创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。

  • Replication:副本,对数据的备份,主要针对分片进行备份,即分片的备份

  • Document:文档,具体存储的数据(json结构)

如上图,每个云朵代表一个Es集群Cluster,集群中由一个个的Es实例Node构成,每个Es实例中存放着一个个的彩色方块(Shard),同一个集群中相同颜色的方块(shard)构成一个索引(index)

索引和分片、副本

实际上,索引更像是一个抽象的虚拟概念,使用时,我们面向的是索引(Index),只需要指定索引名即可。索引背后真正的实体是分片(Shard)。

同一集群中,同一索引(Index)可能由多个分片(Shard)组成,这些Shard会分布在不同的节点(Node)中;

而副本(Replication)则可以理解为一种特殊的分片,实际上数据是在一个个的分片上的,而副本的主要职责是对分片进行备份,以满足Es的稳定性。当副本数设置为1时,则代表着每个分片都会有一个副本,且副本中的内容与分片一样,肩负数据备份以及维稳责任。

例如我们在2个节点的集群上创建一个名为user的索引和student索引,user索引设置2个分片1个副本,student索引设置1个分片1个副本;那么user索引的两个shard会各自得到一个副本,副本和shard的内容一致,且均匀的分布在两个节点上(Es会根据相应的策略来尽可能保证分片和相应的副本不在同一节点中,且保证每个节点的数据都是完整的)。这样如果当Node1节点崩坏,对于user索引的查询,会由节点2的 shard1和shard0的副本来承担,且shard1和shard0的副本的数据之和是一个完整user的数据(等同于shard0和shard1)。

Segment

所以对于es来说,分片(shard)才是数据真正的载体,每一个Shard本质上是一个Lucene的索引(Lucene Index)。

每个Lucene Index(Es的Shard) 是由多个Segment构成 ,Segement才是Lucene和Es查询性能的核心,Segment主要承载三部分内容:

  • Inverted Index

  • Stored Fields

  • Document Values

这些数据结构或机制,会保证在检索时,均衡合理使用内存和IO,让检索变得更高效

Inverted Index(倒排索引)

Segment中最重要的就是倒排索引,也是Es能够快速检索的根本,它是Segment基于存储的数据抽离出来的一个能够快速检索的数据结构,一个倒排索引的结构主要由一个有序的数据字典Dictionary(包括单词Term和它出现的频率)和 单词Term对应的Postings(文档的id或位置)组成:

对于倒排索引,Es中是根据字段不同类型进行不同的策略:

  • Text 字段

    • 这些字段用于全文搜索。
    • 它们会被分析(分词),并创建倒排索引。
    • 可以包含多个词项,支持全文搜索和复杂查询。
  • Keyword 字段

    • 这些字段用于结构化搜索,如过滤、排序、聚合。
    • 它们不会被分析,而是以整个字段的值存储。
    • 每个不同的字段值都会在倒排索引中拥有一个独立的条目。
  • Numeric 字段(如 in

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖拌西红柿多放醋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值