亚马逊AWS官方博客

利用 GP3 EBS 卷组建 RAID 0 提升磁盘性能:设置与快照恢复指南

风险提示:使用 gp3 卷组建 Raid 0 虽然可以低成本有效提高 I/O 性能。但由于其没有冗余性,任何一个卷遭遇意外故障导致不可用,都将使整个 Raid 0 阵列失效。这会造成当前时间至最近一个多卷备份时间间隔内的数据丢失。因此,出于最佳实践的考量,我们强烈建议通过使用 io2 和 io1 EBS 卷实现高 I/O。

背景

在云计算环境中,存储性能往往成为许多应用的瓶颈。特别是对于数据密集型工作负载,如大数据处理、数据库应用和高性能计算等,单一存储卷的 I/O 性能可能无法满足需求。AWS 提供了多种 EBS 卷类型,其中 GP3(General Purpose SSD)卷凭借其可调整的性能参数和相对较低的成本,成为构建高性能存储系统的理想选择。然而,单个 GP3 卷(最高可提供 16,000 IOPS 和 1,000MB/s 的吞吐量)在某些场景下可能无法满足需求。这时,通过组合多个 EBS 卷来组建 RAID 0 就成为了低成本提升存储性能的有效方案。在本篇文章中,我们将探讨如何使用 AWS GP3 EBS 卷设置 RAID 0 阵列,如何进行故障恢复,以及如何对恢复的磁盘进行预热来保障磁盘性能。

什么是 RAID 0?为什么要使用 GP3 EBS 卷搭建 RAID 0?

RAID(Redundant Array of Independent Disks,磁盘阵列)是一种将多个磁盘组合起来形成一个逻辑存储单元的技术。通过多个磁盘的组合,从而可以提供比单个磁盘更高的存储性能。RAID 有多种级别,而 RAID 0 是其中性能最高的一种。RAID 0 采用数据条带化技术,将数据均匀地分布在多个磁盘上。当进行读写操作时,多个磁盘可以并行工作,从而显著提升 I/O 性能。理论上,N 个磁盘的 RAID 0 阵列可以提供接近 N 倍于单个磁盘的性能。因此,RAID 0 非常适合需要高 IOPS 的应用场景。

然而,RAID 0 不提供任何数据冗余。如果阵列中的任何一块磁盘发生故障,整个阵列将无法使用并导致数据丢失。因此,RAID 0 虽然能显著提升性能,但是必须配合可靠的备份策略使用。

AWS 的 GP3 卷是最新一代的通用 SSD 支持的 EBS 卷,提供了成本与性能的平衡,可以独立配置 IOPS 和吞吐量,单卷最高可达 16,000 IOPS 和 1,000 MB/s。通过将多块 GP3 EBS 卷组成 RAID 0,您可以低成本显著提升磁盘性能,适合性能敏感但对冗余要求不高的场景。

EC2 实例与 EBS 性能考量

在构建高 IOPS 的 RAID 0 阵列前,需要注意 EC2 实例类型对 EBS 性能的限制。不同 EC2 实例类型支持的 EBS 带宽和 IOPS 上限各不相同。例如:m8g.large,基准吞吐量 78.75MB/s,基准 IOPS 为 3600,最大 IOPS 为 40000。每 24 小时可以维持一次 30 分钟的最大性能,之后会恢复到基线性能。因此,该实例无法持续维持在最大 IOPS 40000 的性能上。而 m8g.8xlarge,最大 IOPS 为 40000,并且可以长期维持在 40000 的水平上。更多详细的实例性能限额请参考官方文档: https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ebs-optimized.html

因此,在配置 RAID 0 阵列前,请务必查阅实例性能限额来确认您的 EC2 实例类型支持的最大 EBS 性能是否满足您的最终需求。如果 RAID 0 阵列的理论性能超过 EC2 实例的 EBS 性能上限,您将无法充分利用 RAID 0 的性能优势。

逐步指南:使用 GP3 EBS 卷设置 RAID 0

以下是以运行 Amazon Linux 2023 的 EC2 实例为例的使用多个 GP3 卷配置 RAID 0 阵列的步骤。

前提条件

  • 一台 EC2 实例,其性能足以支持 RAID 0阵列的合并 IOPS 和吞吐量。本文将以 m8g.12xlarge 为例构建由 3 块 GP3 EBS 卷组成的 RAID 0 阵列并进行性能测试。
  • 基本的 Linux 命令和 AWS 管理控制台操作知识。

步骤

1. 创建 EC2 实例

创建 m8g.12xlarge 实例并挂载根卷和额外三块 GP3 卷。磁盘大小可以根据实际需求进行修改。例如,根卷为 30GB;其余三块 GP3 磁盘每个 1TB,每块磁盘更改 IOPS 为 16000,并更改 Throughput 为 1000。

2. 为 EC2 实例组建 RAID 0 阵列

EC2 实例创建完成后,通过 ssh 登陆到实例上,并通过以下 linux 指令搭建 RAID 0:

sudo yum update
sudo yum install mdadm -y
sudo yum install fio -y

sudo mdadm --create --verbose /dev/md0 --level=0 --name=MY_RAID --raid-devices=3[根据自己的磁盘数量定义] /dev/sdb /dev/sdc /dev/sdd [使用自己的磁盘名称代替]
sudo cat /proc/mdstat

sudo mkfs.ext4 -L MY_RAID /dev/md0

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
sudo mkdir -p /mnt/md0
sudo mount LABEL=MY_RAID /mnt/md0

sudo cp /etc/fstab /etc/fstab.orig
echo "LABEL=MY_RAID /mnt/md0 ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab
sudo mount -a

性能测试

由于三块 GP3 磁盘的 IOPS 均为最大值 16000,因此,理论上 RAID 0 的读写 IOPS 可达到三块磁盘之和,即 48000。我们通过 fio 对 RAID 0 的读写性能进行测试。Fio  (Flexible I/O Tester) 是一个开源的 I/O 性能测试工具,用于在 Linux、Windows 等系统上模拟和测量存储设备的性能,广泛用于测试磁盘、文件系统、RAID 阵列等的 IOPS、吞吐量和延迟等指标。

1. 在 EC2 实例里创建 fio 配置文件,如 vim raid0_test.fio,并写入配置项,模拟随机读写负载以测试最大 IOPS:

[global]
ioengine=libaio ; 使用 Linux 原生异步 I/O
direct=1 ; 启用直接 I/O,绕过缓存
iodepth=128 ; I/O 队列深度,设置为较高值以压榨性能
numjobs=4 ; 并发任务数,模拟多线程负载
bs=4k ; 块大小,4KB 适合随机 IOPS 测试
time_based=1 
runtime=60 
group_reporting=1 
randrepeat=0 
norandommap 
refill_buffers 
size=10G 

[random-read]
description=Random read test for IOPS
rw=randread 
directory=/mnt/md0 ; RAID 0 挂载点路径(请替换为实际路径)
rwmixread=100 
loops=1 
stonewall 

[random-write]
description=Random write test for IOPS
rw=randwrite 
directory=/mnt/md0 ; RAID 0 挂载点路径(请替换为实际路径)
rwmixwrite=100 
loops=1 
stonewall 

2. 执行 fio  raid0_test.fio,得到如下结果:

分析结果可以发现,随机读的 IOPS 达到了48.6k,随机写的 IOPS 达到了48.1k,总体符合预期。

同时,分析 Disk stats 可以看到,各个磁盘的 I/O 请求数,以及利用率都非常接近,这表明磁盘的读写负载分布均匀。

  • nvme3n1:读写 I/O 请求数 = 971568/974776,利用率 = 99.24%
  • nvme2n1:读写 I/O 请求数 = 970073/974285,利用率 = 98.97%
  • nvme1n1:读写 I/O 请求数 = 971976/973746,利用率 = 99.30%

至此,我们成功验证了通过 GP3 组建 RAID 0 带来的性能提升。

创建快照以实现数据恢复

由于 RAID 0 缺乏冗余,备份至关重要。如果要使用快照备份 RAID 阵列中 EBS 卷上的数据,则必须确保快照的一致性。原因在于这些卷的快照是独立创建的,从不同步的快照恢复 RAID 阵列中的 EBS 卷会降低阵列的完整性。

AWS EBS 多卷快照提供了一种创建 RAID 阵列所有卷一致性、时间点备份的方法。无需停止实例就可以在各个卷之间进行协调以确保一致性,因为快照会自动跨多个 EBS 卷拍摄。

创建多卷快照

1. 在 EC2 控制台左侧导航栏点击 “快照”,并在打开的窗口选择“创建快照”。

2. 随后,源选择“实例”,并选择组建 RAID 0 的 EC2 实例。

3. 点击“创建快照”,AWS 将确保跨所有卷自动生成快照。快照的创建需要一定时间,创建成功后,在快照状态一览将显示“已完成”。

*小贴士:在实际操作中,建议通过 AWS Backup 对 EBS 卷进行自动定期快照备份。通过自定义备份周期和数据保留时长,来确保故障时数据损失最小化。

恢复多卷快照

1. 从相应快照依次创建新 EBS 卷,并重新按照需求配置磁盘大小、IOPS 和吞吐量,如将 IOPS 设置为 16000,吞吐量 1000MiB/s。请确保新卷与实例都在同一目标可用区(例如 us-east-1a)。

2. 参考文档步骤将 EBS 卷依次附加到 EC2 实例上。然后 SSH 进入实例,通过 mount 指令挂载文件系统。

3. 基于重新挂载的 EBS 磁盘重建 RAID 0 阵列。

4. 验证数据:检查/dev/md0 中的数据是否与备份时的数据保持一致。

磁盘预热

在通过快照恢复 EBS 卷后,直接访问该卷可能会导致性能瓶颈。这是因为 EBS 快照存储于 S3 中,而恢复的 EBS 卷本质上是一个指向快照的逻辑映射。当应用程序首次访问某个数据块时,EBS 需要从 S3 中提取该数据块并将其写入卷。这个过程需要时间,并且可能会导致首次访问每个块时 I/O 操作的延迟显著增加。当所有块均已下载并写入卷后,卷性能才能达到最佳。因此,我们可以通过预热来提前触发所有数据块的加载,确保卷在正式使用前达到最佳性能状态。

为了执行磁盘预热,可以使用以下方法:

手动预热

将新还原的卷附加到您的 Linux 实例上后,可以通过 dd 指令或者 fio 指令对设备上的所有数据块进行读取。

dd 指令应将 if(输入文件)参数设置为要初始化的驱动器。应将 of(输出文件)参数设置为 Linux 空虚拟设备 /dev/nullbs 参数设置读取操作的数据块大小;要获得最佳性能,这应设置为 1 MB。如:

sudo dd if=/dev/md0 of=/dev/null bs=1M status=progress

fio 指令:如果您的实例上尚未安装 fio,请首先安装 fio,如通过 sudo yum install fio -y 在 Amazon Linux 上进行安装。然后使用以下命令初始化您的卷。应将 --filename(输入文件)参数设置为要初始化的驱动器。

sudo fio —filename=/dev/md0 —rw=read —bs=1M —iodepth=32 \
—ioengine=libaio —direct=1 —name=volume-initialize

详细说明请参考初始化 Amazon EBS 卷

自动预热

在快照上启用 Amazon EBS fast snapshot restore (FSR) 快速快照还原功能,以确保从中创建的 EBS 卷在创建时已完全初始化。这会消除首次访问块时对其执行 I/O 操作的延迟。使用快速快照还原创建的卷可以立即交付其所有预置性能,详细步骤请参考 Amazon EBS 快速快照还原

结论

使用 AWS GP3 EBS 卷设置 RAID 0 阵列是为 I/O 密集型工作负载提升磁盘性能的有效方法。通过将数据条带化到多个卷上,您可以获得超过单一卷限制的 IOPS 和吞吐量。然而,缺乏冗余意味着快照对于数据保护不可或缺。借助多卷快照,您可以维护一致性备份并在故障时快速恢复。无论您是运行高性能数据库还是媒体处理管道,这种设置都提供了一种在 AWS 上扩展存储性能的成本效益高的方法——只要确保仔细规划您的备份策略!

参考资料

  1. Amazon EBS 和 RAID 配置:https://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/raid-config.html
  2. Amazon EBS 优化的实例类型:https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ebs-optimized.html
  3. 对 Amazon EBS 卷进行基准测试:https://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/benchmark_procedures.html
  4. 初始化 Amazon EBS 卷:https://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebs-initialize.html
  5. Amazon EBS 快速快照还原:https://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebs-fast-snapshot-restore.html
  6. 将 Amazon EBS 卷附加到 Amazon EC2 实例:https://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebs-attaching-volume.html

本篇作者

卢皓宇

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的设计和技术咨询,同时致力于亚马逊云科技在开发者和学生群体中的应用与推广,在无服务器领域有丰富经验。

任旭

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的设计和技术咨询,对于亚马逊云科技基础服务、容器化、应用开发有较多经验,目前致力于亚马逊云科技生成式 AI 的推广。