0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-12-19 11:26 次阅读

  • 认识倒排索引
  • 分布式架构原理
  • 写入数据的工作原理
  • 写数据底层原理
  • 读取数据的工作原理
  • 搜索工作原理
  • 删除/更新数据底层原理

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

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

ac599d8c-7f43-11ed-8abf-dac502259ad0.jpg

认识倒排索引

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

ac706026-7f43-11ed-8abf-dac502259ad0.jpg正排索引 VS 倒排索引

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

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

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

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

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

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

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

ac7faee6-7f43-11ed-8abf-dac502259ad0.jpg倒排索引

ElasticSearch 的倒排索引:」

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

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

    • 优点:节省存储空间
    • 缺点:字段无法被搜索

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

分布式架构原理

「分片 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
}
ac97105e-7f43-11ed-8abf-dac502259ad0.jpg分布式架构原理

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

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

「集群中某节点宕机:」

  • 主节点宕机:会重新选举一个节点为 主节点。
  • 从节点宕机:由 主节点,将宕机节点上的 主分片身份转移到其他机器上的 备份分片上。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

写入数据的工作原理

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

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

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

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

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

acac3790-7f43-11ed-8abf-dac502259ad0.jpg写入数据的工作原理

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

写数据底层原理

ac599d8c-7f43-11ed-8abf-dac502259ad0.jpg写数据底层原理

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

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

  • 将数据写入内存
  • 将这操作写入 translog 文件中
  1. 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 将文档返回给客户端。
ad016b34-7f43-11ed-8abf-dac502259ad0.jpg读取数据的工作原理

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

  • 读请求命中副分片时,可能会报告文档不存在。
  • 读请求命中主分片时,可能成功返回文档。

搜索工作原理

「搜索数据过程:」

  1. 客户端选择一个 Node 发送请求,那么这个 Node 就称为 「协调节点(Coorinating Node)」
  2. Node 协调节点将搜索请求转发到所有的 分片(shard):主分片 或 副分片,都可以。
  3. query 阶段」 :每个分片 shard 将自己的搜索结果(文档 ID)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
  4. fetch 阶段」 :由协调节点根据 文档 ID 去各个节点上拉取实际的文档数据。
ad107872-7f43-11ed-8abf-dac502259ad0.jpg搜索工作原理

举个栗子: 有 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


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6852

    浏览量

    88771
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14299

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

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Elasticsearch 再次开源

    Elasticsearch 和 Kibana 又可以被称为开源了。很难表达这句话让我有多高兴。我激动得简直要跳起来了。我们 Elastic 的所有人都是如此。开源是我的 DNA。这也是Elastic的DNA。能够再次将 Elasticsearch 称为开源,我感到非常高兴
    的头像 发表于 11-13 12:14 36次阅读
    <b class='flag-5'>Elasticsearch</b> 再次开源

    【书籍评测活动NO.50】亲历芯片产线,轻松图解芯片制造,揭秘芯片工厂的秘密

    产业运营等)感兴趣的IC从业者和大众读者。 相信阅读过《芯路》《半导体简史》《图解入门半导体》等书的读者定也会对本书倍感兴趣。 图书简介 本书是本关于半导体芯片制造全景的入门书。 本书以
    发表于 11-04 15:38

    搞懂Linux进程的睡眠和唤醒

    、常见的进程状态与理解 在操作系统内部,有专门用来管理进程的结构体,叫做struct task_struct,也称作进程控制块(PCB),主要包含描述进程的相关信息,如进程用户、进程状态、进程
    发表于 11-04 15:15

    搞懂用ZPC轻松拿捏数据上云

    ZPC是ZLG全新研发的显控体机。开源AWTK,版权无忧!AWFlow流图编程,开发很简单!多种通信协议,设备互联超便捷!更有ZWS,数据上云很轻松!本文将介绍ZPC轻松拿捏数据上云。ZPC简介
    的头像 发表于 09-05 08:05 253次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b>用ZPC<b class='flag-5'>轻松</b>拿捏数据上云

    PCB阻抗设计12问,轻松带你搞懂阻抗!

    阻抗,工程师们都接触过,但能把阻抗说清楚的工程师少之又少。阻抗看似简单,实则难以言表。 下面我们用快问快答的方式,轻松帮你搞懂阻抗! 01 问:什么是阻抗? 答:在有电阻、电感和电容的电路里
    发表于 06-11 10:21

    搞懂DDR内存原理

    内存(DRAM-RandomAccessMemory)作为当代数字系统最主要的核心部件之,从各种终端设备到核心层数据处理和存储设备,从各种消费类电子设备到社会各行业专用设备,是各种级别的CPU进行
    的头像 发表于 05-09 17:09 2116次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b>DDR内存原理

    Rust编写的首个Postgres基础Elasticsearch开源替代品问世

    ,Firebase 开源替代 Supabase,AirTable 开源替代 NocoDB,等等等等,现在又多了 ElasticSearch 开源替代 —— ParadeDB。
    的头像 发表于 02-22 11:34 753次阅读
    Rust编写的首个Postgres基础<b class='flag-5'>Elasticsearch</b>开源替代品问世

    言APP上线数字分身功能

    言APP近日上线了项令人兴奋的新功能——数字分身。这功能允许用户轻松创建自己的个性化虚拟形象,为用户带来全新的互动体验。
    的头像 发表于 02-04 10:32 1111次阅读

    PCB阻抗设计12问,轻松带你搞懂阻抗!

    阻抗,工程师们都接触过,但能把阻抗说清楚的工程师少之又少。阻抗看似简单,实则难以言表。下面我们用快问快答的方式,轻松帮你搞懂阻抗!01问:什么是阻抗?答:在有电阻、电感和电容的电路里,对交流电所起
    的头像 发表于 01-05 10:44 1839次阅读
    PCB阻抗设计12问,<b class='flag-5'>轻松</b>带你<b class='flag-5'>搞懂</b>阻抗!

    【华秋干货铺】PCB阻抗设计12问,轻松带你搞懂阻抗

    阻抗,工程师们都接触过,但能把阻抗说清楚的工程师少之又少。阻抗看似简单,实则难以言表。 下面我们用快问快答的方式,轻松帮你搞懂阻抗! 0 1 问:什么是阻抗? 答:在有电阻、电感和电容的电路里
    的头像 发表于 01-05 08:45 949次阅读
    【华秋干货铺】PCB阻抗设计12问,<b class='flag-5'>轻松</b>带你<b class='flag-5'>搞懂</b>阻抗

    PCB阻抗设计12问,轻松带你搞懂阻抗!

    阻抗,工程师们都接触过,但能把阻抗说清楚的工程师少之又少。阻抗看似简单,实则难以言表。   下面我们用快问快答的方式,轻松帮你搞懂阻抗! 0 1    问:什么是阻抗?   答:在有电阻、电感和电容
    的头像 发表于 01-03 08:40 1117次阅读
    PCB阻抗设计12问,<b class='flag-5'>轻松</b>带你<b class='flag-5'>搞懂</b>阻抗!

    你还是分不清多进程和多线程吗?搞懂

    你还是分不清多进程和多线程吗?搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和使用场景略有不同。 1. 多进程: 多进程指的是在操作系统
    的头像 发表于 12-19 16:07 529次阅读

    张图搞懂为什么去耦电容要好几种容值?

    张图搞懂为什么去耦电容要好几种容值?
    的头像 发表于 11-27 15:47 487次阅读
    <b class='flag-5'>一</b>张图<b class='flag-5'>搞懂</b>为什么去耦电容要好几种容值?

    了解这些就可以搞懂 IGBT

    了解这些就可以搞懂 IGBT
    的头像 发表于 11-24 15:47 2922次阅读
    了解这些就可以<b class='flag-5'>搞懂</b> IGBT

    搞懂什么是电容器的等效串联电阻

    搞懂什么是电容器的等效串联电阻
    的头像 发表于 11-23 16:14 1826次阅读
    <b class='flag-5'>搞懂</b>什么是电容器的等效串联电阻