构建 24 磁盘池 SSD 热设置缓存的推荐方法:RAID、LVM JBOD 等?

构建 24 磁盘池 SSD 热设置缓存的推荐方法:RAID、LVM JBOD 等?

我正在尝试找出最省事的方法,将 24 个本地连接的 SSD 配置为具有低价值数据的大型逻辑卷。我将它们用作主状态(约 1 PB)驻留在 S3 中的数据的热集缓存,因此我更关心性能、维护的复杂性和停机时间,而不是丢失的数据。没有任何东西会在热数据集中停留超过几天,而且无论如何都很容易从 S3 重新创建。

  • 中大型实例:32 个 vCPU、120GB RAM、Skylake
  • 24 个本地连接 SSD @ 每个 375GB = 总共 9TB
  • 托管在 Google Cloud (GCP) 上
  • Debian 10(Buster)
  • 读取比写入的访问量大约高出 4 倍
  • 大量并发用户(人类和机器)具有相当随机的访问模式,并且对 I/O 要求极高。
  • 90%的文件大于10MB

我认为 RAID 5 是不可能的,我不可能等待手动重建。我倾向于 RAID 0、RAID 10,或者……也许这实际上是一个没有 RAID 的简单 LVM 池的情况?在这种情况下,选择相对简单的路线真的会失去什么吗?

我的理想解决方案是将每个子目录(每个子目录都有一个自包含的数据集)/完全包含在单个磁盘上(每个驱动器上可以容纳 10 个子目录)。如果驱动器发生故障,该驱动器上的子目录/数据集将暂时中断,但很容易推断出“这些数据集正在重新下载并且不可用”。然后,我只需在新驱动器上从 S3 重建丢失的数据集即可。我怀疑 LVM jbods(不确定这个词的确切正确词是什么?)可能最接近复制此行为。

答案1

你似乎在与你的需求相矛盾 -“我的理想解决方案是将 / 的每个子目录 (每个子目录都有一个自包含的数据集) 完全包含在单个磁盘上”告诉您不需要 RAID、LVM 或任何抽象技术 - *当然,解决这个问题的方法是简单地单独安装每个磁盘。这样做的缺点是您可能会浪费磁盘空间,如果数据集增长,您将需要花费更多时间来处理它。(我希望您知道 Unix 可以在文件系统树的任意位置安装驱动器,因此,如果稍微思考一下,应该很容易将驱动器显示为逻辑树结构)

您谈论的是 JBOD 或 RAID0。如果您决定采用组合磁盘解决方案,那么在大多数情况下,RAID0 会为您提供更好的读取性能,因为数据很容易分散到磁盘上。RAID10 会为您带来您说不需要的冗余。如果您有不同大小的磁盘,JBOD 才对您有用,您最好使用 LVM,因为它可以以相同的方式运行,但可以让您灵活地移动数据。

我可以看到 LVM 比单个磁盘更有帮助的极端情况,但一般来说,任何情况都可能增加更多的复杂性,然后它在这里提供有用的灵活性 - 特别是考虑到关于数据集绑定到磁盘的初始声明。

您可能需要花费一些精力来寻找最合适的文件系统和调整参数。

答案2

与数据丢失相比,我更关心性能、维护的复杂性和停机时间。

最大化性能意味着您需要使用某种形式的 RAID-0 或 RAID10,或 LVM。维护的复杂性排除了执行诸如按子目录对磁盘进行分段之类的操作(另一个人提到了卷调整)。最小化停机时间意味着您必须具有某种形式的冗余,因为丢失一个驱动器会导致整个阵列瘫痪,然后您必须重建它。我将其理解为“停机时间”。出于性能原因,RAID-5 上的降级模式可能也会排除 RAID-5。

所以我认为你的选择是 RAID10 或 RAID1+LVM。LVM 提供了一些增强的管理卷大小的能力,但如果你无论如何都要用 RAID-1 镜像它,那么很多能力就会消失。根据这篇文章https://www.linuxtoday.com/blog/pick-your-pleasure-raid-0-mdadm-striping-or-lvm-striping.htmlRAID-0 比 LVM 提供更好的性能。

答案3

更简单、更轻松的设置是使用软件 RAID 阵列 + XFS。如果,且仅当,如果您不关心数据和可用性,则可以使用 RAID0 阵列;否则,我强烈建议您使用其他 RAID 布局。我通常建议使用 RAID10,但它会造成 50% 的容量损失;对于 24x 375GB RAID,您可以考虑 RAID6 或 -gasp- 甚至 RAID5。

上述解决方案附带了许多条件,最重要的是向您提供单个块设备并跳过任何基于 LVM 的存储分区,这意味着没有快照功能。另一方面,XFS 分配器可以很好地处理 RAID0 设置中各个磁盘之间的平衡。

其他可能的解决方案:

  • 在 RAID0/5/6 上使用 XFS 而不是传统 LVM:传统 LVM 卷对性能基本没有影响,并且使您能够对单个块设备进行动态分区并拍摄短期快照(尽管性能损失非常大)

  • 使用 XFS 而不是 RAID0/5/6 上的精简 LVM:精简 LVM 启用现代快照,降低性能损失,并具有其他优点。如果使用足够大的块大小,性能会很好

  • 考虑使用 ZFS(在其 ZoL 版本中):特别是如果您的数据可压缩,它可以提供显著的空间和性能优势。此外,由于您的工作负载似乎读取量很大,ZFS ARC 可能比传统的 Linux 页面缓存更高效

如果您的数据压缩效果不佳但有利于重复数据删除,那么您可以考虑在 RAID 块设备和文件系统之间插入 VDO。

最后,请考虑任何类型的 LVM、JBOD 或 ZFS 池不是意味着丢失磁盘只会使位于此类磁盘上的目录脱机;相反,整个虚拟块设备将不可用。要实现这种隔离,您需要为每个块设备铺设一个文件系统:这意味着您必须管理各种挂载点,更重要的是,您的存储不会被池化(即:您可能会用尽某个磁盘上的空间,而其他磁盘上有足够的可用空间)。

答案4

关于最佳性能、维护的复杂性,您可以使用此处列出的最佳实践 [1] [2] 作为在构建使用云存储的应用程序时需要注意的事项的快速参考。

[1]https://cloud.google.com/storage/docs/best-practices

[2]https://cloud.google.com/compute/docs/disks/performance

相关内容