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操作,以最小化对系统性能的影响。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4、创建第一个鸿蒙应用

一、创建项目 此处以空模板为例来创建一个鸿蒙应用。在创建项目前请保持网页的畅通。 1、在欢迎页面点击“Create Project”。 2、左侧默认为“Application”,在“Template Market”中选择空模板(Empty Ability),点击“Next” 3…

【优化版】DOSBox及常用汇编工具的详细安装教程

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、图解数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. dosbox的介绍、下载和安装1.1 dosbos简介1.2 dosbox的下载1.2.1 方式一&a…

APP备案获取安卓app证书公钥获取方法和签名MD5值

前言 在开发和发布安卓应用程序时,了解应用程序证书的公钥和签名MD5值是很重要的。这些信息对于应用程序的安全性和合规性至关重要。现在又因为今年开始APP必须接入备案才能在国内各大应用市场上架,所以获取这两个值成了所有开发者的必经之路。本文将介…

关于论文图表目录和交叉引用的使用小结

目录 1 题注用法 2 交叉引用 最近在写论文,遇到不少Word使用的问题(错误!文档中没有指定样式的文字。) 网上其实也有很多解决方案但我当时还是折腾了几个小时才整出来图目录,以下是针对我目前使用的感觉简明很多的方法。 1 题注用法 1) 假…

4.2每日一题(求多元函数在某一点的微分)

1、分别求x和y的偏导,再相加即可 2、因为多元函数的表达式不方便求偏导,所以可以使用先代后求法: (1)对x偏导:把y0代入,很容易求出对x偏导的结果 (2)对y偏导&#xff1a…

《QT从基础到进阶·二十五》界面假死处理

假如有这样一种情况,我们在主线程写了一个死循环,当程序运行到主线程的死循环代码后界面便卡死点了没有反应,这里提供几种方法处理界面假死的情况,保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。…

nmap原理与使用

kali的命令行中可以直接使用 nmap 命令,打开一个「终端」,输入 nmap 后回车,可以看到 nmap 的版本,证明 nmap 可用。 一、端口扫描 扫描主机的「开放端口」,在nmap后面直接跟主机IP(默认扫描1000个端口&am…

【C++】类和对象(1)--初识

目录 一 类的引入 二 类的定义 1 类的两种定义方式: (1) 声明和定义全部放在类体中 (2) 类声明放在.h文件中,成员函数定义放在.cpp文件中 2 成员变量命名规则的建议 三 类的访问限定符及封装 1 访问限定符 2 封装 四 类的作用域 五 类的实例化 六 类对象…

物联网AI MicroPython学习之语法 bluetooth蓝牙

学物联网,来万物简单IoT物联网!! bluetooth 介绍 该模块为板上的蓝牙控制器提供了相关接口。目前支持低功耗蓝牙 (BLE)的Central(中央), Peripheral(外设), Broadcaster(广播者&…

仿京东拼多多商品分类页-(RecyclerView悬浮头部实现、xml绘制ItemDecoration)

文章目录 前言效果图思路方式一:通过xml布局来实现方式二:通过ItemDecoration方式来实现 实现步骤1、数据项格式2、左侧列表适配器3、右侧列表适配器4、头部及悬浮头部绘制4.1头部偏移高度为要绘制xml布局的高度--getItemOffsets()4.2 绘制固定头部--onD…

计算机提示“找不到emp.dll,无法继续执行代码”,这几种解决办法都可以解决

在计算机使用过程中,我们可能会遇到各种问题,其中之一就是系统文件丢失。emp.dll文件是Windows操作系统中的一个重要组件,如果丢失或损坏,可能会导致系统运行不稳定甚至无法正常启动。本文将详细介绍emp.dll文件丢失恢复的4个方法…

eclipse安装lombok插件

lombok插件下载:Download 下载完成,lombok.jar放到eclipse根目录,双击jar运行 运行界面,点击Install安装。 安装完成,重启IDE,rebuild 项目。 rebuild 项目

C++——gcc、clang和cmake以及make

文章目录 1. CMake和make1.1 生成内容区别1.2 CMakeLists.txt和Makefile内容比较2. clang, gcc和make2.1 基本概念2.2 改进历史(gcc,make,cmake,Ninja)1. CMake和make 1.1 生成内容区别 环境CMake生成最终生成WindowsXXX.slnVisual Studio(MSBuild)处理.sln生成.exe可执行二进…

No195.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通

文章目录 函数式编程Lambda表达式Stream流创建流中间操作终结操作注意事项 Optional创建对象消费值获取值过滤判断数据转换 方法引用高级用法基本数据类型优化并行流 函数式编程 不关心具体的对象,只关心数据参数和 具体操作 Lambda表达式 格式: () -&…

Oracle用户密码修改为永不过期

1、查询密码有效时长 select * from dba_profiles where profileDEFAULT and resource_namePASSWORD_LIFE_TIME;没有修改的话 LIMIT 是 180 2、查看用户密码过期时间 select username,account_status,expiry_date,profile from dba_users;3、修改密码为永不过期 alter prof…

Flink SQL -- 反压

1、测试反压: 1、反压: 指的是下游消费数据的速度比上游产生数据的速度要小时会出现反压,下游导致上游的Task反压。 2、测试反压:使用的是DataGen CREATE TABLE words (word STRING ) WITH (connector datagen,rows-per-second…

SPSS时间序列分析:序列图

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

智能设备管理软件有什么用?如何让工厂设备维修管理更高效?

在当今这个数字化、智能化的时代,企业的生存与发展离不开高效、有序的管理。特别是在制造业中,设备报修与维修管理是关系到企业生产效益、安全和持续发展的关键环节。今天,我们就来聊聊如何通过智能化的设备管理软件,让工厂设备的…

高版本模拟器安装burp证书

一、下载burp证书,安装openssl http://burp自己找官网安装opensslWin32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com)二、查看模拟器端口并连接 adb devices openssl x509 -inform der -in cacert.der -out burp.pem openssl…