Amazon AWS 临时磁盘和 RAID1

Amazon AWS 临时磁盘和 RAID1

一些 AWS 实例附加了“临时磁盘”,速度比 EBS 快得多。但是,当您的实例停止并启动时,临时磁盘将为空白且未初始化。不过,磁盘上的数据通常会在实例重启后保留下来。

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

我的想法是,raid1 将以降级模式启动,仅包含 EBS 卷,然后我们可以使用 mdadm 命令将空白临时磁盘重新添加到 raid 中。这将使应用程序启动时间提前 5-10 分钟,但代价是 raid1 同步时性能较差。

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

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


更多信息 - 这是一个 i3.4xlarge,因此它有 2x 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

我已经创建了一个 raid1

mdadm  --create /dev/md1 --raid-devices=3 --verbose --level=1 /dev/nvme?n1 /dev/xvdz

返回:

$ 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

奇怪的是,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

断电/开机会导致 RAID 组性能下降,但应用程序仍可运行,尽管速度会变慢。这样就避免了等待 5-10 分钟的成本,而且我可以即时将临时磁盘重新添加到 RAID,而无需重新启动应用程序。

因此,虽然它看起来运行完美,但我是否遗漏了什么或没有考虑到什么?

答案1

嗯,我不确定我是否想混合两者太不同了卷放在单个 RAID1 中。如果这样做,一半的请求将由较慢的 EBS 处理,另一半将由较快的实例存储处理,这可能会导致相当难以预测的性能。我会研究标准工具来实现更好的性能。

看着预配置 IOPS EBS磁盘(如果你需要高随机访问 IO)或吞吐量优化的 EBS(如果您连续读取大文件)。它们可能提供您需要的开箱即用的性能。定价在这里

你还应该看看缓存,尤其是因为它大部分都是只读内容,正如您所说。每次需要文件时,您都可以查看临时存储上的本地缓存目录,如果存在,则从那里提供。如果没有,则从 EBS 获取并在缓存中保存一份副本。尤其是如果它都是只读的,它应该是一个相当简单的缓存层。

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

希望有帮助:)

答案2

40GB 对于 RAM 磁盘来说已经足够小了,而且速度比暂存盘要快。您的应用程序将运行多长时间?是否值得为具有更大内存分配的实例付费?

24x7 可能成本太高。但 40GB 是可以实现的。

作为奖励,您还可以享受更多核心。

我同意使用查询缓存来进行确定性查询,并且任何类型的缓冲都会随着时间的推移有所帮助。

答案3

我……不会使用 RAID1 卷,即使有--write-mostly。重建集合时的性能下降会让人很烦恼。

建议研究一下缓存。我发现它在以下情况下非常有用:我可以使用 SSD,但又需要存储大量数据(通常是非常大的 PostgreSQL 数据库),而购买所有 SSD 并不划算。我只在“持久”模式下使用它,其中它使用 SSD 作为写回缓存,但它确实有一种模式,其中缓存存储层被视为短暂的,并且任何写入只有在它们进入底层永久存储时才被视为完成。

相关内容