您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

一文轻松图解搞懂Elasticsearch原理!

时间:2022-12-26 11:40:48  来源:  作者: IT架构师联盟

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com

ES 的集群模式和 kafka 很像,kafka 又和 redis 的集群模式很像。总之就是相互借鉴!

不管你用没用过 ES,今天我们一起聊聊它。就当扩展大家的知识广度了!

认识倒排索引

「正排索引 VS 倒排索引:」

正排索引 VS 倒排索引

「倒排索引包括两个部分:」

 

  •  

     

    单词词典(Term Dictionary):记录所有文档的单词,记录单词到倒排列表的关联关系

     

    ❝ 单词词典一般比较大,可以通过 B+ 树 或 哈希拉链法实现,以满足高性能的插入与查询 ❞
  •  

     

    倒排列表(Posting List):记录了单词对应的文档结合,由倒排索引项(Posting)组成:

     

    •  

      文档ID

       

    •  

      词频TF:该单词在文档中出现的次数,用于相关性评分

       

    •  

      位置(Position):单词在文档中分词的位置。用于语句搜索(Phrase Query

       

    •  

      偏移(Offset):记录单词的开始结束位置,实现高亮显示

       

 

倒排索引

ElasticSearch的倒排索引:」

 

  •  

    ElasticSearchJSON文档中的每个字段,都有自己的倒排索引

     

  •  

    可以针对某些字段不做索引

     

    •  

      优点:节省存储空间

       

    •  

      缺点:字段无法被搜索

       

 

分布式架构原理

「分片shard:一个索引可以拆分成多个shard分片。」

 

  •  

    主分片primary shard:每个分片都有一个主分片。

     

  •  

    备份分片replica shard:主分片写入数据后,会将数据同步给其他备份分片。

     

 

ES集群部署在 3个 机器上(esnode1esnode2esnode3):

「创建个索引,分片为 3 个,副本数设置为 1:」

PUT /sku_index/_settings
{
"settings": {
"number_of_shards" : 3,
"number_of_replicas": 1
}
}

响应:
{
"acknowledged" : true
}

分布式架构原理

ES集群中有多个节点,会自动选举一个节点为master节点,如上图的esnode2节点:」

 

  •  

    主节点(master):管理工作,维护索引元数据、负责切换主分片和备份分片身份等。

     

  •  

    从节点(node):数据存储。

     

 

「集群中某节点宕机:」

 

  •  

    主节点宕机:会重新选举一个节点为 主节点。

     

  •  

    从节点宕机:由 主节点,将宕机节点上的 主分片身份转移到其他机器上的 备份分片上。

     

 

写入数据的工作原理

「写单个文档所需的步骤:」

 

  1.  

     

    客户端选择一个Node发送请求,那么这个Node就称为「协调节点(Coorinating Node)」

     

  2.  

     

    Node使用文档ID来确定文档属于分片 0,通过集群状态中的内容路由表信息获知分片0 的主分片在Node1上,因此将请求转发到Node1上。

     

  3.  

     

    Node1上的主分片执行写操作。如果写入成功,则将请求并行转发到Node3的副分片上,等待返回结果。

    当所有的副分片都报告成功,Node1将向Node(协调节点)报告成功。

     

 

写入数据的工作原理

Tips:客户端收到成功响应时,意味着写操作已经在主分片和所有副分片都执行完成。」

写数据底层原理

写数据底层原理

「写操作可分为 3 个主要操作:」

 

  1.  

     

    **写入新文档:**这时候搜索,是搜索不到。

     

  •  

    将数据写入内存

     

  •  

    将这操作写入translog文件中

     

  •  

 

**refresh操作:**默认每隔 1s ,将内存中的文档写入文件系统缓存(filesystem cache)构成一个segment

 

❝ 这时候搜索,可以搜索到数据。 ❞
 
  •  

    1s时间:ES是近实时搜索,即数据写入1s后可以搜索到。」

     

  •  

 

**flush操作:**默认每隔 30 分钟 或者translog文件512MB,将文件系统缓存中的segment写入磁盘,并将translog删除。

translog文件:」来记录两次flush(fsync) 之间所有的操作,当机器从故障中恢复或者重启,可以根据此还原

 

  •  

    translog是文件,存在于内存中,如果掉电一样会丢失。

     

  •  

    「默认每隔 5s 刷一次到磁盘中」

     

 

读取数据的工作原理

「读取文档所需的步骤:」

 

  1.  

    客户端选择一个Node发送请求,那么这个Node就称为「协调节点(Coorinating Node)」

     

  2.  

    Node使用文档ID来确定文档属于分片 0,通过集群状态中的内容路由表信息获知分片0 有 2 个副本数据(一主一副),会使用随机轮询算法选择出一个分片,这里将请求转发到Node1

     

  3.  

    Node1将文档返回给NodeNode将文档返回给客户端。

     

 

读取数据的工作原理

「在读取时,文档可能已经存在于主分片上,但还没有复制到副分片,这种情况下:」

 

  •  

    读请求命中副分片时,可能会报告文档不存在。

     

  •  

    读请求命中主分片时,可能成功返回文档。

     

 

搜索工作原理

「搜索数据过程:」

 

  1.  

    客户端选择一个Node发送请求,那么这个Node就称为「协调节点(Coorinating Node)」

     

  2.  

    Node协调节点将搜索请求转发到所有的 分片(shard):主分片 或 副分片,都可以。

     

  3.  

    query阶段」:每个分片shard将自己的搜索结果(文档ID)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。

     

  4.  

    fetch阶段」:由协调节点根据 文档ID去各个节点上拉取实际的文档数据。

     

 

搜索工作原理

**举个栗子:**有 3 个分片,查询返回前 10 个匹配度最高的文档

 

  1.  

    每个分片都查询出当前分片的TOP 10数据

     

  2.  

    「协调节点」3 * 10 = 30的结果再次排序,返回最终TOP 10的结果。

     

 

删除/更新数据底层原理

 

  •  

    「删除操作」commit的时候会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个 doc 是否被删除了。

     

  •  

    「更新操作」:就是将原来的doc标识为deleted状态,然后新写入一条数据。

     

 

「底层逻辑是:」

 

  •  

    Index Buffer每次refresh操作,就会产生一个segment file。(默认情况:1秒1次)

     

  •  

    定制执行merge操作:将多个segment file合并成一个,同时将标识为deleteddoc「物理删除」,将新的segment file写入磁盘,最后打上commit point标识所有新的segment file



Tags:Elasticsearch   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Elasticsearch 性能优化详解
硬件配置优化升级硬件设备配置一直都是提高服务能力最快速有效的手段,在系统层面能够影响应用性能的一般包括三个因素:CPU、内存和 IO,可以从这三方面进行 ES 的性能优化工作。...【详细内容】
2024-03-07  Search: Elasticsearch  点击:(25)  评论:(0)  加入收藏
ElasticSearch 的概念解析与使用方式
ElasticSearch(后续简称 ES)在企业中的使用可以说是非常广泛了,那么 ES 到底是什么呢?我们学习 ES 能做到哪些事情呢?接下来我将用几篇文章详细聊一聊 ES。ES 是一款高性能的分布...【详细内容】
2023-12-29  Search: Elasticsearch  点击:(112)  评论:(0)  加入收藏
一口气看完43个关于 ElasticSearch 的实操建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-28  Search: Elasticsearch  点击:(95)  评论:(0)  加入收藏
一口气看完 43 个关于 ElasticSearch 的使用建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-19  Search: Elasticsearch  点击:(175)  评论:(0)  加入收藏
Elasticsearch与文件描述符的恩恩怨怨
提到Elasticsearch,让笔者最恶心的倒不是它的反人类的DSL设计,而是每次安装都需要修改进程的最大文件描述符。那ES与文件描述符有啥恩怨呢,下面就来唠叨唠叨。首先说说文件描述...【详细内容】
2023-12-13  Search: Elasticsearch  点击:(124)  评论:(0)  加入收藏
Mongodb和Elasticsearch计算经纬度哪个性能更好
MongoDB和Elasticsearch都支持计算经纬度距离,但它们的性能表现可能因使用场景和数据规模而异。性能对比1、数据索引和存储 MongoDB使用地理空间索引(2dsphere)来支持经纬度数...【详细内容】
2023-12-11  Search: Elasticsearch  点击:(220)  评论:(0)  加入收藏
SpringBoot整合ElasticSearch详解及相关使用方法
环境:springboot2.4.12 + ElasticSearch7.8.0简介Elasticsearch是一个分布式搜索引擎,底层基于Lucene实现。它屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了Restful...【详细内容】
2023-11-10  Search: Elasticsearch  点击:(201)  评论:(0)  加入收藏
Elasticsearch的实际应用与扩展案例
当谈到搜索和分析大量数据时,Elasticsearch 是一个强大且广泛使用的工具。它是一个开源的分布式搜索和分析引擎,被设计用于处理海量数据,并提供实时的搜索、分析和可视化功能。...【详细内容】
2023-10-16  Search: Elasticsearch  点击:(269)  评论:(0)  加入收藏
十分钟掌握Doris,超越Hive、Elasticsearch和PostgreSQL
以前,数据仓库通常由Apache Hive、MySQL、Elasticsearch和PostgreSQL组成。它们支持数据仓库的数据计算和数据存储层: 数据计算:Apache Hive作为计算引擎。 数据存储:MySQL为Dat...【详细内容】
2023-09-27  Search: Elasticsearch  点击:(225)  评论:(0)  加入收藏
何时使用Elasticsearch,而不是MySQL?
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景。本文将从以下几个方面对它们进行比较和分析: 数据模型 查询语言 索引和搜索 分布式和高可...【详细内容】
2023-08-22  Search: Elasticsearch  点击:(195)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(12)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(19)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(119)  评论:(0)  加入收藏
站内最新
站内热门
站内头条