Elasticsearch Serverless 中的数据流自动分片

作者:来自 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.rhkb.cn/news/488615.html

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

相关文章

Pytest-Bdd-Playwright 系列教程(15):背景(Background)

Pytest-Bdd-Playwright 系列教程(15):背景(Background) 前言一、什么是背景(Background)二、特性文件三、测试脚本四、运行测试总结 前言 在测试的过程中,我们往往会遇到这样的问题&…

Excel + Notepad + CMD 命令行批量修改文件名

注意:该方式为直接修改原文件的文件名,不会生成新文件 新建Excel文件 A列:固定为 renB列:原文件名称C列:修改后保存的名称B列、C列,需要带文件后缀,为txt文件就是.txt结尾,为png图片…

GESP202412 八级【排队】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 八级] 排队 题目描述 小杨所在班级共有 n n n 位同学,依次以 1 , 2 , … , n 1,2,\dots,n 1,2,…,n 标号。这 n n n 位同学想排成一行队伍,其中有些同学之间关系非常好,在队伍里需要排在…

Ubuntu22.04 docker如何发布镜像(和用git差不多)

在dockerhub上创建远程仓库:https://hub.docker.com/ 将本地镜像打tag,并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称(要和远程仓库dockerhub上的一致):新的标签pus…

C#中的string操作详解-截取、分割、连接、替换等

在C#中,string 类提供了许多用于操作字符串的方法,包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例: 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法: //从startIndex开始截取,…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染,并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【IC面试问题:UCIE PHY LSM AXI Cache】

IC面试问题:UCIE PHY LSM && AXI && Cache 1 UCIE PHY LSM有几种状态? 以及L1和L2这两种低功耗状态有什么区别?2 AXI的特性? 通道之间有依赖关系吗? master和slave的valid和ready关系? 写数…

PPT技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片,想要将图片中的背景设置为透明或者想要抠图,有什么方法吗?今天分享两个方法。 方法一: 添加图片,选中图片之后,点击【图片格式】功能,点击最左边的【删除背景】 PPT会自动帮…

池化在深度学习中增强特征的作用

目录 ​编辑 引言 池化的基本作用与特征降维 池化的定义与目的 池化操作的实现 提取关键特征与计算效率的提升 池化对特征提取的影响 平均池化的应用 提高特征鲁棒性与过拟合的防止 池化对模型鲁棒性的贡献 池化防止过拟合的原理 增强多级特征与特征表达能力的提升…

分布式 Raft算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Raft算法 & 总结》《分布式 & Raft算法 & 问题》 参考文献 《Raft一致性算法论文译文》《深入剖析共识性算法 Raft》 简介 Raft 木筏是一种基于日志复制实现的分布式容错&一致性算法。在Raft算法…

基于强化学习Q-learning算法的栅格地图路径规划算法,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

Q-learning是一种无模型的强化学习算法,它允许智能体(agent)在与环境(environment)交互的过程中学习如何通过执行动作(actions)来最大化累积奖励(cumulative rewards)。 …

JAVA学习笔记——第十一章 枚举和注解

一、引出枚举类 1.先看一个需求demo package com.hspedu.enum_;public class Enumration01 {public static void main(String[] args) {Season Spring new Season("春天", "温暖");Season Summer new Season("夏天", "炎热");Seas…

腾讯微信Android面试题及参考答案(多张原理图)

Android 应用的启动流程如下: 当用户点击应用图标时,首先会通过 Launcher(桌面启动器)来响应这个操作。Launcher 本身也是一个 Android 应用,它运行在系统中,负责管理和显示桌面上的图标等信息。 系统会检查…

SQL server学习02-使用T-SQL创建数据库

目录 一, 使用T-SQL创建数据库 1,数据库的存储结构 2,创建数据库的语法结构 1)使用T-SQL创建学生成绩管理数据库 二,使用T-SQL修改数据库 1,修改数据库的语法结构 1)修改学生成绩管理数…

python web练习案例:基于表单类的商品管理(修改并删除商品信息)

目录 1、修改商品信息 (1)修改show.html页面,增加 修改 栏 (2)创建 update.html 网页,继承 add.html 模板 (3)定义视图函数 (4)定义路由 (5) 浏览器查看 …

前端成长之路:CSS(1)

在前端三件套中,CSS的主要是用于美化网页、进行页面布局的。 HTML的局限性 HTML是一个非常单纯的语言,它只关心内容的语义: 比如看见h1标签,就表明这是一个大标题、看见p标签,就表明这是一个段落、看见img标签&#…

【开源】基于SpringBoot框架的房屋租赁系统 (计算机毕业设计)+万字毕业论文 T020

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可 操作系统…

hbuilder 本地插件配置

插件存放路径,项目根目录nativeplugins下,没有就新建。 aar文件存放路径\nativeplugins\module\android package.json存放路径\nativeplugins\module\ 配置package.json文件 { "name": "module", "id": "modu…

内圆弧转子泵绘制工具开发

接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具,也就是把上次计算绘制的过程做成一个桌面应用工具,这样用起来会更方便、效率更高。那究竟是什么样的工具呢?一起来看看: 前面不是已经有了上…

(持续更新)linux网络编程中需要注意的内核参数与网络机制

目录 零、基本说明 一、内核参数 二、相关机制 1、GRO (1)适用场景 (2)优缺点 (3)相关操作 2、Nagle 算法 (1)基本规则 (2)优缺点 (3&…