Linux 上具有高级功能的 ZFS/Btrfs/LVM2 类存储?

Linux 上具有高级功能的 ZFS/Btrfs/LVM2 类存储?

我在 Linux 机器上有 3 个相同的内置 7200 RPM SATA 硬盘驱动器。我正在寻找一个可以满足以下所有要求的存储设置:

  • 不同的数据集(文件系统或子树)可以有不同的 RAID 级别,因此我可以在拥有少量物理磁盘的情况下为不同的数据集选择不同的性能、空间开销和风险权衡(非常重要的数据可以是 3xRAID1,重要的数据可以是 3xRAID5,不重要的可重现数据可以是 3xRAID0)。
  • 如果每个数据集都有明确的大小或大小限制,那么可以增加或缩小大小限制(如果需要可以离线)
  • 避免使用内核外的模块
  • R/W 或只读 COW 快照。如果是块级快照,则文件系统应在快照期间同步并静止。
  • 能够添加物理磁盘,然后扩展/重新分配 RAID1、RAID5 和 RAID0 卷,以利用新主轴,并确保没有主轴比其他主轴更热(例如,在 NetApp 中,在没有明确重新分配的情况下,通过几个磁盘增加 RAID-DP RAID 组将无法平衡它们之间的 I/O)

非必需,但有则更好:

  • 透明压缩,按文件或子树进行。如果像 NetApps 一样,先分析数据的可压缩性,然后只压缩可压缩数据,那就更好了
  • 重复数据删除不会对性能造成巨大损失,也不需要大量内存(NetApp 在周末进行计划重复数据删除,这很好)
  • 像 ZFS 一样抵抗静默数据损坏(这不是必需的,因为我从未见过 ZFS 报告这些特定磁盘上的任何数据损坏)
  • 存储分层,要么是自动的(基于缓存规则),要么是用户定义的规则(是的,我现在拥有完全相同的磁盘,但这将允许我在将来添加读/写 SSD 缓存)。如果是用户定义的规则,这些规则应该能够在文件级别而不是块级别升级到 SSD。
  • 节省空间的小文件打包

我在 Linux 上尝试过 ZFS,但是它的局限性如下:

  • 升级需要额外的工作,因为软件包位于外部存储库中,并且与特定的内核版本绑定;它未与软件包管理器集成
  • 写入 IOPS 不会随着 raidz vdev 中的设备数量而扩展。
  • 无法将磁盘添加到 raidz vdevs
  • 无法在 RAID0 上选择数据以减少开销并提高性能,而无需额外的物理磁盘或为 ZFS 提供单个磁盘分区

LVM2 上的 ext4 看起来是个不错的选择,但我不知道是否可以缩小、扩展并重新分配到新主轴 RAID 类型的逻辑卷(当然,我可以在一堆文件上试验 LVM)。据我所知,它没有任何优点,所以我想知道是否有更好的选择。我确实看过LVM 的危险和注意事项但话又说回来,没有一个系统是完美的。

答案1

你要求太多了。这些要求不切实际,尤其是考虑到你谈论的是三块低速消费级磁盘。你有什么打算?

  • 使用Linux 上的 ZFS和四个磁盘。如果您说的是扩展,那么您可能有四个数据磁盘的空间。您没有提到您的 Linux 发行版,但升级对 CentOS 6.x 来说不是问题。镜像是可扩展的。RAID-Z1/2/3 组根本不是。设置每个文件系统的压缩并完成它。您可以通过复制来重新平衡数据。但计划得更好,扩展问题就不会成为限制。这为您提供了压缩、快照、分层和数据完整性。忘记 ZFS 上的重复数据删除。您可能不需要它。如果需要,您应该规划它所需的资源需求。

  • 至于 Linux 上 ZFS 的限制,您应该了解规划 ZFS 存储设置的基础知识. 使用 ZIL 设备来增加写入 IOPS。

  • 有硬件 RAID 解决方案,例如HP 智能阵列控制器行,这将允许在单个驱动器组上使用不同的 RAID 保护...它在扩展期间自动重新平衡/重新分配数据。无法减少。您可以将 HP 逻辑驱动器导出为 ZFS 的块设备,这样您最终可以获得文件系统的好处,但也可以智能地使用底层硬件设备。在下面的示例中,zpools卷1第2卷由对应于单个设备组成逻辑驱动器 2逻辑驱动器 3来自 HP RAID 控制器输出:

ZFS 池信息:

[root@ZFS-on-Linux ~]# zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol1   119G  48.2G  70.8G    40%  1.00x  ONLINE  -
vol2  99.5G  42.6G  56.9G    42%  1.00x  ONLINE  -

HP RAID 控制器输出:

Smart Array P400 in Slot 8                (sn: P61630G9SVN702)

   array A (SAS, Unused Space: 609621  MB)


      logicaldrive 1 (72.0 GB, RAID 1+0, OK)
      logicaldrive 2 (120.0 GB, RAID 1+0, OK)
      logicaldrive 3 (100.0 GB, RAID 5, OK)

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, OK)
      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 146 GB, OK)
      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SAS, 146 GB, OK)
      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SAS, 146 GB, OK)
      physicaldrive 2I:1:5 (port 2I:box 1:bay 5, SAS, 146 GB, OK)
      physicaldrive 2I:1:6 (port 2I:box 1:bay 6, SAS, 146 GB, OK)
      physicaldrive 2I:1:7 (port 2I:box 1:bay 7, SAS, 146 GB, OK)
      physicaldrive 2I:1:8 (port 2I:box 1:bay 8, SAS, 146 GB, OK)

将以上两个结合起来,你会得到最多您的要求。

答案2

你的愿望清单可真不少。

Linux md RAID(管理) + LVM 将满足您的大部分要求,但几乎不会满足您的任何附加要求。

您可以将磁盘划分为多个分区。在不同的分区上使用不同级别的 md RAID。将 md RAID 卷放入 LVM 卷组中,从 VG 中创建逻辑卷。在 LV 上放置文件系统(如 ext4)。如果没有 LVM,您可以启动 md RAID1。因此,对 /boot 使用不带 LVM 的 RAID1。md RAID 卷可以缩小并生长购买添加磁盘,因为可以逻辑卷管理器ext4

LVM 可以进行快照。但它们不是原生的 COW,因此绩效惩罚如果快照使用相同的物理磁盘。它们最适合用于临时捕获时间点以进行备份,而不是用于像 ZFS 这样的无限快照。

它看上去可能是这样的:

sda1 + sdb1 + sdc1 = md0 RAID1
sda2 + sdb2 + sdc2 = md1 RAID10 (yes, you can do odd numbered RAID10)
sda3 + sdb3 + sdc3 = md2 RAID5
sda4 + sdb4 + sdc4 = md3 RAID0

md0 = no LVM, format as ext4, mount as /boot
md1 = LVM, divide into two LVs
      Format one LV as ext4, mount as / (root)
      Use other LV for swap
md2 = LVM, create one LV
      make the LV is smaller than the VG, to leave space for snapshots
      Format the LV as ext4, mount as /data
md3 = LVM, one LV taking the whole VG
      Format as ext4, mounts as /stuff_i_want_to_lose

相关内容