十二年磨一剑:三代架构演进,打造高性能、低成本的块存储!

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 上周,全球计算机存储顶会USENIX FAST 2024 在美国加州圣克拉拉召开,继去年获得国内首个FAST最佳论文奖后,凭借在分布式块存储上的创新,阿里云新作再次斩获FAST大会最佳论文奖。这也是国内唯一一家连续两年获得FAST最佳论文奖的科技公司。

image.png

(阿里云块存储团队论文获 FAST 2024最佳论文)

FAST全称为Conference on File and Storage Technologies,创办于2002年,是由美国高等计算系统协会(USENIX)和美国计算机学会操作系统专业组织(ACM SIGOPS)联合组织的聚焦存储领域的顶级国际会议,代表了计算机存储领域的国际最高水平。创办二十多年来,FAST 推动了如软硬件结合、RAID、闪存文件系统、非易失内存技术和分布式存储等多项存储相关技术的发展。

本次的最佳论文来自阿里云存储团队,详细阐述了过去十余年阿里云弹性块存储(EBS)的架构演变。为应对用户需求和硬件发展,块存储三代系统架构设计焦点从最初的简单可用性,转变到第二代架构的高性能和低成本,演进到第三代架构的对 IO执行效能极致优化,实现了阿里云企业级块存储ESSD百微秒级平均延迟和毫秒级长尾延迟,单块云盘达到百万IOPS和4GiB/s 吞吐,有力支撑数据库、搜索和推荐等众多性能敏感型业务。基于高速非易失性内存,阿里云块存储进一步推出ESSD PL-X产品,单块云盘可提供30 微秒平均延迟,高达三百万IOPS和12GiB/s吞吐,为用户提供更极致的存储性能。

image.png

(阿里云技术专家张伟东在FAST 2024上介绍阿里云存储技术)

作为阿里云存储的关键技术成果之一,本文将对这篇论文进行深度解读。
论文全称:
《What’s the Story in EBS Glory: Evolutions and Lessons in Building Cloud Block Store》

01:十二年磨一剑:三代架构演进,打造高性能、低成本的块存储!

过去的 12 年间,阿里云块存储一共演进了三代架构,每一代架构升级都给用户提供了更高的性能和更低的成本,同时我们通过不断优化高可用的架构设计,为块存储的稳定性保驾护航。

  • 简单易部署的初代架构

image.png

初代架构采用计算存储分离的架构。以简单易部署为目标。
计算节点中我们部署了客户端(BlockClient),用户虚拟机(VM)中的盘(VD)通过 BlockClient 向后端存储集群发送读写请求。计算节点中的单用户云盘在后端集群中被分配给一个独立的块存储服务器(BlockServer),负责进一步以多副本形式转发到不同 Chunk 存储服务器(ChunkServer)中以实现数据的容灾。

初代架构在 IO 路径上采用了 多对一映射(云盘到存储服务器)和 原地更新(In-place Update)的设计。一个用户的云盘同一时间只会被一个 BlockServer 服务,每个 BlockServer 同时服务多个云盘。同时,BlockServer 通过将用户云盘的地址空间线性划分为相同大小的 Chunk(通常为 64 MiB 大小),通过 ChunkServer 以 Ext4 文件的形式存储在 HDD 中。对云盘地址空间中每个数据块的更改,BlockServer 直接将请求转发到对应 3 副本的 ChunkServer,由 ChunkServer 直接修改文件。

初代架构设计的选择促进了业务的快速上线,然而在性能和成本方面有所局限。多对一映射意味着盘的热点可能集中在存储集群的单节点中,性能也受到单节点的制约。原地更新方式使得数据压缩和纠删编码的部署难度变大,因为它们会改变数据块的大小,数据在压缩和纠删过后,无法以原地更新的方式再次写入。

  • 高性能、低成本的第二代架构!

image.png

第二代系统架构基于初代架构进行了大幅度创新,通过地址空间分段、采用日志结构以及部署压缩和纠删编码技术,极大提高了盘的性能并降低了存储成本。

从二代开始,块存储的业务逻辑与文件管理逻辑分开,文件管理逻辑由 盘古分布式文件系统 进行管理,并成为阿里云多项存储业务(EBS,OSS,OTS 等)的底座。在块存储业务中,我们采用了全闪存(SSD)集群,并设计了闪存友好的系统架构。

第二代架构首先采用了地址分段设计(Disk Segmentation Design),每个用户的盘逻辑地址空间被线性划分为多个连续的SegmentGroup(通常为数百 GiB),包含多个Segment(代表数十 GiB 的地址空间)。SegmentGroup的地址空间到Segment的地址空间映射类似于RAID0,以提高读写并行度。采用地址分段后,BlockServer以Segment为粒度管理用户的盘。至此实现了用户盘更高的性能可扩展性,提高更高的性能。

进一步,第二代架构采用了日志结构设计(Log-Structured Design),盘古文件系统提供了可供追加写的文件类型,BlockServer 得以不以就地更新的方式去写数据,而是采用追加写的方式。用户的写首先经由地址分段设计机制映射到唯一的Segment上,由BlockClient发送到对应的 BlockServer。BlockServer将由BlockClient来的请求转换为追加写的请求,并维护类似 LSM-tree 结构作为索引。

为提供更便宜的块存储服务给用户,基于日志结构设计,第二代架构部署了压缩(Compression)和纠删编码(Erasure Coding)。通过后台转储服务,第二代架构得以将数据利用后端计算资源从三副本转换为压缩和纠删编码格式。同时,BlockServer 在数据写入时无需感知存量数据的位置,用户的服务完全不受影响。

第二代架构大幅提升了单盘性能并实现了成本的降低。基于第二代架构,阿里云块存储推出ESSD云盘,实现1百万 IOPS, 4GiB/s 吞吐,100us平均延迟的高性能企业级产品。然而,随着硬件架构的不断发展,SSD每 GB 价格的不断下降,块存储的成本逐渐从空间敏感型转向了流量敏感型。因此,第二代架构带来的流量放大已不可忽视。对于每个写请求,BlockServer由于不采用数据压缩/纠删编码技术,仍然以三副本形式写入到盘古中。在后台进行转储时,数据需要再次从盘古读取并以压缩和纠删编码形式重新写入。部署数据表明,该架构的流量放大高达 4.69 倍,这成为了限制成本继续降低的又一瓶颈。

  • 极致 IO 效能的第三代架构
    image.png

第三代系统架构基于第二代架构继续创新,通过引入融合写入引擎,进一步降低了流量的放大系数。同时,第三代架构卸载数据压缩到 FPGA 中,进一步降低 CPU 开销,实现极致的 IO 效能。

第三代架构引入了名为融合写入引擎的设计,并在用户的写路径上实现了在线的数据压缩和纠删编码。在融合写入引擎的设计下,不同用户的写请求数据,先由BlockServer先聚合到名为 JournalFile 的文件,然后持久化到盘古中。

这一设计的核心巧妙之处在于,将不同的低流量用户的写入在时间上聚合,从而使得在短时间内可以聚集得到压缩和纠删编码所需要的数据量(压缩单元和纠删编码单元通常需要数十KiB,而单个Segment的流量较小,通常不能在低延迟的场景下积累起足够多的数据量)。通过在用户的写路径上在线使用压缩和纠删编码技术,流量放大得到显著下降。

更进一步,BlockServer会在内存中以Segment为粒度积累每个用户的写请求数据,然后当数据量达到一定量时(通常为数MiB),BlockServer通过后台的Dump操作将数据以压缩纠删编码格式的 DataFile 持久化到盘古中。通过在聚合和Dump操作中都使用数据压缩和纠删编码,第三代架构的流量放大得以大幅下降。部署数据显示,流量放大相较第二代架构下降了66%。

JournalFile和DataFile虽然形式上都经过压缩和纠删编码,但其数据本身和用途却有很大差别。一方面,JournalFile中混合了来自不同用户和不同 Segment 的数据,因此JournalFile在大部分时间内是不会被读取的,除非BlockServer发生故障。另一方面,DataFile主要用来服务用户的读请求。因为DataFile是以Segment为粒度存储数据,因此在处理用户读请求时,从DataFile中读取数据的开销远小于从 JournalFile 读取。

通过融合写入引擎,BlockServer在用户写路径上实现了在线的数据压缩和纠删编码,但这些计算操作带来了额外开销。例如,使用CPU压缩一个 16 KiB的数据块,延迟将增加25us。 这一开销在平均延迟为100us的ESSD云盘中是不可接受的。

基于此,为避免在线数据压缩带来的额外延迟,我们将数据压缩卸载到定制的FPGA中。我们在FPGA中实现了一个调度器来将数据块拆分为固定大小的(例如,4 KiB)片段,并且利用多个执行单元并行地执行这些片段的 压缩/解压缩 任务。为确保数据完整性,我们在数据压缩链路中实现了端到端的CRC检查。在FPGA返回压缩数据后,BlockServer会立即解压数据,并通过 CRC 检查来验证数据完整性。

02:高可用架构助力块存储平稳运行

伴随着十二年高速发展,阿里云块存储不仅给用户带来高性能和低成本的块存储服务,也在生产过程中沉淀了丰富的高可用的架构设计。我们关注服务故障时的爆炸半径(即单一角色故障时影响的客户数目),并设计低爆炸半径的架构,来增强系统的稳定性。

  • 控制面:分组 BlockManager

在第二代架构的最初设计中,控制面由三个部署在不同机器上的进程(BlockManager)组成。其中一个机器上的BlockManager作为主要角色服务单存储集群内所有的控制面请求。随着集群规模的扩大,单一节点需要管理的用户数目急剧增加,当该节点出现故障时,受到影响的用户数会增加。

image.png

(分组 BlockManager 的架构图)

在这样的背景下,我们设计了分组架构的控制面(Federated BlockManager)。分组架构中,服务控制面请求的角色被分拆到多个机器上,每个机器管理一组分区(Partition),其中每个分区管理一小组用户的盘。

同时,我们引入了轻量级的中心管理角色(CentralManager)。CentralManager 负责管理BlockManager的状态,以及对Partition在BlockManager之间进行均衡调度,不参与用户关键路径。

在分组架构的设计下,单一机器宕机对用户的影响急剧减少。举例而言,对于在百台数量规模的集群,在最初设计中,一个控制面机器的宕机会影响 10 万级的用户。在分组架构下,通过在每一台机器上部署一个BlockManager,单机宕机影响的用户范围下降到数千级别。更进一步,通过创建更小粒度的Partition(通常为百盘级)来维护盘的元数据,宕机时元数据的恢复速度也得以提升。单一机器宕机,CentralManager可以在多个BlockManager上并行加载盘的元数据,显著提高控制面的可用性。

  • 数据面:逻辑故障域(Logical Failure Domain)

数据平面由一个存储集群内的多个 BlockServer 组成,每个BlockServer同时服务数千个 Segment 并处理这些Segment的I/O请求。当一个BlockServer崩溃时,控制平面会将其服务的所有Segment迁移到集群中的其他BlockServer上,以便 I/O可以快速在其他BlockServer上恢复。

然而,这种机制可能导致故障在BlockServer间迅速传播并造成级联故障。具体来说,如果崩溃是由异常的Segment(例如,错误的代码实现)引起的,迁移后,BlockServer会再次崩溃。在这种情况下优化Segment调度以加快恢复速度可能会导致更多的BlockServer在短时间内崩溃,甚至导致整个集群的服务异常。

根据生产经验,我们得到了 3 个重要观察:

  1. 故障通常源于单个云盘或Segment的请求,因此我们需要监Segment的状态而不是BlockServer。

  2. 故障的根本原因大多是软件错误(例如,代码Bug或错误的配置),因为硬件或机械故障不太可能使得故障随着Segment的迁移而扩散。由软件引起的故障可能需要大量的时间才能最终确定问题的罪魁祸首,更不用说构建自动恢复工具了。因此,更实际的方法是主动减少影响。

  3. 如果不加干预,级联故障可能会迅速传播到整个集群。作为一个分布式服务,我们可以容忍一些BlockServer服务异常,但是不能发生整个集群的宕机。

基于这些观察,我们设计了逻辑故障域。其核心思想是通过将可疑Segment分配到一组特定的BlockServer中来隔离它们,以避免其他BlockServer甚至整个集群受到影响。我们首先将每个Segment与一个最大容量为 3 的唯一令牌桶关联起来。每次Segment被迁移到新的 BlockServer 都会消耗一个令牌,并且令牌每 30 分钟重新填充一次。当令牌桶为空时,Segment的任何迁移只能从 3 个预先指定的BlockServer中选择一个,称其为逻辑故障域。

Segment-level故障域可以有效地隔离异常的Segment。然而,如果存在多个异常的Segment(例如,来自一VD)甚至是异常的云盘,Segment-level故障域不足以防止多个级联故障同时发生。

我们的解决方案是将故障域合并为一个。具体来说,当存在多个Segment形成一个故障域时,我们选择第一个故障域作为全局故障域,以确保最多只有 3 个BlockServer被隔离用于级联故障,而不会降低集群容量。任何后续的具有空令牌桶的Segment都将共享同一个全局故障域。在部署逻辑故障域后,我们成功地防御了由Segment迁移引起的多次潜在的级联故障。

03:结语

目前,阿里云在分布式存储领域已积累了一系列创新实践,并发表于计算机系统领域顶级会议上,包括自研分布式存储系统底座盘古(FAST 2023),面向云原生的大规模文件系统(FAST 2023),基于叠瓦式磁盘高性能存储引擎(FAST 2023),高性能分布式键值存储系统(SIGMOD 2021)。

image.png

(阿里云存储资深专家储道介绍阿里云盘古分布式存储系统论文)

以外,在高性能存储网络方面,自研的高性能用户态协议栈(ATC 2023),自研的高性能 RDMA 存储网络(SIGCOMM 2022),HPCC 流控算法(SIGCOMM 2019),RDMA 网络的大规模实践和优化(NSDI 2021),引领了云存储进入微秒延迟时代。前不久,阿里云分布式存储技术还获了中国发明专利金奖。

image.png

(阿里云分布式存储技术专利获中国专利金奖)

目前,相关技术已广泛应用到阿里云统一存储平台盘古分布式存储中,并成为阿里云提供存储服务的基础升级方案。所支撑的存储服务已广泛应用于铁路12306、云上奥运会、电子社保卡、医保平台、数字政府、城市大脑、杭州亚运等重要工程,为全球数百万客户提供服务,累计服务超9亿人次。

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
相关文章
|
1月前
|
消息中间件 Kubernetes Java
构建高性能微服务架构:从理论到实践
【2月更文挑战第24天】 在当今快速发展的数字化时代,微服务架构已成为软件开发领域的关键趋势。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、技术选型和性能优化策略。我们将通过实际案例分析,揭示微服务架构在提高可伸缩性、容错性和维护性方面的优势,并讨论在实施过程中可能遇到的挑战及其解决方案。
|
1月前
|
机器学习/深度学习 人工智能 算法
【AAAI 2024】再创佳绩!阿里云人工智能平台PAI多篇论文入选
阿里云人工智能平台PAI发表的多篇论文在AAAI-2024上正式亮相发表。AAAI是由国际人工智能促进协会主办的年会,是人工智能领域中历史最悠久、涵盖内容最广泛的国际顶级学术会议之一,也是中国计算机学会(CCF)推荐的A类国际学术会议。论文成果是阿里云与浙江大学、华南理工大学联合培养项目等共同研发,深耕以通用人工智能(AGI)为目标的一系列基础科学与工程问题,包括多模态理解模型、小样本类增量学习、深度表格学习和文档版面此次入选意味着阿里云人工智能平台PAI自研的深度学习算法达到了全球业界先进水平,获得了国际学者的认可,展现了阿里云人工智能技术创新在国际上的竞争力。
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
241 5
|
1月前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
2天前
|
JSON API 数据库
后端架构设计与优化:打造高性能应用后端
后端架构设计与优化:打造高性能应用后端
10 2
|
12天前
|
监控 负载均衡 API
构建高性能微服务架构:后端开发的最佳实践
【4月更文挑战第14天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了后端开发人员在设计和维护高性能微服务时需要遵循的一系列最佳实践。我们将从服务划分原则、容器化部署、API网关使用、负载均衡、服务监控与故障恢复等方面展开讨论,并结合实际案例分析如何优化微服务性能及可靠性。通过本文的阅读,读者将获得实施高效微服务架构的实用知识与策略。
|
23天前
|
消息中间件 监控 API
构建高性能微服务架构:从理论到实践
【4月更文挑战第4天】 在当今互联网应用的快速迭代和高并发需求下,传统的单体应用架构已不足以满足市场的灵活性与扩展性要求。微服务架构以其独立部署、弹性伸缩、技术多样性等优势,成为众多企业转型升级的首选方案。本文将深入探讨如何构建一个高性能的微服务系统,涵盖关键组件的选择、系统设计的考量以及性能优化的策略,旨在为开发者和架构师提供一套实用的指导思路和具体实践步骤。
|
1月前
|
缓存 负载均衡 数据库
构建高性能微服务架构:后端开发的终极指南
【2月更文挑战第30天】 随着现代应用程序向微服务架构的转型,后端开发者面临着提高系统性能、确保可靠性和易于维护性等挑战。本文深入探讨了构建高性能微服务的策略,包括服务拆分、数据库优化、缓存机制以及负载均衡等关键技术。通过实际案例分析与最佳实践分享,我们旨在为后端开发人员提供一套全面的指导方针,帮助其在不断变化的技术环境中保持竞争力。
|
1月前
|
存储 Kubernetes 固态存储
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
IEEE HPCA 2024|LightPool:高性能、轻量级的存储池化架构
|
1月前
|
消息中间件 缓存 数据库
构建高性能微服务架构:后端开发的进阶之路
【2月更文挑战第30天】 在当今互联网技术迅速发展的背景下,传统的单体应用已经难以满足日益增长的业务需求。微服务架构以其灵活性、可扩展性和容错性成为解决复杂系统问题的有效方案。本文将探讨如何构建一个高性能的微服务架构,包括关键技术选型、系统设计原则以及性能优化实践,旨在为后端开发人员提供一条提升系统处理能力和稳定性的进阶路径。

相关产品