构建 Elastic Cloud Serverless

news2024/10/7 6:50:55

作者:来自 Elastic Jason Tedor

Elastic Cloud Serverless 架构

2022 年 10 月,我们引入了 Elasticsearch 的无状态架构。 我们该计划的主要目标是发展 Elasticsearch,以利用云原生服务提供的操作、性能和成本效率。

该计划成为我们最近宣布的名为 Search AI Lake 的更大努力的一部分,并作为我们新的 Elastic Cloud Serverless 产品的基础。 在这一努力中,我们的目标不仅是使 Elasticsearch 和 Kibana 等 Elastic Stack 产品更加云原生,而且还使其编排更加云原生。 我们设计并构建了一个由 Kubernetes 支持的新后端平台,用于编排 Elastic Cloud Serverless 项目,并改进了 Elastic Stack 产品,以便我们更容易在 Kubernetes 中编排。 在本文中,我们将详细介绍我们在此过程中做出的一些架构决策。 在以后的文章中,我们将更深入地探讨其中的一些方面。

我们选择 Kubernetes 来支持后端的主要原因之一是 Kubernetes 中拥有丰富的资源,可用于解决容器生命周期管理、扩展、弹性和资源管理问题。 我们制定了“以原生 Kubernetes 方式做事”的早期原则,即使这意味着 Elastic Stack 产品的重大演变。 我们构建了各种 Kubernetes 原生服务,用于管理、观察和编排 Elastic Stack 产品(例如 Elasticsearch 和 Kibana)的物理实例。 这包括用于配置、管理软件更新和自动扩展的自定义控制器/操作器; 以及用于身份验证、管理操作备份和计量的服务。

作为一点背景知识,我们的后端架构有两个高级组件。

  • 控制平面:这是面向用户的管理层。 我们为用户提供 UI 和 API 来管理其 Elastic Cloud Serverless 项目。 用户可以在这里创建新项目、控制谁有权访问其项目以及获取其项目的概述。
  • 数据平面:这是为 Elastic Cloud Serverless 项目提供支持的基础设施层,也是用户在想要使用其项目时与之交互的层。

控制平面是一个全局组件,数据平面由多个 “局部组件” 组成。 这些是各个云服务提供商 (Cloud Serice Provider - CSP) 区域中的各个 Kubernetes 集群。

关键设计决策

水平扩展 Kubernetes

我们的数据平面将部署在 AWS、Azure 和 Google Cloud 上。 在每个主要 CSP 中,我们将在几个 CSP 区域运营。 我们不是垂直扩展大规模 Kubernetes 集群,而是使用基于单元的架构来水平扩展独立的 Kubernetes 集群。 在每个 CSP 区域内,我们将运行许多 Kubernetes 集群。 这种设计选择使我们能够避免 Kubernetes 扩展限制,并且还可以在 Kubernetes 集群发生故障时充当较小的故障域。

推送 (Push) vs 拉取 (Pull)

我们进行的一场有趣的辩论是 “推与拉”。 特别是,全局控制平面应如何与数据平面中的各个 Kubernetes 集群进行通信? 例如,当创建一个新的 Elastic Cloud Serverless 项目并需要在数据平面的 Kubernetes 集群中进行调度时,全局控制平面是否应该将该项目的配置下推到选定的 Kubernetes 集群,或者应该在数据平面中的 Kubernetes 集群中进行调度。数据平面监视并从全局控制平面中提取该配置? 与往常一样,这两种方法都需要权衡。 我们选择推送模型是因为:

  • 调度逻辑更简单,全局控制平面单独选择合适的 Kubernetes 集群
  • 数据流将是单向的而不是双向的。 在拉模型中数据流必须是双向的
  • 数据平面中的 Kubernetes 集群可以独立于全局控制平面服务运行
  • 简化操作和故障场景处理
    • 无需管理同一区域中的两个数据平面集群来竞争调度或重新调度应用程序
    • 如果全局控制平面失效,我们可以手动与目标集群中的 Kubernetes API 服务器交互,以模拟推送模型中的理想路径;然而,当被监视的全局控制平面不可用时,要在拉取模型中模拟理想路径则不太容易实现。

托管 Kubernetes 基础设施

在每个主要 CSP 中,我们选择使用他们的托管 Kubernetes 产品(AWS EKS、Azure AKS 和 Google GKE)。 这是我们为减轻集群本身的管理负担而做出的早期决定。 虽然托管 Kubernetes 产品满足了这一目标,但它们在其他方面都是准系统。 我们希望对我们的工程师构建的 Kubernetes 集群更加有自己的看法,减轻我们工程团队的负担,并免费提供某些东西。 我们为工程团队提供的开箱即用的(非详尽的)类型有:

  • 围绕集群的配置和可用服务提供保证
  • 受管理的网络底层
  • 围绕内部政策和安全标准的安全基线和合规性保证
  • 托管可观察性 —— 每个组件的日志和指标都会自动收集并发送到集中式可观察性基础设施,该基础设施也基于 Elastic Stack
  • 容量管理

在内部,我们将这种包装的基础设施称为 “Managed Kubernetes Infrastructure- 托管 Kubernetes 基础设施”。 它是我们的基础构建块,使我们的工程团队能够专注于构建和运营他们创建的服务。

集群是一次性的

我们在这里采用的一个重要架构原则是,我们的 Kubernetes 集群被认为是一次性的。它们不是任何重要数据的真实来源,因此我们永远不会在 Kubernetes 灾难中遇到数据丢失,并且可以随时重新创建它们。这种级别的弹性对于保护我们客户的数据非常重要。这个架构原则将简化我们平台在我们规模上的可操作性。

关键的可扩展性决策

对象存储 API 调用

俗话说,这是他们让你上钩的方式。我们之前概述了 Elasticsearch 的无状态架构,其中我们使用对象存储(AWS S3、Azure Blob 存储、Google Cloud 存储)作为主要数据存储。从高层次来看,使用主要云服务提供商(CSP)对象存储的两个主要成本维度是存储和 API 调用。存储维度相当明显且易于估算。但如果不加控制,对象存储 API 调用的成本可能会迅速膨胀。由于对象存储充当主要数据存储,并且每个分片的数据结构(如 translog)也存储在其中,这意味着每次写入 Elasticsearch 都会涉及对象存储,因此每次写入分片至少会产生一次对象存储 API 调用。对于持有多个分片并频繁接收写入的 Elasticsearch 节点,成本会迅速累加。为了解决这个问题,我们将 translog 写入演变为按节点执行,在节点上合并跨分片的 translog 写入,并每 200 毫秒将它们刷新到对象存储。

一个相关的方面是刷新(refreshes)。在 Elasticsearch 中,刷新会转换为对其支持数据存储的写入,而在无状态架构中,这意味着写入对象存储,从而产生对象存储 API 调用。由于某些用例需要高刷新率,例如每秒刷新一次,当 Elasticsearch 节点接收来自多个分片的写入时,这些对象存储 API 调用会迅速增加。这意味着我们必须在次优用户体验和高成本之间进行权衡。此外,这些刷新对象存储 API 调用与在那一秒内摄取的数据量无关,因此很难将其与用户感知的值联系起来。我们考虑了几种解决方法:

  1. 使用一个中间数据存储,它没有每次操作的成本,位于 Elasticsearch 和对象存储之间
  2. 将刷新与写入对象存储分离
  3. 将节点上所有分片的刷新合并为单一对象刷新

我们最终选择了将刷新与写入对象存储分离。与其让刷新触发写入对象存储(搜索节点会读取这些写入以访问最近执行的操作),不如让主分片直接将刷新数据(段)推送到搜索节点,并推迟到稍后时间再写入对象存储。由于我们仍然在对象存储中将操作持久化到 translog,因此这种推迟不会有数据丢失的风险。尽管这种推迟会增加恢复时间,但它使刷新触发的对象存储 API 调用数量减少了两个数量级。

自动扩展

我们在 Elastic Cloud Serverless 上的一个主要用户体验目标是消除用户管理其项目大小/容量的需求。虽然这种控制对于某些用户来说非常强大,但我们设想了一种更简单的体验,即 Elastic Cloud Serverless 能够自动响应增加的摄取率或更大量数据查询的需求。随着在无状态 Elasticsearch 架构中存储和计算的分离,这比以前更容易解决问题,因为我们现在可以独立管理索引和搜索资源。

我们遇到的一个早期问题是需要一个能够支持垂直和水平自动扩展的自动扩展器,这样当一个项目的需求增加时,我们既可以向上扩展到更大的节点,也可以向外扩展到更多的节点。此外,我们还遇到了 Kubernetes 水平 Pod 自动扩展器的可扩展性问题。为了解决这个问题,我们构建了自定义的自动扩展控制器。这些自定义控制器获取应用程序级别的指标(特定于要扩展的工作负载,例如索引与搜索),做出自动扩展决策,并将这些决策推送到 Kubernetes 中的资源定义。这些决策随后被实际执行,以将应用程序扩展到所需的资源级别。

有了这个框架,我们可以独立添加更量身定制的指标(例如搜索查询负载指标),从而为自动扩展决策增添智能。这将使 Elastic Cloud Serverless 项目随着时间的推移更加动态地响应用户的工作负载。

结论

这些只是我们在构建 Elastic Cloud Serverless 过程中做出的一些有趣的架构决策。我们相信,这个平台为我们提供了一个基础,使我们能够随着时间的推移快速向用户交付更多功能,同时更易操作、高性能、可扩展且成本高效。敬请关注未来的几篇文章,我们将深入探讨上述概念中的一些内容。

准备在你的应用中构建 RAG 吗?想尝试使用矢量数据库的不同 LLMs 吗? 请查看我们在 Github 上的 LangChain、Cohere 等示例笔记本,并参加即将开始的 Elasticsearch 工程师培训!

原文:Building Elastic Cloud Serverless — Elastic Search Labs

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

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

相关文章

解决Ubuntu无法使用root登录的问题

1、登录普通用户 2、使用vi编辑器打开/etc/pam.d/gdm-autologin并注释掉auth required pam_succeed_if.so user ! root quiet_success 3、使用vi编辑器打开/etc/pam.d/gdm-password并注释掉auth required pam_succeed_if.so user ! root quiet_success 4、注销用户重新用roo…

【Linux安全】Firewalld防火墙

目录 一.Firewalld概述 二.Firewalld和iptables的关系 1.firewalld和iptables的联系 2.firewalld和iptables的区别 三.Firewalld区域 1.概念 2.九个区域 3.区域介绍 4.Firewalld数据处理流程 四.Firewalld-cmd命令行操作 1.查看 2.增加 3.删除 4.修改 五.Firewa…

最新FinalShell专业版激活

支持的版本 可以激活任意版本的FinalShell为专业版,包括最新版4.3.10 激活方式 打开FinalShell,点击左下角 激活/升级。 账号密码任意输入几个字符,点离线激活。 复制机器码,将机器码发送给微信公众号【小白学算法】,即可获…

数据结构学习/复习15--排序部分复习总结

一、学过的排序 1.插入排序 2.希尔排序 3.直接选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.计数排序 二、各项排序的思想及改进(无特殊说明均以升序为例) 1.插入排序及其改进希尔排序 (1)插入排序的思想及具体操作细节 将一个数字按顺…

pytorch使用gpu训练模型

前言 仅记录学习过程,有问题欢迎讨论 因为网上博客参差不齐,我也踩了很多坑,留下我自己成功的经验哈哈。 1.安装CUDA和CUDNN 参考这个博客: https://blog.csdn.net/shdabai/article/details/131248257 2.安装gpu版本 pytorch …

【openlayers系统学习】3.6-3.7添加可视化选择器,手动选择可视化的图像源

六、添加可视化选择器(选择可视化的图像类型) 在前面的示例中,我们已经看到了同一Sentinel-2图像的真彩色合成、假彩色合成和NDVI渲染。如果能让用户从这些可视化中选择一个或更多,而不必每次都更改我们的代码,那就太…

【热门话题】一文带你读懂公司是如何知道张三在脉脉上发了“一句话”的

按理说呢,A公司和脉脉属于不同的平台,而且脉脉上大家可以匿名发言,所以,即便我坐在你边上,我发了一句话上去,你也不知道是谁发的。但通过一些技术,我们却可以分析出,公司是如何知道张…

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以,采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书,gitee会初始化2两份…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

基于Django框架深度学习口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着全球疫情的蔓延,口罩成为了重要的防护工具。然而,在实际场景中&am…

MySQL —— 复合查询

一、基本的查询回顾练习 前面两章节整理了许多关于查询用到的语句和关键字,以及MySQL的内置函数,我们先用一些简单的查询练习去回顾之前的知识 1. 前提准备 同样是前面用到的用于测试的表格和数据,一张学生表和三张关于雇员信息表 雇员信息…

qt 布局学习笔记

目录 管理信息列表源码 c版: pro文件: qt 设置水平布局,里面有两个按钮,每个按钮就变的很宽,怎么设置按钮的精确位置 设置固定大小: 使用弹性空间(Spacer) 使用布局比例&…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新,追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

达梦数据库详解

达梦认证是指针对中国数据库管理系统(DBMS)厂商达梦公司所推出的数据库产品,即达梦数据库(DMDB),进行的一种官方认证体系。达梦认证旨在验证数据库管理人员对达梦数据库产品的掌握程度,及其在数…

【AD936X】 SDR 版图 欣赏

DIE : 4336x4730 um 的 65 nm 芯片 在顶部金属上,您可以看到 PLL 的电感器和日期代码 - 芯片在推出前两年就已准备就绪: 右下角是主数字块,应该是 128 抽头 FIR 滤波器。在最大放大倍率下,我们可以看到一排排标准单元。它们的放置…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速,可以看我往期视频,这回改成yolov8bytetrack实现,实时性更好,原理和原来一样。车流量进出统计车速测量优点: 使用目标检测算法考虑bbox抖动,解…

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日,绿联科技举行了“新一代存储方式未来已来”发布会,发布了绿联NAS私有云DXP系列(包括两盘位到八盘位的九款新品)以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品,共有两盘位、四盘位、…

Windows DNS 服务器配置转发器

DNS服务器转发器 在企业中由于自身条件的限制, 可能本身的DNS新能并不是很好,这个时候通过使用转发器功能, 将收到的DNS请求转发给另外一台高性能的DNS服务器,让其做后面的迭代查询。 1. 选择DNS服务器, 右击选择属性…

【LeetCode:496. 下一个更大元素 I + 单调栈】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…