Elasticsearch Serverless 中的数据流自动分片

news2024/12/12 14:57:06

作者:来自 Elastic Andrei Dan

在 Elastic Cloud Serverless 中,我们根据索引负载自动为数据流配置最佳分片数量,从而使用户无需摆弄分片。

传统上,用户会更改数据流的分片配置,以处理各种工作负载并充分利用可用资源。在 Elastic Cloud Serverless 中,我们引入了数据流的自动分片,使其能够根据索引负载自动管理和扩展。这篇文章探讨了自动分片的机制、其好处以及它对处理可变工作负载的用户的影响。自动分片的理念是积极增加分片数量并非常谨慎地减少分片数量,这样分片的增加不会因为工作负载在短时间内减少而过早地减少分片数量。

无服务器 Elasticsearch 中的数据流自动分片

想象一下,你有一个大披萨需要在聚会上与朋友们分享。如果你将披萨切成两片,供六个朋友食用,那么每片都需要供多人食用。这将造成瓶颈,一个人独占一整片,而其他人则在等待,导致共享过程缓慢。此外,并不是每个人都能同时享用披萨;你几乎可以听到那些等待的朋友的叹息声。如果更多的朋友意外出现,你将很难用两片披萨喂饱他们,并发现自己不得不当场手忙脚乱地重新塑形。

另一方面,如果你把披萨切成 36 片小块给同样的六个朋友,管理分享就变得很棘手。每个人都没有享受披萨,而是花更多的时间想办法拿到自己的小份。如果切片太小,披萨甚至可能会散开。

为了确保每个人都能高效地享用披萨,你应该把它切成与朋友数量相匹配的片数。如果你有六个朋友,把披萨切成 6 片或 12 片,每个人都可以拿到一片,而不用等很长时间。通过在切披萨时找到合适的平衡,你将让聚会顺利进行,让每个人都开心。

当你立即跟进解释时,你就知道这是一个很好的比喻;披萨代表数据,切片代表索引分片,朋友是集群中的 Elasticsearch 节点。

传统上,Elasticsearch 的用户必须预测他们的索引吞吐量并手动配置每个数据流(data stream)的分片数量。这种方法严重依赖于预测启发式方法,需要根据工作负载特征进行持续调整,同时还要平衡数据存储、搜索分析和应用程序性能。

零售等具有季节性流量的企业通常会处理数据需求激增的问题,而物联网应用程序可能会在特定时间经历负载的快速增加。开发和测试环境通常每周只运行几个小时,这使得固定分片配置效率低下。新应用程序可能难以准确估计工作负载需求,从而导致潜在的过度或不足配置。

我们在 Elastic Cloud Serverless 中引入了数据流的自动分片。Serverless 中的数据流根据索引负载自动管理和扩展 - 当朋友到达你的聚会或吃完时自动切片你的披萨。

自动分片的承诺

自动分片通过根据当前索引负载自动调整分片数量来解决这些挑战。这意味着用户无需手动调整配置,Elasticsearch 将根据实时数据流量动态管理项目中数据流的分片数量。

Elasticsearch 将每个索引的索引负载作为名为写入负载的指标的一部分进行跟踪,并将其作为索引部分下索引统计 API (index stats API)的一部分公开给本地和 ESS 部署。

write_load 表示索引文档时使用的平均写入线程数。

对于具有一个分片的索引,write_load 指标的最大可能值是可用的写入线程数(例如,所有写入线程都忙于在同一个分片中写入)。

对于具有多个分片的索引,写入负载的最大可能值是节点中可用的写入线程数乘以项目中的索引节点数。(例如,托管我们索引的分片的所有索引节点上的所有写入线程都忙于在属于我们索引的分片中写入,仅此而已)

为了了解 write_load 允许的值,让我们查看索引 logs,其中一个分片在一台分配了 2 个处理器的 Elasticsearch 机器上运行。写入线程池的大小将为 2 个线程。这意味着,如果此 Elasticsearch 节点专门且持续地写入相同的索引日志,我们将报告的索引日志的 write_load 将为 2.0(即 2 个写入线程完全用于写入索引日志)。

如果 logs 有 2 个主分片,并且我们现在在两个 Elasticsearch 节点上运行,每个节点分配有 2 个处理器,如果两个 Elasticsearch 节点上的所有写入线程都专门写入日志索引,我们将能够获得最大报告的 write_load 4.0。

无服务器自动扩展

我们刚刚研究了当我们增加分片和 Elasticsearch 节点的数量时,写入 write load 如何翻倍。Elastic Cloud Serverless 使用数据流自动分片和摄取自动扩展(ingest autoscaling)自动处理这两项操作。自动扩展是指根据当前需求动态调整资源(如内存、CPU 和磁盘)的过程。

在我们的无服务器架构中,我们从一台小型 2GB 内存服务器开始,并使用阶跃函数扩展方法来有效增加容量。我们逐步增加内存,然后通过添加服务器进行扩展。这个循环继续,在管理服务器数量的同时,逐步将每台服务器的内存增加到 64GB。

将自动扩展和自动分片联系起来

自动扩展和自动分片之间的联系对于优化性能至关重要。在计算数据流的最佳分片数量时,我们会考虑扩展设置中每个节点可用的最小和最大写入线程数。

  • 对于小型项目,当数据流使用超过节点容量的一半(即超过一个索引线程)时,系统将从 1 个分片移动到 2 个分片。
  • 对于中型项目,由于系统跨多个节点扩展,因此不会超过 3 个分片,以避免过多的开销。
  • 一旦我们达到最大的节点大小,就会启用进一步的分片以适应更大的工作负载。

自动分片还可以使项目达到更高的摄取负载值,从而实现自动扩展以根据需要增加资源,防止系统在高索引工作负载期间保持低容量。

自动分片公式

为了确定所需的分片数量,我们使用以下公式:

此公式平衡了根据 write_load 增加分片的需求,同时限制了分片数量以防止过度分片。除以 2 反映了仅在超过节点容量的一半后才增加分片的策略。最小/最大写入线程表示自动缩放步骤函数中可用的最小和最大写入线程数(即最小 2GB 步骤上可用的写入线程数和最大服务器上可用的写入线程数)

让我们可视化公式的输出:

Y 轴表示分片数量。X 轴表示写入负载(write load)。我们从 1 个分片开始,当写入负载刚好超过 3.0 时,分片数量增加到 3 个。在写入负载达到 48.0 左右之前,我们会一直使用 3 个分片。

这涵盖了我们通过节点扩展但尚未达到 2 个或更多或最大服务器的时间,此时我们会解锁自动分片到 3 个以上的分片,数量与提取数据所需的数量相同。

虽然添加分片可以提高索引性能,但 Elasticsearch 集群中的过度分片可能会产生负面影响 - 想象一下只有 7 个朋友分享 56 片披萨。每个分片都有间接成本,包括维护和资源分配。我们的算法考虑并避免了过度分片的危险,直到我们达到最大的工作负载,此时添加超过 3 个分片会对索引性能和吞吐量产生重大影响。

使用滚动实现自动分片

自动分片的实现依赖于滚动(rollover)的概念。滚动操作会在数据流(data stream)中创建一个新索引,将其提升为写入索引,同时将前一个索引指定为常规后备索引,不再接受写入。这种转变可能基于特定条件发生,例如超过 50GB 的分片大小。我们负责为无服务器中的数据流配置最佳滚动条件(optimal rollover conditions)。

在无服务器(Serverless)中,除了与维护健康索引和分片相关的常规滚动条件外,我们还引入了一个新条件,用于评估当前写入负载是否需要增加分片数量。如果满足此条件,将触发滚动,并为新生成的数据流写入索引(write index)配置最佳分片数量。

对于缩减规模,系统将监控工作负载,不会仅仅为了减少分片而触发滚动。相反,它将等到常规滚动条件(如主分片大小)触发滚动。生成的写入索引将配置较少数量的分片。

分片调整的冷却期

为了确保分片调整期间的稳定性,我们实施了冷却期:

  • ​​增加分片冷却时间:自上次调整以来,在增加分片数量之前,强制执行至少 4.5 分钟的等待时间。4.5 分钟的冷却时间可能看起来很奇怪,但选择这个间隔是为了确保我们每次在数据流生命周期(data stream lifecycle)检查数据流是否应该滚动时(目前每 5 分钟一次)可以增加分片数量,但频率不会超过 5 分钟,以涵盖内部 Elasticsearch 集群重新配置。
  • 减少分片冷却时间:在减少分片之前,我们保持 3 天的最低等待时间,以确保决策基于持续的工作负载模式而不是暂时的波动。

结论

无服务器 Elasticsearch 中的数据流自动分片功能代表了有效管理数据流的重大进步。通过根据实时索引负载自动调整分片数量,此功能简化了操作并增强了可扩展性。

借助自动扩展的额外优势,用户可以期待更高效、响应更快的体验,无论他们是在处理小型项目还是大型应用程序。随着数据工作负载的不断发展,自动分片提供的适应性确保 Elasticsearch 仍然是管理各种索引需求的强大解决方案。

试用我们的无服务器 Elasticsearch 产品,利用数据流自动分片,并观察索引吞吐量随着数据提取负载的增加而无缝扩展。

随着越来越多的朋友来到你的聚会,你的披萨将被最佳地切成薄片,他们渴望尝试您为他们准备的酸面团手工披萨。

了解有关 Elastic Cloud Serverless 的更多信息,并开始 14 天免费试用以亲自测试。

原文:Autosharding of data streams in Elasticsearch Serverless - Elasticsearch Labs

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

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

相关文章

【Golang】Go语言编程思想(六):Channel,第四节,Select

使用 Select 如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select: package mainimport "fmt"func main() {var c1, c2 chan int // c1 and …

MindSearch深度解析实践

任务要求:在 官方的MindSearch页面 复制Spaces应用到自己的Spaces下,Space 名称中需要包含 MindSearch 关键词,请在必要的步骤以及成功的对话测试结果当中 1.在github codespace中配置环境 conda create -n mindsearch python3.10 -y conda…

【PyQt5教程 二】Qt Designer 信号与槽的使用方法及PyQt5基本小部件说明

目录 一、信号与槽机制: 二、信号与槽使用方法: (1)使用Qt Designer 的信号与槽编辑器: (2)使用固定语法直接建立信号槽连接: 三、PyQt小部件及其触发信号: &#x…

基于PHP课堂签到系统的设计与实现

摘 要 随着教育业的迅速发展和学生人数的不断增加,导致在班级登记制度中传统的“点到”方式不能适应学校的实际需要。从而需要设计一个好的课堂签到系统将会对课堂签到管理工作带来事半功倍的效果。文章着重介绍了基于实践应用的班级签到系统的开发流程&#xff0c…

CSS学习记录11

CSS布局 - display属性 display属性是用于控制布局的最终要的CSS属性。display 属性规定是否/如何显示元素。每个HTML元素都有一个默认的display值,具体取决于它的元素类型。大多数元素的默认display值为block 或 inline。 块级元素(block element&…

高效利用资源:分布式有状态服务的高可靠性设计

在分布式系统设计中,实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时,备服务接管任务,例如通过Keepalive实现VIP的切换以保证可用性。然而,这种方式存在资源浪费的问题,因为备服务始终处于空转状…

重生之我在异世界学智力题(2)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言智力题:逃离孤岛智力题&a…

论文浅尝 | SAC-KG:利用大语言模型作为领域知识图谱熟练的自动化构造器(ACL2024)...

笔记整理:杜超超,天津大学硕士,研究方向为自然语言处理、大语言模型 论文链接:https://aclanthology.org/2024.acl-long.238/ 发表会议:ACL 2024 1. 动机 知识图谱(KG)在各个专业领域的知识密集…

Python机器视觉的学习

一、二值化 1.1 二值化图 二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。 1.2 阈值法 阈值法(Thresholding)是一种图像分割技术,旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…

Elasticsearch高性能实践

前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化,深入理解es各个名词及含义,深入分析es的使用过程中应注意的点,详细解释参数设置的原因以及目的,主要包括系统层面,参数层面。除此之外,优…

笔记本外接显示屏没声音

1、笔记本正常有声音,但是外接显示屏后没有声音了怎么回事呢?原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出,但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法:打开笔记本设置,选择声…

JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)

目录 一、web四大域。 (1)基本介绍。 (2)RequestScope。(请求域) (3)SessionScope。(会话域) (4)ApplicationScope。(应用域) (5)PageScope。(页面域) 二、Ht…

用人话讲计算机:Python篇!(十二)正则运算+re模块

目录 一、正则表达式 (1)什么是正则表达式 (2)它的结构及使用 示例: 1.字符 . (←这里有个小点哦) 2.字符 | 3.字符 [ ] 4.字符^ 5.字符\d (3)补充&#xff…

力扣打卡12:复原IP地址

链接:93. 复原 IP 地址 - 力扣(LeetCode) 这道题需要对字符串进行操作,我选择了三层循环,其实还可以递归。 我在循环时进行了剪枝,比如一些情况直接跳出循环。 我的代码: class Solution { p…

说下JVM中一次完整的GC流程?

大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,垃圾回收(GC&am…

vs配置c++标准

在 vcxproj 文件中添加 <LanguageStandard>stdcpp17</LanguageStandard> 和在 Visual Studio 属性页面中设置 “C语言标准” 为 “ISO C17 标准 (/std:c17)” 是完全等价的。 它们的对应关系是&#xff1a; VS属性页面中的设置&#xff1a; 项目 -> 属性 ->…

TcpServer 服务器优化之后,加了多线程,对心跳包进行优化

TcpServer 服务器优化之后&#xff0c;加了多线程&#xff0c;对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…

风控大讲堂|游戏黑产情报挖掘与治理

您的产品有没有遇到过被薅羊毛了&#xff1f;网络游戏行业的繁荣&#xff0c;催生了一批围绕游戏而生的职业玩家&#xff0c;他们利用多开、修改器等手段&#xff0c;疯狂薅游戏资源&#xff0c;破坏游戏经济平衡&#xff0c;给游戏公司带来了难以估量的巨大损失。那么针对此类…

最近邻搜索 - 经典树型结构 M-Tree

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 最近邻搜索的目标是从 N N N 个对象中&#xff0c;快速找到距离查询点最近的对象。根据需求的不同&#xff0c;该任务又分…

Jmeter进阶篇(30)深入探索 JMeter 监听器

前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…