我们如何优化 Elasticsearch Serverless 中的刷新成本

news2024/11/15 21:52:33

作者:来自 Elastic Francisco Fernández Castaño, Henning Andersen

最近,我们推出了 Elastic Cloud Serverless 产品,旨在提供在云中运行搜索工作负载的无缝体验。为了推出该产品,我们重新设计了 Elasticsearch,将存储与计算分离,数据存储在云 blob 存储中,提供几乎无限的存储和可扩展性。在这篇博文中,我们将深入探讨如何消除索引数量和对象存储调用数量之间的强关系,从而让我们能够同时改善用户体验并降低成本。

在深入研究所做的更改之前,首先必须了解 Elasticsearch 和 Lucene 之间的相互作用。

Elasticsearch 使用 Lucene(一个用 Java 编写的高性能开源库)进行全文索引和搜索。当文档被索引到 Elasticsearch 中时,Lucene 不会立即将其写入磁盘。相反,Lucene 会更新其内部内存数据结构。一旦积累了足够的数据或触发了刷新(refresh),这些文档就会被写入磁盘,从而创建一组新的不可变文件(在 Lucene 术语中称为段 - segemnts)。在将段写入磁盘之前,索引文档无法进行搜索。这就是为什么刷新是 Elasticsearch 中如此重要的概念的原因。你可能想知道,当文档保存在内存中直到触发刷新时,如何确保持久性。这是通过 Translog 实现的,它持久存储每个操作以保证数据持久性和在发生故障时恢复。

更多有关刷新的知识,请参考文章 “Elasticsearch:Elasticsearch 中的 refresh 和 flush 操作指南”。

现在我们知道了 Lucene 段是什么以及为什么 Elasticsearch 需要刷新,我们可以探索有状态 Elasticsearch 和 serverless Elasticsearch 之间的刷新行为有何不同。

有状态 Elasticsearch 中的刷新

在 Elasticsearch 中,索引被分为多个分片,每个分片由一个主分片和多个可能的副本分片组成。在有状态(stateful) Elasticsearch 中,当文档被索引时,它首先被路由到主分片,Lucene 在那里对其进行处理和索引。在主分片上进行索引后,文档被路由到副本分片,在那里由这些副本对其进行索引。

如前所述,需要刷新才能使这些索引文档可搜索。在有状态 Elasticsearch 中,刷新会将 Lucene 内存数据结构写入磁盘,而无需执行 fsync。刷新是定期安排的,每个节点在不同的时间执行它们。此过程将在每个节点上创建不同的 Lucene 段文件,所有文件都包含同一组文档。

Serverlss Elasticsearch 中的刷新

相比之下,无服务器(serverless) Elasticsearch 采用基于段的复制模型。在这种方法中,每个分片的一个节点负责处理文档索引并生成 Lucene 段。一旦启动刷新,这些段就会上传到 blob 存储中。随后,搜索节点会收到有关这些新的 Lucene 段的通知,它们可以直接从 blob 存储中读取这些段。

上图演示了无服务器 Elasticsearch 中的刷新工作原理:

  1. 索引节点(所有文档都已编入索引)接收刷新请求,Lucene 将内存中的数据结构写入磁盘,类似于有状态刷新的运行方式。
  2. 段文件作为单个文件上传到 blob 存储(称为无状态复合提交)。图中上传的是 S4。
  3. 将段文件上传到 blob 存储后,索引节点会向每个搜索节点发送一条消息,通知它们新的段文件,以便它们可以对新编入索引的文档执行搜索。
  4. 搜索节点在执行搜索时从 blob 存储中获取必要的数据。

此模型具有轻量级节点的优势,因为数据存储在 blob 存储中。与有状态 Elasticsearch 相比,这使得在节点之间扩展或重新分配工作负载更具成本效益,在有状态 Elasticsearch 中,数据必须传输到包含新分片的新节点。

值得考虑的一个方面是无服务器 Elasticsearch 中每次刷新相关的额外对象存储请求成本。每次刷新操作都会在对象存储中创建一个新对象,从而产生一个对象存储 PUT 请求,并产生相关成本。这导致索引数量与对象存储 PUT 请求数量之间存在线性关系。如果刷新次数足够多,对象存储成本可能会超过硬件本身的成本。为了解决这个问题,我们最初实施了刷新限制措施,以有效管理成本并缓解潜在的问题。这篇博文描述了这项工作的下一步,这使我们能够以更快的速度和可控的成本进行刷新。

刷新成本优化

如前所述,无服务器 Elasticsearch 架构提供了许多好处。但是,为了有效地管理刷新成本,我们做出了偶尔会影响用户体验的决定。其中一个决定是强制执行 15 秒的默认刷新间隔,这意味着在某些情况下,新索引的数据要等到 15 秒过去后才能搜索。尽管我们付出了努力,但还是出现了对象存储费用过高的情况,促使我们重新评估我们的方法。在本节中,我们将深入研究如何成功地将刷新操作与对象存储调用分离,以在不影响用户体验的情况下解决这些挑战。

在评估了各种解决方案(从在 NFS 等分布式文件系统中临时存储段到将段直接推送到搜索节点)后,我们决定采用一种依赖于将段数据从索引节点直接提供给搜索节点的方法。

索引节点现在不会让刷新立即将新的 Lucene 段上传到 blob 存储,而是从刷新中积累段,然后将它们作为单个 blob 上传。这使得索引节点能够以类似于 blob 存储的方式为搜索节点提供读取服务,延迟分段上传,直到积累足够的数据或经过预定的时间间隔。

此策略使我们能够完全控制上传到 blob 存储的 blob 的大小,使我们能够确定请求成本与硬件成本相比何时可以忽略不计。

批量复合提交

我们的目标是逐步实现这一增强功能,并确保与存储在 Blob 存储中的现有数据的向后兼容性。因此,我们选择在 Blob 存储中存储 Lucene 段时使用相同的文件格式。就上下文而言,Lucene 段包含多个文件,每个文件都充当不同的角色。为了简化上传过程并最大限度地减少 PUT 请求,我们引入了复合提交:单个 Blob 连续包含所有段文件,并附带元数据标头,其中包括复合提交中的文件目录。

从 blob 存储中检索复合提交时(例如在分片重新定位期间),我们的主要关注点通常放在复合提交标头(header)上。此标头至关重要,因为它包含及时填充内部数据结构所需的基本数据。考虑到这一点,我们意识到我们可以保留现有文件格式,但对其进行简化,以便每个 blob 可以按顺序逐个附加复合提交。我们将这种新文件格式称为批量复合提交。

由于每个复合提交的大小都存储在其标头中,因此检索批量复合提交中所有复合提交的标头非常简单;我们只需查找下一个条目即可按顺序读取每个标头。在处理旧格式的 blob 时,它们被视为单例批量复合提交。我们的文件格式的另一个关键方面是,一旦将每个 Lucene 段文件附加到批量复合提交中,就会为其保持固定偏移量。这确保了文件是从索引节点还是 blob 存储提供的一致性。当批量复合提交最终上传到 blob 存储时,它还可以避免在搜索节点上逐出缓存条目。

新的刷新生命周期

索引节点现在将从刷新中积累 Lucene 段,直到收集到足够的数据以将它们上传为单个 blob。让我们探索索引和搜索节点如何协调以确定从何处访问这些数据。

如上图所示,在无服务器 Elasticsearch 中优化的刷新过程中会发生以下步骤:

  1. 索引节点接收刷新请求,将一组新的 Lucene 段写入其本地磁盘,并将这些段添加到待处理的批量复合提交中以供最终上传。
  2. 索引节点将这些新段通知搜索节点,提供有关所涉及段及其位置(blob 存储或索引节点)的详细信息。
  3. 当搜索节点需要一个段来完成查询时,它会决定是从 blob 存储还是索引节点获取该段,并在本地缓存数据。

上图说明了在索引节点中积累了足够多的段或经过了指定的时间后,将数据上传到无服务器 Elasticsearch 中的 Blob 存储的过程。

  1. 刷新会将新段添加到分批复合提交中,并且累积的数据达到 16 MB,或者自上次刷新以来已经过了一段时间,从此时起,新段将累积到新的分批复合提交中。
  2. 索引节点开始将累积的段作为单个 Blob 上传到对象存储。
  3. 索引节点将最新上传到对象存储的段通知搜索节点副本(search node replicas),指示它们从 Blob 存储中获取这些段的数据。
  4. 如果搜索需要本地未缓存的数据,它将从 Blob 存储中检索必要的信息,而任何先前从索引节点获取的数据即使在上传后仍然有效。

考虑和权衡

所选方法模糊了存储和计算之间的明确区分,要求索引节点处理存储请求,直到 Lucene 段最终上传到 blob 存储。但是,这些存储请求的开销很小,我们没有观察到对索引吞吐量的影响。

我们会注意到,我们会保留 translog 条目,直到相应的数据已上传到 blob 存储,因此该方法保持了现有的数据安全保障。崩溃后的恢复时间可能会稍长一些,但我们认为这是一个可以接受的权衡。

结论

这篇博文探讨了我们向更云原生方法的过渡,强调了它的诸多好处以及关键的成本考虑。我们从一个模型中追溯了我们的演变过程,在这个模型中,每个新的 Lucene 段都会在对象存储中生成一个不同的对象。与有状态的 Elasticsearch 相比,这导致特定无服务器工作负载的成本和用户体验面临挑战。批量对象存储上传使我们能够最大限度地减少对象存储请求的数量,并提高无服务器产品的成本效率。

准备好亲自尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训何时开课!

原文:Elasticsearch refresh: How we optimized refreshes in Serverless — Search Labs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解下 Markdown 的原理

前面讲了 Markdown 的基本语法,常见的 Markdown 编辑器,在继续讲解其他知识之前,有必要稍微深入了解一下 Markdown 与 HTML 的关系。 ‍ ‍ HTML 简介 什么是 HTML?其实它也是标记语言的一种,但是比 Markdown 更重…

Java面试题--JVM大厂篇之深入分析Parallel GC:从原理到优化

目录 引言: 正文: 1. Parallel GC原理解析 2. Parallel GC关键参数配置 3. 常见调优场景与技巧 4. 监控与日志分析 结束语: 引言: 在Java应用程序中,垃圾回收(Garbage Collection, GC)扮演着至关重要的角色。对…

【学术会议征稿】第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024) 2024 3rd International Conference on Image Processing, Computer Vision and Machine Learning 重要信息 大会官网:参会投稿/了解会议详情 大会时间:2024年11月22日-24日 大会地…

大米cms支付逻辑漏洞

1.打开环境 注册账户 随机选择一个产品 修改数据

什么是折叠幼儿床?该如何认证?

​折叠幼儿床具有如下特征: 轻巧便携 用于睡眠的幼儿床,不使用时会折叠 有幼儿护栏,且必须带底板(不包括没有地板的婴儿围栏) 图片 亚马逊政策规定,通过亚马逊网站销售的折叠幼儿床必须符合特定标准的测…

视频转文字在线提取怎么弄?5款软件帮你解决

三伏天炎炎,阳光炽热,视频内容分享正当时。然而,在海量视频信息中快速提取关键信息却成了难题。试想,如果能一键将视频中的精彩讲解或会议要点转换成文字,岂不省时又高效? 那么问题来了,面对市…

项目实战--不推荐使用@Autowired实现注入

不推荐使用Autowired实现字段注入 一、前言二、字段注入2.1 字段注入的使用2.2 字段注入的弊端2.2.1 与Spring的IOC机制紧密耦合2.2.2 无法使用final修饰符2.2.3 隐藏依赖性2.2.4 无法对注入的属性进行安全检查2.2.5 掩饰单一职责的设计思想 三、设值注入四、构造器注入五、总结…

前端面试:项目细节重难点问题分享(十五)

更多详情:爱米的前端小笔记(csdn~xitujuejin~zhiHu~Baidu~小红shu)同步更新,等你来看!都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们…

ComfyUI 实战教程:图片添加文字

大家好,我是每天分享AI应用的萤火君! 在AI绘画中书写文字一直是个老大难的问题,直到SDXL的出现,文字生成才迎来转机,可以在提示词中指定一些英文字符,不过也是经常出错,生成中文就更加不可求了…

uView input输入框和search输入框实现搜索功能

背景&#xff1a; 在手机端实现搜索框的“查询功能”&#xff0c;使用uView组件库。有两种实现思路&#xff1a; 1.input输入框 2.search搜索框 效果展示&#xff1a; 一、search搜索框 官方文档&#xff1a;点击跳转uView官网 实际代码&#xff1a; //u-search组件 <u-se…

人生五大成熟表现

三十而立&#xff1b;立什么&#xff1f;立身、立业、立家&#xff1b; 四十不惑&#xff1b;明白了什么&#xff1f;明白了社会&#xff0c;责任、自己&#xff1b; 五十知天命&#xff1b;知道了什么&#xff1f;知道了命运轨迹&#xff0c;人生定位&#xff1b; 六十而顺&am…

58 简单学生管理系统【项目需求、数据库搭建、项目搭建、功能实现(注册功能、登录功能完善验证码功能(Session-会话对象))】

简单学生管理系统 项目需求 数据库搭建 数据库建表 导数据库sql 了解 项目搭建 导包&#xff0c;基础页面&#xff0c;实体类&#xff0c;工具类 基础页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><ti…

深入实践,浅谈EHS管理的智能化转型

随着人工智能、大数据、云计算等先进技术的飞速发展&#xff0c;EHS管理体系与管理软件的融合正步入一个全新的智能化时代。这一转型不仅进一步提升了EHS管理的效率和精准度&#xff0c;还为企业带来了前所未有的管理视野和决策支持。 一、创新驱动&#xff0c;深化EHS管理的智…

深入探讨Google谷歌助力孟加拉slots游戏广告市场前景

深入探讨Google谷歌助力孟加拉slots游戏广告市场前景 在深入探讨孟加拉游戏广告投放于Google谷歌平台的优势时&#xff0c;不得不提及其强大的数据分析与精准定位能力。谷歌广告平台拥有全球领先的数据处理技术&#xff0c;能够基于用户的搜索历史、浏览行为、地理位置等多维度…

C语言程序设计24

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.1 求下列算数表达式的值 &#xff08;1&#xff09;xa%3*(int)(xy)%2/4 设x2.5,a7,y4.7 (2)(float)(ab)/2(int)x%(int)y 设 a2,b3,x3.5,y2.5 代码&#xff08;1&#xff09;&#xff1a;…

贪心系列专题篇三

目录 单调递增的数字 坏了的计算器 合并区间 无重叠区间 用最少数量的箭 声明&#xff1a;接下来主要使用贪心法来解决问题&#xff01;&#xff01;&#xff01; 单调递增的数字 题目 思路 如果我们遍历整个数组&#xff0c;然后对每个数k从[k,0]依次遍历寻找“单调递…

人力资源专家推荐:2024年十大HR软件

本篇文章介绍了以下人力资源管理工具&#xff1a;Moka、北森云计算、友人才、人瑞人才、Zoho People、金蝶之家、Gusto、Workday HCM、Namely、UKG Pro。 在选择合适的人力资源软件时&#xff0c;许多企业常常面临各种挑战&#xff0c;例如如何确保软件功能全面、用户体验良好&…

WinForm中使用Bitmap元素处理图像

前言 这个Bitmap元素在我们处理图像显示相关时&#xff0c;它的身影就可以见到了。官方术语&#xff1a;封装 GDI 位图&#xff0c;此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。操作对象最重要的两个方法GetPixel和SetPixel。 一…

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的包&#xff0c;应该可以指定具体的工具g&#xff0c;gcc&#xff0c;mingw32-make的下载&#xff0c;详细命令请自行搜索。 2、将 msys2…

前端面试宝典【HTML篇】【3】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…