Elasticsearch:引入 Serverless 精简索引分片

news2024/11/13 16:13:56

作者:来自 Elastic Tanguy Leroux

在本文中,我们将介绍 Elasticsearch 的精简索引分片(thin indexing shards),这是我们为 Elastic Cloud Serverless 开发的一种新型分片,允许将 Elasticsearch 索引存储在云对象存储中。

我们首先回顾一下 Elasticsearch 目前如何存储和复制数据,然后再深入探讨精简索引分片为远程存储数据而引入的变化。我们将看到,精简索引分片之所以得名,是因为它们管理数据文件的生命周期,从在本地磁盘上创建到在对象存储中上传,再到最终从磁盘中删除,这只能暂时增加磁盘空间。然后,我们将描述文件在对象存储中持久化后如何读取,以及我们如何通过使用基于块的缓存来缓解云存储服务的高延迟。最后,我们将谈谈我们未来的改进计划。

有状态 Elasticsearch 如何在本地磁盘上存储和复制数据

Elasticsearch 管理两种主要类型的数据:

  • 集群状态,这是一种内部数据结构,包含 Elasticsearch 实例正常运行所需的各种信息。它通常包含集群中其他节点的身份和属性、正在运行的任务的当前状态、集群范围的设置、索引元数据及其映射等。
  • 索引,以文档的形式包含用户的业务数据,这些文档由 Elasticsearch 索引,以便可以搜索或聚合它们。

本文重点介绍索引,即存储文档的地方。索引代表 Elasticsearch 集群中存储的总数据量的最大部分,它可以由多个节点上的许多索引组成。索引被分成称为主分片的分片,用于在节点之间分配文档量以及搜索和索引负载。主分片还可以有副本:当文档在主分片中被索引时,它也会在其副本中被索引,以确保数据安全地保存在多个位置。这样,如果某个分片因某种原因丢失或损坏,就会有另一个副本可供恢复。请注意,集群状态也会在本地磁盘上的一组节点(由特定的主节点角色标识)中保存。

我们将此模型描述为 “节点到节点” 复制模型,其中每个节点都是 “stateful - 有状态的”,因为它们依赖本地磁盘来安全且持久地保存其托管的分片的数据。在此模型中,有状态的 Elasticsearch 实例始终必须进行通信以保持主分片和副本分片同步。这是通过将写入操作(新文档索引、更新或删除)从主分片复制到副本分片来实现的。复制并持久保存后,该操作将确认回客户端应用程序:

虽然这种有状态架构对我们很有用,但复制每个操作在资源方面都有不可忽略的成本。主分片节点和副本分片节点都需要 CPU 来提取文档。网络涉及将操作从一个节点传输到另一个节点,当节点位于不同的可用区域时,大规模传输的成本可能很高。最后,需要存储来将数据持久保存在多个磁盘上。

在 Elastic Cloud Serverless 中,我们利用使用云存储服务的优势为 Elasticsearch 实施了一种新的无状态(stateless)模型。

在 Stateless 中有什么变化?

我们在无状态 Elasticsearch 中实现了两项重大变化:

  • 我们将分片数据的持久性从本地磁盘转移到对象存储;
  • 我们将复制模型从在节点之间复制操作更改为通过对象存储复制分片文件。

结合起来,这两项变化带来了一些有趣的改进。将分片的持久性从磁盘转移到对象存储基本上意味着分片文件只在磁盘上临时保留:创建后不久,文件就会上传到对象存储并从本地磁盘中删除。如果必须再次读取文件,则会从对象存储中检索该文件并将其本地存储在基于块的缓存中以供将来读取。一旦文件持久地保存在对象存储中,所有节点都可以访问它们。不再需要在多个节点上维护分片副本,也不需要复制操作,因此我们可以大大简化我们的复制模型。

索引和搜索层

为了避免现有模型和新的 stateless 模型之间的混淆,我们引入了一些新术语:

  • 负责索引文档并将分片文件上传到对象存储的分片称为 “indexing shard - 索引分片”,并自动分配给 Index Tier 中的节点。由于这些分片不需要在索引节点上本地存储完整数据集,因此我们将它们称为精简索引分片(thin indexing shards)。
  • 负责搜索文档的分片简称为 “search shard - 搜索分片”。这些分片分配在 Search Tier 的节点上。

让我们说明现有有状态模型和新的 stateless 模型之间的区别:

好处

新的 statelss 模型有很多好处。通过删除写入操作的复制,我们可以节省 CPU、网络和磁盘等硬件资源。这些资源现在可以专用于提取更多数据,或者换个角度看,可以用更少的资源提取相同数量的数据。将数据保存在一个高度可用的地方可以独立扩展每个层。向层添加更多索引或搜索节点不会受到本地磁盘性能或节点间网络性能的支配。对象存储的成本通常比快速本地 SSD 磁盘便宜,可以帮助降低运行 Elasticsearch 实例的总体成本。

现在我们已经看到了 stateless 架构的整体情况,让我们深入了解实现细节。

从本地磁盘到云存储

在 Elasticsearch 索引中索引文档涉及多个步骤。文档可以通过摄取管道进行摄取,该管道在将文档路由到索引的主分片之一之前对其进行转换或丰富。在那里,文档的来源被解析,任何版本冲突都得到解决。然后,文档被编入主分片并转发到副本分片,在那里它也被编入索引。如果所有这些操作都成功,索引操作将被确认回客户端应用程序。

当文档被编入分片时,它实际上在两个不同的地方被编入索引:首先在 Lucene 中,然后在 translog 中。

Elasticsearch 使用 Lucene 来索引和搜索文档。每次将文档索引到 Lucene 中时,Lucene 都会分析该文档,以构建各种内部数据结构,这些结构的类型取决于我们计划稍后对文档执行的搜索查询。为了保持快速索引,数据结构保存在 Lucene 索引缓冲区的内存中。当足够的数据被索引到内存中时,Lucene 会刷新其内存缓冲区以将数据结构写入磁盘,从而创建一组称为段(segment)的不可变文件。将段写入磁盘后,它所包含的索引文档子集即可搜索。请注意,Elasticsearch 通过每秒刷新 Lucene 缓冲区并打开新段来自动使新索引的文档可搜索:我们在 Elasticsearch 术语中将此称为刷新(refresh)。

Lucene 段文件在创建后永远不会改变,这一事实使它们非常适合缓存:操作系统可以直接在内存中映射文件(或文件的一部分)以加快访问速度。我们稍后会看到,这种不变性还简化了我们在精简索引分片(thin indexing shards)中使用的基于块的实现。不可变的段文件还意味着文档的更新和删除会创建新的段,其中文档的先前版本被软删除(soft deleted),并且可能添加新版本。随着时间的推移,Lucene 会将小段合并为单个、更优化的段,以维护一个高效的 Lucene 索引,并回收更新/删除的文档留下的未使用空间。

Lucene 合并,同时索引所有维基百科(英文)

在文档被积极索引的分片中,段会不断创建和合并,小段只会在磁盘上保留很短的时间。因此,Lucene 不会指示操作系统确保将文件的字节持久写入存储设备。相反,文件可以保留在操作系统的文件系统缓存中,位于内存中,在那里访问它们的速度比在磁盘上快得多。因此,如果托管分片的节点崩溃,段文件就会丢失。

为了安全地将段文件保存在磁盘上,Elasticsearch 确保定期创建 Lucene 提交(commits),这是一个相对昂贵的操作,不能在每次索引或删除操作后执行。为了能够恢复已确认但尚未提交的操作,每个分片都会将操作写入称为 translog 的事务日志中。如果发生崩溃,可以从 translog 中重放操作。

为了确保 translog 不会变得太大,Elasticsearch 会自动执行 Lucene 提交并创建一个新的空 translog 文件。这个过程在 Elasticsearch 术语中称为刷新(refresh),在后台执行。

在 Stateless 中有什么变化?

在前面的部分中,我们描述了 stateful Elasticsearch 中索引文档的逻辑。此逻辑在 statess 中几乎保持不变,不同之处在于,磁盘上文件同步提供的持久性保证已被上传文件到对象存储所取代。

Lucene 提交文件

对于 Lucene,索引文档和刷新索引会继续在本地磁盘上生成段文件。刷新分片时,Lucene 提交文件(即提交中包含的所有段文件加上额外的提交点文件)将由精简索引分片上传到对象存储。为了减少对对象存储的写入次数(写入次数比读取次数要昂贵得多),Lucene 提交文件在上传期间会连接在一起形成单个 blob。此 blob 对象由包含有关分片和提交的信息的标头以及提交中包含的文件的完整列表组成。此列表引用了每个文件的名称、大小和位置。这个位置很重要,因为某些文件可能是由之前的提交创建的,因此位于对象存储中的不同 blob 中。在标头之后,提交添加的新文件将简单地附加到 blob 中。

将多个文件打包到同一个 blob 中有助于降低 PUT 请求引起的成本,但也有助于减少上传提交所需的时间:对对象存储的请求通常具有较高的延迟(第 99 个百分位数在 130 毫秒范围内),但可以提供较高的读/写吞吐量。通过将文件连接到同一个 blob 对象中,我们只需为多个文件支付一次延迟,就可以足够快地上传或下载它们。请注意,为了降低刷新成本,我们还将多个提交上传到单个 blob 中。如果你有兴趣了解有关此主题的更多信息,我们最近写了一篇关于此的文章。

上传后,可以从本地磁盘中删除 Lucene 提交文件。如果我们将分片的总大小(已上传到对象存储中)与它在本地磁盘上实际占用的大小进行比较,我们可以看到,只有一部分分片是索引所必需的。一旦索引减少或停止,这个大小就会降至零:

每 200 毫秒上传一次 Translog

对于 translog,情况就不同了。不可能在每个分片的每次操作之后都上传 translog 文件:上传请求的成本会过高,而使用对象存储产生的高延迟会大大降低索引性能。相反,在 stateless,我们决定每 200 毫秒或达到 16MiB 时上传一次 translog(以先到者为准),我们还决定将同一节点上所有分片的 translog 文件串联成一个节点 translog 文件。

Blob 缓存:上传后访问文件

Lucene 和 translog 文件上传后,会从磁盘中删除。但索引文档可能需要再次读取一些文件:查找文档 id、文档中字段的值,或加载现有源以应用更新脚本。在这种情况下,精简索引分片需要从对象存储中获取所需的文件(或其中的一部分)。但高延迟和对象存储 API 请求的成本使 Elasticsearch 无法每次都从对象存储中读取必要的字节。相反,我们在对象存储前面实现了一个基于块的缓存来缓存 Blob 块。这样,当 Lucene 需要从文件中读取一些字节时,缓存会从对象存储中获取相应的数据块(通常是 16MiB 块)并将其本地存储在磁盘上以供将来读取。为了获得更好的性能,精简索引分片会在上传 blob 时预热缓存,以便在分片从本地文件转换为相应的上传 blob 时,提交文件的相关部分已经缓存。

此 blob 缓存的灵感来自可搜索快照,并使用 LFU 算法逐出不常用的 blob 块。它可以在最小的无服务器节点上存储大约 50 GiB 的数据。

更快的分片恢复

分片恢复是在 Elasticsearch 节点上重建分片的过程。当为新索引创建空分片时、当分片需要从一个节点重新定位到另一个节点时或当分片需要从对象存储中恢复时,将执行此恢复。在 stateless 的情况下,重新定位分片不需要在节点之间完全复制所有段文件。相反,Elasticsearch 使用缓存从对象存储中获取唯一必要的 blob 块,以允许启动分片。它通常代表分片总大小的一小部分,并允许分片更快地启动。

结论和未来的改进

在本文中,我们介绍了如何将主存储从本地磁盘更改为对象存储。我们利用精简索引分片,在本地部分缓存数据以节省本地存储成本,而不会影响吞吐量。我们看到了这给我们的用户带来的硬件资源和总体成本方面的所有收益。

虽然我们大幅减少了索引文档所需的磁盘空间,但我们现在正在考虑改进精简索引分片使用的内存。今天,每个索引分片都需要几 MiB 的内存来存储索引设置、映射和 Lucene 数据结构。在不久的将来,我们希望精简索引分片在没有执行活动索引时几乎不需要内存,并且在需要索引时按需重新填充对象。我们还在考虑改进 blob 缓存。我们使用的算法适用于大多数用例,但我们正在考虑探索替代方案。最后,我们正在为 Lucene 做出贡献,以便在从对象存储中获取字节时实现更多并行化。

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

原文:Elasticsearch Serverless: Thin Indexing Shards — Search Labs

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

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

相关文章

大数据技术现场工程师特色实训室解决方案

一、引言 在大数据时代背景下,数据已成为新的生产要素,驱动着各行各业的创新发展。面对这一趋势,市场对于既掌握大数据理论知识又具备实战能力的大数据技术人才的需求急剧增加。为了应对这一挑战,唯众精心设计了一套全面的大数据…

国产 麒麟 ARM 环境编译 RocketMQ-Client-CPP

1.环境 系统版本:Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux GCC: gcc (Ubuntu 9.3.0-10kylin2) 9.3.0 G: g (Ubuntu 9.3.0-10kylin2) 9.3.0 RocketMQ服务端版本:5.1.1 RocketMQ-cpp …

修改docker的/var/lib/docker/overlay2储存路径

目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…

RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!

一、引言 前面我们介绍过很多的关于大模型和RAG相关的技术,通过其关注程度足以看到市场上对RAG框架和成熟产品的迫切需求,因为想要个人独立从0开始实现一个RAG产品并非易事,虽然有相当多的RAG或者知识库开源产品,大部分其实很难应…

使用 Elasticsearch RestHighLevelClient 进行查询

Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…

Docker Hub 镜像代理加速

因为未知原因,docker hub 已经不能正常拉取镜像,可以使用以下代理服务来进行: "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud"…

深入浅出消息队列----【顺序消息的实现原理】

深入浅出消息队列----【顺序消息的实现原理】 何为顺序发消息的顺序性存储消息的顺序性消费消息的顺序性顺序消息消费的三把锁第一把锁:分布式锁第二把锁:Synchronized第三把锁:ReentrantLock 本文仅是文章笔记,整理了原文章中重要…

vue3仿飞书头像,根据不同名称生成不同的头像背景色

效果展示&#xff1a; 传递三个参数&#xff1a; name&#xff1a;要显示的名称&#xff1b;size&#xff1a;头像的大小&#xff1b;cutNum&#xff1a;分割当前名称的最后几位数&#xff1b; 代码如下&#xff1a; <template><div:style"{color: #fff,borde…

VMware虚拟机下安装Ubuntu22.04以及汉化配置保姆级教程

目录 一.VMware和Ubuntu下载 二.在VMware中创建Ubuntu 1.点击 创建新的虚拟机 2.选择典型 3.选择Ubuntu镜像包&#xff08;自定义存放的位置&#xff09; 4.创建个人信息&#xff08;密码一定要牢记&#xff09; 5.选择虚拟机的安装位置 6.其他配置项&#xff08;默认下…

在数字浪潮中扬帆远航,软件行业就业前景如何?

随着数字化转型的加速和信息技术的广泛应用&#xff0c;对于软件开发人员的需求持续增长。不仅传统IT企业需要大量的软件开发人才&#xff0c;各行各业的企业也普遍需要自主研发软件以满足其业务需求。对于具备较好的学习能力和适应能力的人来说&#xff0c;这个行业提供了更多…

jenkins一键推送到远程服务器并用docker容器启动

1.安装jenkins 我后端使用的是宝塔面板来安装的容器化jenkins,要选中允许外部访问&#xff0c;安装完之后没有那个选项了&#xff0c;一开始安装的时候要选中不使用域名和后面的允许外部访问。Jenkins 版本为&#xff1a; 2.462.1 2.配置Jenkins 2.1 Git plugin 安装完毕之…

江新安教授受邀引正基因进行《制药行业研发项目管理》培训

近日&#xff0c;科济管线创始人江新安教授应赛柏蓝邀请为北京引正基因科技有限公司&#xff08;简称引正基因&#xff09;进行《研发项目管理》授课。为提高项目管理水平&#xff0c;加强研发项目相关人员的管理能力&#xff0c;掌握研发项目管理技能与工具&#xff0c;江新安…

AI招聘在人才盘活中的作用:开启智慧人力新篇章

一、引言&#xff1a;AI赋能招聘新纪元 在21世纪的今天&#xff0c;随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到社会经济的各个角落&#xff0c;其中&#xff0c;人力资源管理领域也不例外。AI技术的引入&#xff0c;不仅颠覆了传统的招聘模…

代码规范 —— QMQ 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、代码规范 【1】消费者必须以Consumer结尾&#xff0c;生产者必须以Producer结尾。 【2】选择合适的消费模式&#xff1a;根据业务判断消费模式是集群模式还是广播模式&#xff0c;具体为&#xff1a;MessageConsumerProvider.addListene…

R的行和列命名和类型的转换

下面内容摘录自&#xff1a; 4章8节&#xff1a;用R做数据重塑&#xff0c;行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中&#xff0c;命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时&#xff0c;为行和列命…

FPGA知识基础之--FIFO ip核的使用以及实例化clocking wizard ip产生一个异步FIFO,附RTL和仿真代码

目录 一、FIFO简介1.定义2.特点3.分类4.FIFO在FPGA中的应用 二、实验任务三、FIFO IP核1.接口2.写时序3.读时序1.Standara2 .FWFT 四、vivado设置五、程序设计1.模块2.时序3.异步信号传输4.RTL代码 五、仿真1.Testbench代码2.波形 一、FIFO简介 1.定义 FIFO是一种先进先出的数…

电能表在企业能源管理中的作用

电能表在企业能源管理中扮演着至关重要的角色&#xff0c;它不仅是能源计量的基础工具&#xff0c;更是企业实现高效能源管理、降低能源成本、提高竞争力的关键所在。 一、精确计量与实时监测 电能表作为能源计量的基础工具&#xff0c;其首要作用是实现电能的精确计量。相比…

PostgreSQL 练习 ---- psql 新增连接参数

目标 添加一个连接参数&#xff0c;默认为 false 。当 psql 连接时&#xff0c;若该连接参数非 “true” 时&#xff0c;用户 “u1“ 对表对象无操作权限&#xff0c;包括自己拥有的表。 连接机制简介 连接过程如下所述&#xff1a; 客户端初始化一个空连接&#xff0c;设置…

如何高效记录并整理编程学习笔记?

一&#xff1a;简介 在编程学习的过程中&#xff0c;建立一个高效的笔记记录和整理方法确实非常重要。下面是一些方法和建议&#xff0c;帮助你打造自己的编程学习“知识宝库”。 1&#xff09;. 选择合适的工具 选择一个适合自己的笔记工具非常重要。可以考虑以下几种&#…

SB3045LFCT-ASEMI无人机专用SB3045LFCT

编辑&#xff1a;ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号&#xff1a;SB3045LFCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向电压&#xff08;VRRM&…