商务服务
ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?底层的 Lucene 介绍一下呗?倒排索引了解吗?
2024-10-31 19:59

ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?底层的 Lucene 介绍一下呗?倒排索引了解吗?

ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?底层的 Lucene 介绍一下呗?倒排索引了解吗?

问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理,因为用 es 无非就是写入数据,搜索数据。你要是不明白你发起一个写入和搜索请求的时候,es 在干什么,那你真的是......

对 es 基本就是个黑盒,你还能干啥?你唯一能干的就是用 es 的 api 读写数据了。要是出点什么问题,你啥都不知道,那还能指望你什么呢?

  • 客户端选择一个 node 发送请求过去,这个 node 就是  (协调节点)。
  •  对 document 进行路由,将请求转发给对应的 node(有 primary shard)。
  • 实际的 node 上的  处理请求,然后将数据同步到  。
  •  如果发现  和所有  都搞定之后,就返回响应结果给客户端。
  • es-write

    可以通过  来查询,会根据  进行 hash,判断出来当时把  分配到了哪个 shard 上面去,从那个 shard 去查询。

  • 客户端发送请求到任意一个 node,成为  。
  •  对  进行哈希路由,将请求转发到对应的 node,此时会使用  随机轮询算法,在  以及其所有 replica 中随机选择一个,让读请求负载均衡。
  • 接收请求的 node 返回 document 给  。
  •  返回 document 给客户端。
  • es 最强大的是做全文检索,就是比如你有三条数据:

    
    	

    你根据  关键词来搜索,将包含  的  给搜索出来。es 就会给你返回:java 真好玩儿啊,java 好难学啊。

  • 客户端发送请求到一个  。
  • 协调节点将搜索请求转发到所有的 shard 对应的  或  ,都可以
  • query phase:每个 shard 将自己的搜索结果(其实就是一些  )返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
  • fetch phase:接着由协调节点根据  去各个节点上拉取实际的  数据,最终返回给客户端。
  • 写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

    es-write-detail

    先写入内存 buffer,在 buffer 里的时候数据是搜索不到的;同时将数据写入 translog 日志文件。

    如果 buffer 快满了,或者到一定时间,就会将内存 buffer 数据  到一个新的  中,但是此时数据不是直接进入  磁盘文件,而是先进入  。这个过程就是  。

    每隔 1 秒钟,es 将 buffer 中的数据写入一个新的  ,每秒钟会产生一个新的磁盘文件  ,这个  中就存储最近 1 秒内 buffer 中写入的数据。

    但是如果 buffer 里面此时没有数据,那当然不会执行 refresh 操作,如果 buffer 里面有数据,默认 1 秒钟执行一次 refresh 操作,刷入一个新的 segment file 中。

    操作系统里面,磁盘文件其实都有一个东西,叫做  ,即操作系统缓存,就是说数据写入磁盘文件之前,会先进入  ,先进入操作系统级别的一个内存缓存中去。只要  中的数据被 refresh 操作刷入  中,这个数据就可以被搜索到了。

    为什么叫 es 是准实时的?  ,全称  。默认是每隔 1 秒 refresh 一次的,所以 es 是准实时的,因为写入的数据 1 秒之后才能被看到。可以通过 es 的  或者  ,手动执行一次 refresh 操作,就是手动将 buffer 中的数据刷入  中,让数据立马就可以被搜索到。只要数据被输入  中,buffer 就会被清空了,因为不需要保留 buffer 了,数据在 translog 里面已经持久化到磁盘去一份了。

    重复上面的步骤,新的数据不断进入 buffer 和 translog,不断将  数据写入一个又一个新的  中去,每次  完 buffer 清空,translog 保留。随着这个过程推进,translog 会变得越来越大。当 translog 达到一定长度的时候,就会触发  操作。

    commit 操作发生第一步,就是将 buffer 中现有数据  到  中去,清空 buffer。然后,将一个  写入磁盘文件,里面标识着这个  对应的所有  ,同时强行将  中目前所有的数据都  到磁盘文件中去。最后清空 现有 translog 日志文件,重启一个 translog,此时 commit 操作完成。

    这个 commit 操作叫做  。默认 30 分钟自动执行一次  ,但如果 translog 过大,也会触发  。flush 操作就对应着 commit 的全过程,我们可以通过 es api,手动执行 flush 操作,手动将 os cache 中的数据 fsync 强刷到磁盘上去。

    translog 日志文件的作用是什么?你执行 commit 操作之前,数据要么是停留在 buffer 中,要么是停留在 os cache 中,无论是 buffer 还是 os cache 都是内存,一旦这台机器死了,内存中的数据就全丢了。所以需要将数据对应的操作写入一个专门的日志文件  中,一旦此时机器宕机,再次重启的时候,es 会自动读取 translog 日志文件中的数据,恢复到内存 buffer 和 os cache 中去。

    translog 其实也是先写入 os cache 的,默认每隔 5 秒刷一次到磁盘中去,所以默认情况下,可能有 5 秒的数据会仅仅停留在 buffer 或者 translog 文件的 os cache 中,如果此时机器挂了,会丢失 5 秒钟的数据。但是这样性能比较好,最多丢 5 秒的数据。也可以将 translog 设置成每次写操作必须是直接  到磁盘,但是性能会差很多。

    实际上你在这里,如果面试官没有问你 es 丢数据的问题,你可以在这里给面试官炫一把,你说,其实 es 第一是准实时的,数据写入 1 秒后可以搜索到;可能会丢失数据的。有 5 秒的数据,停留在 buffer、translog os cache、segment file os cache 中,而不在磁盘上,此时如果宕机,会导致 5 秒的数据丢失。

    总结一下,数据先写入内存 buffer,然后每隔 1s,将数据 refresh 到 os cache,到了 os cache 数据就能被搜索到(所以我们才说 es 从写入到能被搜索到,中间有 1s 的延迟)。每隔 5s,将数据写入 translog 文件(这样如果机器宕机,内存数据全没,最多会有 5s 的数据丢失),translog 大到一定程度,或者默认每隔 30mins,会触发 commit 操作,将缓冲区的数据都 flush 到 segment file 磁盘文件中。

    数据写入 segment file 之后,同时就建立好了倒排索引。

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

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

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

    简单来说,lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码。我们用 Java 开发的时候,引入 lucene jar,然后基于 lucene 的 api 去开发就可以了。

    通过 lucene,我们可以将已有的数据建立索引,lucene 会在本地磁盘上面,给我们组织索引的数据结构。

    在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。

    那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。

    举个栗子。

    有以下文档:

    DocIdDoc 谷歌地图之父跳槽 Facebook 谷歌地图之父加盟 Facebook 谷歌地图创始人拉斯离开谷歌加盟 Facebook 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 谷歌地图之父拉斯加盟社交网站 Facebook

    对文档进行分词之后,得到以下倒排索引。

    WordIdWordDocIds 谷歌 地图 之父 1, 2, 4, 5 跳槽 1, 4 Facebook 6 加盟 2, 3, 5 7 创始人 8 拉斯 3, 5 9 离开 10 与

    另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。

    那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询  ,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。

        以上就是本篇文章【ES 写入数据的工作原理是什么啊?ES 查询数据的工作原理是什么啊?底层的 Lucene 介绍一下呗?倒排索引了解吗?】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/863.html 
         资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多   
    最新新闻
    云南网络营销软件哪个好?权威推荐助您快速选择
    在数字化时代,网络营销软件成为了许多企业实现营销目标的重要工具。然而,市面上网络营销软件琳琅满目,选择一个适合自己的并不
    宫崎骏的时代结束了
    在《你想活出怎样的人生》之前,宫崎骏一直是著名的退休诈骗犯。七次退休又七次复出,年过八旬,创作欲还是旺盛到令人害怕。然而
    个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用
    个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用,个人大数据信用查询平台市面上还是比较多的
    小红书关键词热度查询!国风大潮下,品牌怎么玩出花样、玩出水平?
    国风,是当下年轻人钟爱的潮流。汉服穿搭、文物手办、国潮仿妆……频频出圈。“民族的就是世界的”,国风的影响力可谓深远,一说
    app推广接单发布平台哪个好?怎么领取任务赚钱?
    最近几年,随着互联网的快速发展,利用网络兼职的赚钱方式也呈现越来越火,非常受大众欢迎的趋势。而且其种类也非常多:微商、社
    【可打印】文学常识常考100题汇总,初中生练一练!(部编版初中语文)
    关注本公众号,私信发送数字:2493,领取电子打印版文学常识1、成语“万事俱备,只欠东风”是根据《三国演义》________ (战役)
    “迎旅发大会 游美丽望城”望城首届文旅短视频大赛,最高3万奖励等你来拿!
    湘江水浩浩奔腾,流淌沧桑巨变。铜官窑静穆肃然,在这里诉说着望城的厚重历史,流传着“君生我未生,我生君已老”凄美爱情故事;落日
    mysql导入大txt文件怎么打开_mysql怎么导入txt文件?
    有时候我们在使用mysql数据库的时候,想导入txt文本文档,要怎么操作呢?下面本篇文章就来给大家介绍一下方法
    寸头抖音短视频教程_人开始衰老的迹象是什么
    岁月不饶人,我才50出头,可是许多衰老迹象已经越来越明显,惹得中医闺蜜笑话这样的我。1、觉得右后背和肩膀疼,出现“五十肩”
    什么是网站页脚:以及最佳页脚设计示例
    主体内容外,网站还包括页眉和页脚,用于帮助访问者的特定目的。由于我们认为网站页脚设计同样重要,我们整理了10个最佳免费网站
    本企业新闻

    点击拨打: