1、直接上架构图

2、前情提要

  • 底层 lucene :lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码

  • 倒排索引:在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。举个例子 :

3、分布式架构

  多台独立的机器上分别存在es进程,每个es进程中存在多个shard。shard分为primary和replica,replica是primary的从备份,每个primary的replica一般都分布在其他机器上,保证可用性。如果创建一个索引product_idx,那么该索引的数据就会保存在多个shard中。es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。如果某个非 master 节点宕机了。那么此节点上的 primary shard 不就没了。那好,master 会让 primary shard 对应的 replica shard(在其他机器上)切换为 primary shard。如果宕机的机器修复了,修复后的节点也不再是 primary shard,而是 replica shard。

4、es写数据

  • 客户端选择一个node节点发送请求过去,该node成为协调节点
  • 协调节点对document路由,找到应该写入的shard primary
    • shard写入内存buffer的同时写入translog

      • 写内存buffer后,每1s执行refresh(所以es是准实时的,有1s的延迟)操作将内存中的数据写入os cache中,写入后将该部分数据从内存buffer中删除,写入os cache中后,搜索引擎就可以查到了,然后os cache会写入segment file中,写入segment file同时就建立好了倒排索引
      • 写translog也是先写os cache,然后每过5s将os cache中的数据存入translog中(所以会存在最多5s的数据丢失)
        • 当translog大的一定程度或者每30分钟,会执行flush操作(第一步:将buffer中的数据刷入os cache中,清空buffer。第二步:将一个commit point 写入磁盘,里面包含了所有的segment file,同时将os cache中的数据都fsync到磁盘中 。第三步:清空translog日志,重启一个translog日志)
  • shard primary写完之后会同步到自己所有的replica
  • 等primary和replica都写完,发送响应结果给客户端

关于写的总结

  • 准实时:有1s的延迟,因为shard写入内存buffer然后buffer默认每隔1s才刷入os cache中
  • translog的作用 :在执行flush操作之前,数据都在buffer或者os cache中,此时如果宕机数据丢失。那么translog的作用就是当出现宕机的情况,重启时会自动读取translog日志,恢复数据
  • 5s数据丢失 : shard写入os cache 再写入translog,每隔5s执行一次,那么就会出现5s的数据丢失,当然你可以配置每次修改都写translog,但是性能较低 

5、es读数据

  • 写入数据的时候会生成全局唯一doc id
  • 那么读取数据的时候,发送请求到一个node,成为协调节点
  • 协调节点对doc id进行哈希路由,转发到对应的node,然后通过随机轮询算法,在primary和replica中选择一个,让读请求负载均衡
  • 接收请求的node将数据返回给协调节点
  • 协调节点返回document给客户端
  • 写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

6、es搜索数据全过程

  • 客户发送查询请求到一个node,成为协调节点
  • 协调节点将请求转发到所有的shard对应的primary或者replica都可以
  • 每个shard返回匹配的doc id给协调节点
  • 协调节点通过这些doc id去查询具体的document
  • 再进行筛选返回给客户端

7、删除数据

  • 磁盘存在.del文件,将数据写入.del文件中标识数据已过期,那么查询的时候发现数据再.del文件中就不会返回
  • 如果是更新操作,将原来的doc标识为deleted,然后写入一条新数据

  那么什么时候进行物理删除呢?

  • buffer 每 refresh 一次,就会产生一个 segment file,所以默认情况下是 1 秒钟一个 segment file,这样下来 segment file 会越来越多,此时会定期执行 merge。每次 merge 的时候,会将多个segment file  合并成一个,同时这里会将标识为deleted 的 doc 给物理删除掉,然后将新的 segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的 segment file。

  

ES分布式架构及底层原理相关推荐

  1. es分布式架构和原理分析

    es的分布式架构 前言 这篇初识ElasticSearch文章中,说明了es的集群的核心概念,回顾一下. 关于节点: 一个运行中的 es实例称为一个节点,而集群是由一个或者多个拥有相同cluster. ...

  2. 分布式事务之底层原理揭秘

    , hi 大家好,今天分享一这篇文章,让大家彻底了解分布式原理,这个是后台开发必须掌握技能. 刚性事务 柔性事务 本地事务 分布式事务 单阶段原子提交协议 两阶段提交协议 定义 原理 性能 恢复 缺陷 ...

  3. 分布式之系统底层原理

    作者:allanpan,腾讯 IEG 高级后台工程师 导言 分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持.本文从分布式事务这个概念切入,尝试对分布式 ...

  4. 1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  5. 1000道最新大厂高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  6. 最新1000道高频Java面试题,包含25个技术栈等面试攻略(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  7. mysql主从数据一致性问题及MHA和MGR的架构及底层原理

    MySQL的传统主从复制机制 MySQL传统的高可用解决方案是通过binlog复制来搭建主从或一主多从的数据库集群.主从之间的复制模式支持异步模式(async replication)和半同步模式(s ...

  8. es 创建索引_从一道面试题来看ES的分布式架构原理

    概述 在搜索这块,lucene 是最流行的搜索库.几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜 ...

  9. Elasticsearch 分布式架构原理

    前言 前面介绍了很多ES使用过程中的具体实战知识点,本文主要是谈谈ES分布式架构原理. 一.Elasticsearch特点 elasticsearch是近实时的分布式搜索分析引擎,底层实现基于Luce ...

  10. 连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

    在分布式系统中,一次业务处理可能需要多个应用来实现,比如用户发送一次下单请求,就涉及到订单系统创建订单,库存系统减库存,而对于一次下单,订单创建与减库存应该是要同时成功或者同时失效,但在分布式系统中, ...

最新文章

  1. Revit二次开发示例:DeleteDimensions
  2. jQuery获取元素内容
  3. boost::posix_time模块实现本地时间和 UTC 之间的转换的测试程序
  4. koding.com 使用putty
  5. 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
  6. 测试抽象类和模板方法模式
  7. leetcode336. 回文对(字典树)
  8. java list top_Java程序员最常犯的错误盘点之Top 10
  9. 双十一还没来,快递公司已经宣布涨价
  10. wifi不断重连报错:eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON解决
  11. 涨姿势,原来程序员喝酒都是这样的呀
  12. msdev.exe 应用程序错误的解决方法
  13. jvisualvm oracle,jvisualvm 中visual gc 的配置
  14. ati自定义分辨率_在Windows 10上设置自定义分辨率 | MOS86
  15. Linux自学:常用删除命令(rm)使用方法
  16. FIT2CLOUD入选2018 Gartner Cool Vendor
  17. 数据统计分析(SPSS)【6】
  18. 2021-11-13 变电站综合自动化 二次系统安全
  19. 怎样将vob格式转换成avi高清视频格式
  20. python 实现excel单元格合并和导出

热门文章

  1. html audio解决浏览器无法播放问题
  2. 拼多多如何拉到足够的人去砍价,砍成一台iPhone12需要多少人?
  3. 玩转 ESP32 + Arduino (十九) SIM800L上传数据到OneNet(新版Mqtts)
  4. SIM800系列模块GSM/GPRS建立TCP连接到远端服务器过程——新浪博客迁移
  5. jQuery视频展示效果实例
  6. 暴雪总裁总结游戏十条经验
  7. Java中的方法的重载
  8. 天邑ty1208z海思3798刷版本_[乐天固件]魔百和M301H-当贝版卡刷包-海思3798M
  9. jdk8下载与安装教程
  10. 机械公差与配合 常见问题