Amazon AWS 临时磁盘和 RAID1

Cri*_*gie 7 software-raid raid1 amazon-ec2 amazon-ebs amazon-ephemeral

一些 AWS 实例附加了“临时磁盘”,这比 EBS 快得多。但是,当您的实例停止和启动时,临时磁盘将为空白且未初始化。磁盘上的数据通常在实例重启后仍然存在。

问题:我应该在我的 AWS 实例上使用软件 RAID1,构建在临时磁盘和 EBS 卷上吗?

我的想法是,raid1 将仅在 EBS 卷的降级模式下出现,然后我们可以使用 mdadm 命令将空白临时磁盘添加回 raid。这将使应用程序更快启动 5-10 分钟,代价是在 raid1 同步时性能更差。

背景:我有一个使用 ~40 GB 数据文件的应用程序。访问时间与性能直接相关,因此磁盘速度越快,应用程序运行得越快。

从历史上看,我们从 rc.local 到 rsync 数据从 EBS 磁盘运行到临时磁盘,然后启动软件。同步需要 5-10 分钟,比从另一个实例同步所需的 5-20 分钟要好。过去,我们甚至使用 ramdisk 中的数据文件,它不如临时磁盘快。


更多信息 - 这是一个 i3.4xlarge,所以它有 2 个 NVME 临时驱动器。

# hdparm -t /dev/md? /dev/nvme?n1 /dev/xvd?
/dev/md0:     9510 MB in  3.00 seconds = 3169.78 MB/sec RAID0 of two eph drives
/dev/nvme0n1: 4008 MB in  3.00 seconds = 1335.74 MB/sec Eph drive
/dev/nvme1n1: 4014 MB in  3.00 seconds = 1337.48 MB/sec Eph drive
/dev/xvda:     524 MB in  3.01 seconds = 174.17 MB/sec  gp2 16GB, 100 IOPs root
/dev/xvdf:     524 MB in  3.01 seconds = 174.23 MB/sec  gp2 120GB, 300 IOPs data
/dev/xvdz:     874 MB in  3.01 seconds = 290.68 MB/sec  gp2 500GB, 1500 IOPs raid-seed disk
Run Code Online (Sandbox Code Playgroud)

我创建了一个raid1

mdadm  --create /dev/md1 --raid-devices=3 --verbose --level=1 /dev/nvme?n1 /dev/xvdz
Run Code Online (Sandbox Code Playgroud)

返回:

$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 nvme1n1[4] nvme0n1[3] xvdz[2]
      524155904 blocks super 1.2 [3/3] [UUU]
      bitmap: 0/4 pages [0KB], 65536KB chunk
Run Code Online (Sandbox Code Playgroud)

奇怪的是,raid 读取速度与更快的驱动器一样快,并且不限于最慢磁盘的速度。

/dev/md1:     4042 MB in  3.00 seconds = 1346.67 MB/sec
/dev/nvme0n1: 4104 MB in  3.00 seconds = 1367.62 MB/sec
/dev/nvme1n1: 4030 MB in  3.00 seconds = 1342.93 MB/sec
/dev/xvdz:     668 MB in  3.01 seconds = 222.26 MB/sec
Run Code Online (Sandbox Code Playgroud)

关闭/打开电源会返回降级的 raidset,但该应用程序仍然可以运行,但速度会变慢。避免了等待 5-10 分钟的成本,我可以在不重启应用程序的情况下动态地将临时磁盘重新添加到突袭中。

因此,虽然它似乎工作得很好,但有什么我错过或没有考虑过的吗?

MLu*_*MLu 5

嗯,我不确定我是否想在一个 RAID1 中混合两个如此不同的卷。如果你这样做,一半的请求将来自较慢的 EBS,一半来自较快的实例存储,这可能会导致相当不可预测的性能。我会查看标准工具以实现更好的性能。

查看预配置的 IOPS EBS磁盘(如果您需要高随机访问 IO)或吞吐量优化的 EBS(如果您按顺序读取大文件)。它们可以提供您开箱即用所需的性能。该价格是在这里

您还应该查看一些缓存,尤其是正如您所说的,它主要是只读内容。每次需要该文件时,您都可以查看临时存储上的本地缓存目录,如果它在那里,则从那里提供服务。如果没有从 EBS 中取出并在缓存中保存一个副本。特别是如果它都是只读的,它应该是一个非常简单的缓存层。

或者,如果 EBS 上的文件是数据库文件(我怀疑可能是这种情况),则将查询或处理的结果缓存Memcache 或 Redis或数据库本机缓存(例如MySQL Query Cache)中。

希望有帮助:)