es性能强悍的推演过程

前言

  es底层复用的Lucene的能力,Lucene在以前的文章中有所讲解,感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=169771769916777224433628&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-125474873-null-null.nonecase&utm_term=Lucene&spm=1018.2226.3001.4450
本文主要讲解es的数据存储过程。
  Lucene中, 倒排索引一旦被创建就不可改变, 要添加或修改文档, 就需要重建整个倒排索引, 这就对一个index所能包含的数据量, 或index可以被更新的频率造成了很大的限制.

  为了在保持不变性的前提下更新倒排索引,Lucene引入了一种新的方法:使用更多的索引。通过增加新的补充索引来反映最新的修改,而不是直接重写整个倒排索引。这样可以确保从最早的版本开始,每个倒排索引都可以被查询到,并在查询完成后将结果进行合并。下面我们通过es的推演过程,来分析es是怎么能够实现当前的这种查询速度和稳定性的。

es索引的推演过程

  我们知道,数据最终是要保存到磁盘上的,所以,最简单的存储过程,就是来一条数据,就同步到磁盘上,如下图
在这里插入图片描述
  但是大家应该知道,磁盘操作是很耗时的,磁盘的随机存取的速度和内存相比,至少要大3至4个数量级,所以这种方式是不可取的。所以如果想达到es的近实时搜索的效果,那么一定是缩小数据同步到磁盘的时间,或者说缩小数据从写入到可提供搜索的时间。
  因为每来一条就同步至磁盘性能太差,所以很容易想到能不能在内存中开辟一个缓冲区,等攒了一些数据之后,批量同步至磁盘
在这里插入图片描述
  这样虽然减少了磁盘IO的频率,但是因为文档内容同步到file中才能被索引到,如果一直等到buffer满了之后再同步到磁盘,就会导致time delay严重。
  为了解决上面的问题,我们可以OS自己的能力
在这里插入图片描述
  page cache是OS提供的能力,即虽然数据还在内存中,但是可以认为就是正常的file,已经可以对外提供搜索能力了。这样,就可以把buffer中的文档数据相对频繁的同步给OS page cache,虽然频繁,但是毕竟是内存之间的操作,要比同步至磁盘快得多。es默认的buffer同步OS page cache的频率是1qps,OS page cache中的内容毕竟还是在内存中的,并不安全,最终还是要同步至磁盘中。es默认30min同步一次磁盘。
  大家从上面图示来看,感觉已经很完美了,降低了进实时搜索的time delay。是的,这个模型事实上是已经可以提供es的读写能力了。但是,内存中的数据掉电是会丢失的,现在OS page cache同步到磁盘是30min一次,那么如果快到30min的时候,突然停电了,那么OS page cache中的数据就会全部丢失掉,未同步到磁盘的数据就再也找不到了。为了尽量避免前面提到的问题,es又增加了translog。
在这里插入图片描述
  文档数据写到buffer的同时,会写到translog中,translog也是file,最终会同步至磁盘,从上图可以看到,translog每5s同步一次磁盘,这样如果OS page cache中的数据还未执行同步至磁盘的动作就停电了,怎么办呢?这时候,因为translog的绝大多数数据已经同步到磁盘了,所以在重启的时候可以通过translog重做最近的数据,当然,因为translog每5s同步一次,所以可能会丢失几秒的数据,如果还要降低丢失几秒数据的概率,可以引入多副本。
  上面肯定会有人有疑问:既然translog也要同步磁盘,那么直接让OS page cache同步磁盘的时间间隔由30min降到5s不就可以了吗?为什么还要多此一举搞出个log。原因就是translog是append-only的方式同步至磁盘的,这种追加的方式减少了磁盘的寻道过程,速度还是相当惊人的(有些资料显示追加方式写磁盘和内存操作的速度基本在同一个数量级,kafka就是通过append-only方式保存消息的,但是kafka的速度之快,大家是公认的)。

es存储过程

  1. 索引数据在写入内存buffer(缓冲区)的同时, 也写入到translog日志文件中;
  2. 每隔refresh_interval的时间就执行一次refresh:
    2.1 将buffer中的数据作为新的 index segment, 刷到文件系统的cache(缓存)中;
    2.2 index segment一旦被写入文件cache(缓存), 就立即打开该segment供搜索使用;
  3. 清空当前内存buffer(缓冲区), 等待接收新的文档;
  4. 重复①~③, translog文件中的数据不断增加;
  5. 每隔一定时间(默认30分钟), 或者当translog文件达到一定大小时, 发生flush操作, 并执行一次全量提交:
    5.1 将此时内存buffer(缓冲区)中的所有数据写入一个新的segment, 并commit到文件系统的cache中;
    5.2 打开这个新的segment, 供搜索使用;
    5.3 清空当前的内存buffer(缓冲区);
    5.4 将translog文件中的所有segment通过fsync强制刷到磁盘上;
    5.5 将此次写入磁盘的所有segment记录到commit point中, 并写入磁盘;
    5.6 删除当前translog, 创建新的translog接收下一波创建请求.

写入过程优化

存在的问题

  从上述的近实时搜索特性中,我们可以了解到,Elasticsearch(ES)默认每秒都会生成一个新的segment文件,而在每次进行搜索查询时,它需要遍历所有的这些segment文件,这无疑会对搜索性能产生不小的影响。

  为了解决这一问题,ES会对这些零散的segment文件进行合并(merge)操作,这种操作旨在将索引中大量的、体积较小的segment文件整合为数量更少、体积更大的segment文件。这种方法大大减少了搜索时需要处理的文件数量,从而显著提高了搜索效率。

  负责进行这个合并过程的是独立的merge线程,它的工作不会影响到新的segment文件的生成。同时,在进行segment文件的合并过程中,被标记为删除的文档也会被彻底地从物理存储中删除。

merge操作的流程

  1. 准备阶段:Elasticsearch会定期检查索引中的segment文件。当检测到有太多的segment文件(默认情况下,当segment数量超过10%时),它将开始为merge做准备。
  2. 选出待合并的segment:准备阶段完成后,Elasticsearch会选出那些需要合并的segment。一般来说,这些segment都是较小的,且在最近的merge窗口内创建的。
  3. 创建新的segment:在选出待合并的segment后,Elasticsearch会为新的segment分配一个新的、唯一的ID。这个新的segment会包含所有待合并的segment中的数据。
  4. 合并数据:接下来,Elasticsearch会从每个待合并的segment中读取数据,然后将这些数据写入新的segment。在这个过程中,Elasticsearch会处理任何可能出现的冲突,例如两个segment中都有相同的文档,但文档的状态不同。
  5. 标记已合并的segment:当一个新的segment创建完成后,Elasticsearch会将所有待合并的segment标记为已合并,以便下次合并时不再考虑这些segment。
  6. 更新索引结构:最后,Elasticsearch会更新其索引结构,将新的segment添加到索引中,并从索引中移除已合并的segment。

  需要注意的是,虽然merge操作可以提高搜索性能,但也会占用大量的CPU和I/O资源。因此,Elasticsearch通常会在后台、低流量时段执行merge操作,以最小化对系统性能的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/171452.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟接口数据之使用Fetch方法实现

文章目录 前言一、package.json配置mock执行脚本二、封装接口,区分走ajax还是fetch三、创建mock目录,及相关接口文件四、定义接口五、使用mock数据使用模拟数据优化fetch返回数据 六、不使用模拟数据七、对比其他需要使用依赖相关配置如有启发&#xff0…

Linux 性能调优之硬件资源监控

写在前面 考试整理相关笔记博文内容涉及 Linux 硬件资源监控常见的命名介绍,涉及硬件基本信息查看查看硬件错误信息查看虚拟环境和云环境资源理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生&#x…

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种,以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装:在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到,自己搜索安装吧, 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有(public)成员私有(private)成员受保护(protected)成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…

集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

下载地址: https://githubfast.com/anerg2046/sns_auth 安装方式建议使用composer进行安装 如果linux执行composer不方便的话,可以在本地新建个文件夹,然后执行上面的composer命令,把代码sdk和composer文件一起上传到项目适当位…

Spring事务之AOP导致事务失效问题

情况说明 首先开启了AOP,并且同时开启了事务。下面这个TransactionAspect就是一个简单的AOP切面,有一个Around通知。 Aspect Component public class TransactionAspect {Pointcut("execution(* com.qhyu.cloud.datasource.service.TransactionSe…

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…

Vue知识点总结

路由 使用 参数传递的两种方式 路由的params传参 路由的query传参 组件 概念 局部功能代码&#xff08;html、css js&#xff09;和资源(mp3 mp4 ttf .zip)的集合 非单文件组件 一个文件对应多个组件&#xff0c;以html结尾 使用 <xuexiao>即可使用 注意&#xf…

nacos适配达梦数据库

一、下载源码 源码我直接下载gitee上nacos2.2.3的&#xff0c;具体链接&#xff1a;https://gitee.com/mirrors/Nacos/tree/2.2.3&#xff0c;具体如下图&#xff1a; 二、集成达梦数据库驱动 解压源码包&#xff0c;用idea打开源码&#xff0c;等idea和maven编译完成&#xff…

STM32--时钟树

一、什么是时钟&#xff1f; 时钟是单片机的脉搏&#xff0c;是系统工作的同步节拍。单片机上至CPU&#xff0c;下至总线外设&#xff0c;它们工作时序的配合&#xff0c;都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树&#xff1f; S…

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候&#xff0c;担心不小心修改了内容&#xff0c;可以给Excel设置以“只读方式”打开&#xff0c;这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”&#xff0c;一起来看看吧&#xff01; “只读方式” 1&#xff1a; 打开Excel表…