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.rhkb.cn/news/192420.html

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

相关文章

2个器件,做1个恒流源

在项目中经常要用到恒流源,查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源,这种设计思路可以扩展到其他类型的电源芯片上,如开关电源及其他类型的线性电源,关键点在于基准电压VREF的使用…

若依Linux与Docker集群部署

若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…

MDM如何配置数据审批功能

MDM基础数据平台是进行清洗和治理企业的主数据,使企业的主数据具有唯一性、准确性、一致性、及时性,通过主数据数据清洗功能将错误数据和重复数据进行清洗,从而保证企业数据能够做到以上那几点,然后再分发至下游系统,使…

苹果手机照片如何导入电脑?无损快速的传输办法分享!

前些天小编的朋友联系到我,说是自己苹果手机里面的照片太多,有好几千张,不知道该怎么快而无损地传到电脑。我想遇到这种情况的不止是小编的朋友,生活中遇到手机照片导入电脑的同学不在少数。不管是苹果手机还是安卓手机&#xff0…

μC/OS-II---互斥信号量管理2(os_mutex.c)

目录 背景:优先级反转问题互斥信号量管理互斥信号量发出(释放)互斥信号量获取/无等待互斥信号量状态查询 背景:优先级反转问题 在高优先级任务等待低优先级任务释放资源时,第三个中等优先级任务抢占了低优先级任务。阻…

【postgresql】查看数据中表的信息

切换到postgresql数据库,各种不适应吧。 有个需求需要查询数据表的各种信息。 下面我们一起学习吧。 ●PostgreSQL: Documentation PostgreSQL: Documentation ●pg_namespace 存储名字空间。名字空间是 SQL 模式下层的结构:每个名字空间有独立的关系…

FPGA时序约束与分析-简单入门

FPGA时序约束与分析-简单入门 文章目录 FPGA时序约束与分析-简单入门1. 本课程概述2. 时序约束简介2.1 什么是时序约束2.2 合理的时序约束2.3 *基于Vivado的时序约束方法 3. 时序分析的基本概念3.1 时钟与时钟偏差3.2 建立时间和保持时间3.3 时序分析中路径、沿和关系的定义 4.…

V10chrony服务配置

Chrony简介 Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Ch…

字符流的讲解 以及 Reader和Writer的用法

文章目录 ❤专栏导读❤字符流❤Reader类的操作 ❤Writer类操作❤Writer类的构造方法 ❤专栏导读 🚀《多线程》 🚀《数据结构剖析》 🚀《JavaSE语法》 在Java标准库中,提供的读写文件的流对象有很多很多的类,但是可以将…

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类,一类是导引型传输媒体,另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输:串行传输是指数据是一个比特依次发送的,因此在发送端…

家居行业中跨区域EDI应用的优化策略

提到家居行业的国际知名企业,你会想到哪些?宜家IKEA还是家得宝The Home Depot?这些稳居家居行业第一梯队的企业都有哪些共同之处? 无论是北美市场还是欧洲市场,这些企业都有一个共同点:他们采用EDI&#x…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽,大家好,我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题,在网上找了一大堆的解决方案,最后还是无功而返,那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大,静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因,选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时,如果CDN节…

给在读博士的建议

早上起床第一件事,瞄了眼知乎! 发现现在的手机真的很智能,也许是聊天的时候不经意间提了一句,早上就推荐了自己想看到的东西! 分享给大家! 有哪些给在读博士的建议? 如何通过一句话判断一个博士…

LeetCode(12)时间插入、删除和获取随机元素【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 380. O(1) 时间插入、删除和获取随机元素 1.题目 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回…

Karmada更高效地实现故障转移

随着云原生技术的发展,其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中,随着 Kubernetes 集群规模的不断扩大,也带来了许多管理挑战,例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问…

【QT系列教程】之二创建项目和helloworld案例

文章目录 一、QT创建项目1.1、创建项目1.2、选择创建项目属性1.3、选择路径和项目名称1.4、选择构建项目类型1.5、布局方式1.6、翻译文件,根据自己需求选择1.7、选择套件1.8、项目管理,自行配置1.9、配置完成,系统自动更新配置 二、QT界面介绍…

istio学习笔记-安装

Istioldie 1.18 / 安装指南 基于Kubernetes的Istio的微服务架构需要安装以下组件: Istio控制平面组件:包括Istio-Pilot、Istio-Policy、Istio-Telemetry等。这些组件负责微服务的管理和配置,如流量管理、策略执行、遥测数据收集等。数据平面…

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次,最大化你的得分: 从 nums 中选择一个元素 m 。将选中…

安装 Lua 的 HTTP 库

首先,你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令: luarocks install http然后,你可以使用以下代码来爬取网页内容: local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…