AutoMQ Kafka 云上十倍成本节约的奥秘(一): SPOT 实例

news2024/9/24 23:28:40

近年来,无论是海外还是国内,虽然受疫情影响,公有云的市场规模增速有所放缓,但是云的市场总规模仍然是持续增长的。公有云作为一个各个国家重点布局的战略方向和其本身万亿级市场的定位[1],我们学习用好云是非常有必要的。
AutoMQ Kafka 充分认识到“云优先”的重要性,围绕公有云具备规模化效益和技术红利的云基础设施重新设计了 Kafka。在保证 100% 兼容 Apache Kafka 的基础上带来了极致的云成本优势和弹性能力,云上综合有 10 倍以上的成本节约[2]。今天就和大家分享下 AutoMQ Kafka 云上成本节约的利器之一,Spot 实例。

01 Spot 实例应用的挑战

Spot 实例本质上是一种实例购买类型。Spot 实例是云计算实例规模化成本红利的产物,通过机器的分时复用来提升利用率,从而推出更加廉价的实例购买类型。这本身也是云厂商相比私有 IDC 自建机房固定资源预留带来的规模化优势。Spot 实例本身的硬件能力和正价的按需实例别无二致,但是其价格可以低至按需实例的价格的1折。用好 Spot 实例将使得软件系统在云上获得极大的成本节约。
使用 Spot 实例本质就是薅云厂商的羊毛。Spot 实例诱人的价格令人心动,但是其存在的一个最大的问题就是——不确定性。云厂商不会对 Spot 实例的可用性提供 SLA,根据云厂商的规则,在必要的时候云厂商会直接发起 Spot 实例的回收流程,终止 Spot 实例。对于 AutoMQ 来说,如何以一种确定性的方式来使用 Spot 实例,为用户提供有 SLA、可靠的 Kafka 服务,是我们面临的主要挑战。AutoMQ Kafka 通过大量应用 Spot 实例来降低总体计算成本[3]。在经过诸多实践后,我们得出一些在 Spot 实例上提供可靠 Kafka 服务的方法。

02 在不可靠的 Spot 实例上提供可靠的服务

Broker 无状态化

由于 Spot 本身随时会中断的特性, 云厂商的 Spot 实例最佳实践基本[4]都会强调 Spot 实例适用于无状态的应用。因此一个软件系统“无状态”完成得越彻底, 则 Spot 实例则会被利用得更彻底。
有状态引用最大的问题在于其状态数据的迁移、恢复。以 Apache Kafka 为例,即使在 3.6.0 版本以后支持了分级存储(非 GA)的特性[5],其 broker 仍然是有状态的设计,对于每个 broker 上的分区数据要求最后一个 logsegment 必须在一级存储上。当这个 logsegment 非常大时,占用的一级存储空间将会非常大,当其关联的 broker 下线时,这些状态数据迁移是非常耗时的。如果不采用分级存储,这种迁移花费数小时甚至数天[6]都是很常见的。
AutoMQ Kafka 虽然在架构上除了依赖对象存储以外还依赖 EBS 块存储,但是其本质上是采用了一个无状态的架构,一级存储是松耦合的,充当一个缓冲区的角色。下图可以揭示 Apache Kafka 的多级存储和 AutoMQ 存储架构的区别。AutoMQ Kafka 使用的 EBS 写入缓冲区默认值为固定的 3GB,在扩缩容场景可以完成秒级甚至毫秒级下线(取决于具体采用的机型)。

大量应用 Spot 实例,会存在集群中计算实例的频繁上下线,如果采用 Apache Kafka,不仅需要人为介入处理 Spot 实例的替换,同时这种频繁的上下线、分区数据移动将会造成系统明显抖动,对数据的生产、消费产明显的影响。而 AutoMQ Kafka 由于其无状态的设计,很好的规避了这种问题,即使使用大量的 Spot 实例,也可以将这种实例替换带来的系统抖动降低到最小,以业务无感的方式完成 Spot 实例的替换。

极速的弹性与 Serverless

AutoMQ Kafka 是天然支持 serverless 的。系统本身的弹性速度和质量决定过了其所能提供的 Serverless 服务质量。Spot 实例的大量应用,由于不可预期的回收行为,会导致整个系统使用的计算实例经常性地被置换。在这个过程中,AutoMQ Kafka 所在计算实例接受实例终止信号到新的 Spot 实例被替换后启动 AutoMQ Kafka 并且重新接受流量整个冷启动过程的耗时长短决定着 AutoMQ Kafka 弹性的效率。
以 Apache Kafka 为例,如果使用 Spot 实例并且产生了实例的置换,其整个冷启动的过程如下。从图上我们可以非常清晰的看到,当数据规模较大时(TB 级)或者存在分区热点时,Apache Kafka 整个冷启动时间中执行手动完成分区迁移、数据拷贝、流量重新均衡的过程耗时十分长,可达小时甚至是天级别[6],而采用 AutoMQ Kafka 由于其采用可靠性和可用性分离的设计,单副本即高可靠,整个分区移动过程无任何数据拷贝[7]。下图可以清晰看到,如果采用 Apche Kafka 在数据规模较大的场景下是完全没法应用 Spot 实例并且提供 serverless 能力的,因为在冷启动的整个时间轴上,Apache Kafka 在分区移动和流量重平衡两个过程的耗时占据着总耗时绝对的比重。不将这两块耗时降低到与其他冷启动阶段相同数量级下,spot 实例的应用和 serverless 也无从谈起。

与之相反的是,AutoMQ Kafka 凭借其秒级分区迁移[9]和持续流量重平衡[8]等杀手锏特性,不仅将高危的、重运维的分区移动和重平衡的耗时降低到秒级,同时整个过程还是自动化的,相比 Apache Kafka 而言,有了跨时代的进步。当软件系统本身有较短的冷启动时间以后,围绕冷启动的其他阶段进行优化才有意义。在 AutoMQ 内核不再成为冷启动瓶颈的情况下,AutoMQ 也将不断探索利用容器技术、GraalVM AOT 编译等手段提升整个端到端冷启动的效率,给大家带来更快、更好的弹性能力。

充分利用云 Spot 实例的终止信号

Spot 实例回收的一般流程遵循如下流程,先发送终止信号,然后等待若干秒后再强制终止机器。不同云厂商的 Spot 实例的终止流程基本是如下流程的变种,核心路径基本相同。AutoMQ Kafka 的架构上使用了一块非常小(默认 3GB)的云盘 SSD (AWS 上即 EBS,下文皆以 EBS 表示云盘 SSD)来充当缓冲区的角色,以保证 AutoMQ Kafka 追尾读的低延迟。得益于 AutoMQ Kafka 无状态的 Broker 设计,EBS 上只会残留约几百 MB 左右的少量缓存数据,只要保证 Spot 实例在接收到终止信号的等待期间将这部分数据刷到对象存储上,即可完成优雅停机。
AutoMQ 充分利用了这个实例终止信号,通过感知这个实例终止信号,然后在实例接收到终止信号的这段等待时间内提前执行刷出 EBS 缓存数据的操作来完成优雅停机。不同云厂商开放给用户去感知这个终止信号的方式会有差异,但是基本都会预留至少 10 秒以上的等待时间来让应用执行优雅下线,而这预留的时间对于 AutoMQ 来说是完全足够的。

Spot 实例友好的容灾机制

前面小节提到了 AutoMQ Kafka 利用 Spot 实例终止信号后的一小段等待时间来完成优雅停机,这时候一定会有聪明的小伙伴提出质疑:我们应该考虑面向失败的设计,最坏情况下例如网络异常、系统负载异常卡顿导致 AutoMQ 来不及将数据在终止信号后的这段等待时间及时刷出怎么办呢?其实,这种情况 AutoMQ 也已经考虑到了,因此专门设计了 Spot 实例友好的容灾机制[10]。
下图是整个容灾机制的简单示意图,总体上概括起来就是:

  1. AutoMQ 通过探测及时发现由于 Spot 实例回收而遗留的游离数据卷,通过云盘管理的 API 将其挂载到一台合适的新的计算实例上

  2. 将游离数据卷残留的少量数据刷出到对象存储

  3. 删除已经为空的数据卷

通过这种容灾机制,即使在最坏情况下,AutoMQ Kafka 仍然可以完成自动化的容灾,整个过程业务无感。

按需实例与 Spot 实例混部

AutoMQ Kafka 虽然大量应用了 Spot 实例来降低成本,但是仍然在两个纬度上保留了少量按需实例的使用,从而确保 AutoMQ 可以给用户提供可靠的 Kafka 服务。

KRaft 节点使用 on-demand 实例:

AutoMQ 的核心能力依赖的重要元数据依靠 KRaft,为了保证元数据的可靠性,参与 Raft 选举和保障元数据一致性的节点仍然使用的是 on-demand 实例,确保他们保持稳定。

Broker 集群支持 on-demand 和 Spot 实例混布:

以 AWS Spot 实例的实际使用情况来看,一个 30 台机器的 AutoMQ Kafka 集群,一天内会有若干次实例置换,这种零碎时刻的实例置换,在 AutoMQ 这种无状态和极致弹性的设计下对业务基本是无感的。Spot 实例的置换仅仅会导致部分分区数据的读写有秒级的 RT 抖动,这可以满足绝大部分 Kafka 的应用场景。即使如此,AutoMQ 也充分考虑到一部分对成本不敏感,但是对 RT 抖动要求非常苛刻的用户的诉求,允许用户调节 Broker 集群中 on-demand 实例的比例,权衡成本与延迟抖动频率。

回退按需实例Spot 实例除了存在会中断的问题,还存在容易库存不足的问题。对于云厂商而言,按需实例是有 SLA 的并且要最高优先级保障库存余量充足。如果一个地域某个可用区下的计算实例库存不足,则会优先用于满足按需实例的供给。在这种规则下,一些冷门地域或者可用区的 Spot 实例库存容量容易产生不足,当需要发生实例替换时,会存在无法购买到竞价实例的情况。

AutoMQ Kafka 为了应对可能出现的 Spot 实例库存不足的情况,提供了回退按需实例(后文简称该特性为 fallback)的能力。Fallback 本质就是探测并识别 Spot 实例库存不足的情况,然后在这种情况下重新购买按需实例来补充容量。并且 fallback 支持当 Spot 实例可以重新购买时,自动将集群中的按需实例重新替换成按需实例。该功能的总体实现主要是利用了弹性伸缩组本身容量管理的特性来达到的,因篇幅原因,后续会专门出一篇文章来介绍 fallback 能力的实现。

03 稳定性与成本之间的权衡

Spot 实例本身不可预期的中断、库存问题使得很多系统设计与开发者对其应用望而却步,持有过度的偏见。其实这种疑虑本质上源于不了解。正如世间没有绝对的安全一样,也不存在绝对的稳定性。稳定性的定义因应用场景而异,因为不同场景对于“稳定”的标准各不相同。在软件系统设计中,关键在于做出恰当的权衡。
以 AutoMQ 提供的 Kafka 为例,如果你可以容忍因 Spot 实例替换带来的某些时刻部分分区上秒级的 RT 抖动,那么你可以放心的使用较大比例的 Spot 实例从而获取巨大的成本节约;但是如果你是一个对 RT 抖动极度敏感的用户,那你也仍然可以全部采用按需实例,仅仅享受 AutoMQ 带来的极致弹性能力。简单而言,适合自己的才是最好的,也欢迎大家真正来体验 AutoMQ ,看看我们到底几斤几两。AutoMQ Kafka 核心代码均已在 GitHub 开源,欢迎来社区一起交流。

参考资料

[1] 中国通信院 云计算白皮书 2023

[2] AutoMQ Kafka 云原生重塑 Kafka 架构

[3] AutoMQ Kafka 成本分析报告

[4] EC2 Spot 的最佳实践

[5] Kafka Tiered Storage Early Access Release Notes

[6]Making Apache Kafka Serverless: Lessons From Confluent Cloud

[7] AutoMQ 单副本高可用

[8] AutoMQ 持续重平衡

[9] AutoMQ 秒级分区迁移

[10] AutoMQ Kafka issue 447
最后的最后,如果这篇文章对您有帮助和收获,请来 AutoMQ Kafka 开源仓库 给我们点一个小星星吧~

END

关于我们

AutoMQ 是一家专业的消息队列和流存储软件服务供应商。AutoMQ 开源的 AutoMQ Kafka 和 AutoMQ RocketMQ 基于云对 Apache Kafka、Apache RocketMQ 消息引擎进行重新设计与实现,在充分利用云上的竞价实例、对象存储等服务的基础上,兑现了云设施的规模化红利,带来了下一代更稳定、高效的消息引擎。此外,AutoMQ 推出的 RocketMQ Copilot 专家系统也重新定义了 RocketMQ 消息运维的新范式,赋能消息运维人员更好的管理消息集群。 

🌟 GitHub 地址:https://github.com/AutoMQ/automq-for-kafka

💻 官网:https://www.automq.com

👀 B站:AutoMQ官方账号

🔍 视频号:AutoMQ 

👉 扫二维码加入我们的社区群

关注我们,一起学习更多云原生干货

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

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

相关文章

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目,git clone 之后使用 async 之后出现一下现象: 首先确定是我网络本身是没有问题的,尝试几次重新 async 之后还是出现问题,网上找了一些方法解决了本问题,以此来记录一下问题是如何解决的。 …

网络地址相关函数一网打尽

这块的函数又多又乱,今天写篇日志,以后慢慢补充 1. 网络地址介绍 1.1 ipv4 1.1.1 点、分十进制的ipv4 你对这个地址熟悉吗? 192.168.10.100,这可以当做一个字符串。被十进制数字、 “ . ”分开。IP地址的知识就不再多讲…

关于MyBatis和JVM的最常见的十道面试题

ORM项目中类属性名和数据库字段名不一致会导致什么问题?它的解决方案有哪些? 在ORM项目中,如果类的属性名称和数据库字段名不一致会场导致插入、修改时设置的这个不一致字段为null,查询的时候即使数据库有数据,但是查…

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出,滑到最下面,出现这个就说明构建成功了,如果没有出现,说明构建有问题,需要解决好问题才能启动哦~

Python 九九乘法表的7种实现方式

Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一,因此各种语言都有对应的实现方式,而 Python 也不例外。在 Python 中,我们可以使用多种方式来生成一个简单的九九乘法表。 实现方式一:双重循环 f…

使用 Node.js 和 Cheerio 爬取网站图片

写一个关于图片爬取的小案例 爬取效果 使用插件如下: {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…

Android T 远程动画显示流程(更新中)

序 本地动画和远程动画区别是什么? 本地动画:自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画:拿来吧你!一个app A对另一个app B通过binder跨进程通信,控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…

F5负载均衡有何技术优势?为你详细解读

当今数字化时代,网络应用的性能对于企业的成功至关重要。负载均衡建立在现有网络结构之上,提供了有效的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。F5负载均衡技术则成为了许多企业实现高可用性和高…

原生table样式

HTML <div><table style"width: 100%;"><thead><tr><th style"width:25%;">董事会</th><th style"width:25%;">监事会</th><th style"width:25%;">股东</th><th sty…

物理信息神经网络PINN2024最新改良方案汇总(含复现代码)

传统的数值方法在处理复杂问题时可能需要大量的计算资源和时间&#xff0c;而改良后的PINN可以通过更有效的算法减少计算成本&#xff0c;使得求解过程更加高效。 在写论文时&#xff0c;我们也可以通过改进PINN减少数据需求、加速模型收敛、提高预测准确性、增强可解释性&…

linux -- 内存管理 -- SLAB分配器

SLAB分配器&#xff08;slab allocator&#xff09; SLAB分配器用于小内存空间管理&#xff0c;基本思想是&#xff1a;先利用页面分配器分配出单个或多个连续的物理页面&#xff0c;然后再此基础上将整块页面分割为多个相等的小内存单元&#xff0c;来满足小内存空间分配的需…

kerberos+kafka(2.13)认证(单节点ubuntu)

一&#xff1a;搭建kerberos。 1. 运行安装命令 apt-get install krb5-admin-server krb5-kdc krb5-user krb5-config2. 检查服务是否启动。 systemctl status krb5-admin-server systemctl status krb5-kdcsystemctl start krb5-admin-server systemctl startkrb5-kdc3. 修…

网络安全知识和华为防火墙

网络安全 网络空间安全 ---Cyberspace 2003年美国提出的网络空间概念 ---一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海、陆、空、天以外的第五大人类互动领域。 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安…

校园教学气象站是什么

TH-XQ3在当今社会&#xff0c;气象科学的重要性日益凸显。它不仅关系到农业、交通、航空等多个领域的安全&#xff0c;更对人类的生活产生深远影响。因此&#xff0c;许多学校纷纷开设气象学相关课程&#xff0c;帮助学生了解气象知识&#xff0c;培养他们的科学素养。而在这其…

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

termux 玩法(一)

termux基础 termux基础玩法推荐国光写的手册&#xff1a;Termux 高级终端安装使用配置教程 | 国光 (sqlsec.com) termux安装 个人使用F-Droid安装的termux&#xff1a;Termux | F-Droid - Free and Open Source Android App Repository 基础知识 这些基础知识简单了解一下…

HDFS Federation前世今生

一 背景 熟悉大数据的人应该都知道&#xff0c;HDFS 是一个分布式文件系统&#xff0c;它是基于谷歌的GFS实现的开源系统&#xff0c;设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode&#xff0c;如下 从上面…

【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本&#xff0c;和插入排序有着相同的特性&#xff0c;即原始数组有序度越高则算法的时间复杂度越低&#xff08;预排序机制&#xff09;&#xff0c;但是是不稳定排序算法。 为了降低算法的时间复杂度&#xff0c;所以我们需要在排序之前尽…

3D效果图加树进去太卡,渲染太慢怎么办?

周末的时候&#xff0c;有个朋友私信来问&#xff1a;3dmax模型加树进去打开时特别的卡&#xff0c;是怎么回事。 不知道有没有朋友遇上这么个情况。 3dmax加树建议就用代理&#xff0c;这样相比于直接加而言&#xff0c;会流畅许多。 在3D效果图中&#xff0c;“树代理”是…

计网Lesson11 - 虚拟机网络环境及socket概述

文章目录 虚拟机的简述socket概述 虚拟机的简述 放张图在这&#xff0c;根本没明白是啥对啥&#xff0c;以后学了Linux再来吧 &#x1f626; socket概述 s o c k e t socket socket 是一种用于应用层的用户态与应用层以下的内核态交互的工具&#xff0c;本意为“插座”。 也就是…