ZFS 或 LVM 或 MD 冗余异构存储方案

Bob*_*ath 10 hard-drive zfs software-raid lvm raid-1

我遇到了大多数人遇到的相同问题:如何创建可靠的个人存储解决方案,因为:

  1. 硬盘驱动器以惊人的规律发生故障。丢失文件是不可接受的。
  2. 我会不时购买新的硬盘。不可避免地,最佳价格/GB 的大小与上次购买的 HDD 不同。
  3. 2 意味着随着时间的推移,我有一个异构的磁盘集合。我想全部使用它们,故障磁盘通常会被更大的磁盘替换。

  4. 对我来说,数据完整性和可靠性比速度更重要。

因此,在将我的头撞到这个问题上几天之后(并且在我的脑后多年),我提出了以下解决方案。我将描述一个基于本地 linux ZFS 测试过的解决方案,它在 Ubuntu PPA 中可用,但 LVM、MD 和 btrfs 可用于实现相同的目标。为此,我将使用 RAID1(ZFS 镜像 vdevs)。

  1. 给定您的一组驱动器,将它们分成两组磁盘,使每组的容量尽可能接近另一组。
  2. 对较大的磁盘进行分区,以便在另一组中存在与其中一个较小磁盘完全相同大小的分区。
  3. 创建镜像 vdevs,以便每个磁盘在另一个磁盘上都有自己的镜像。

例如,考虑一组新的 2TB 驱动器、一个旧的 750GB 驱动器、2 个旧的 400GB 驱动器和一个旧的 500GB 驱动器。最佳镜像分区有 2TB 的可用空间,如下图所示,其中“:”分隔分区,“|”分隔 分离磁盘:

+------------------------------------------------------------------+
| 2TB (sda1)        : (sda2)       : (sda3)       : (sda4)         |
+------------------------------------------------------------------+--+
| 750 GB (sdb)      | 400 GB (sdc) | 400 GB (sdd) | 500 GB (sde1)  :XX|
+---------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

创建您的 zpool 作为

zpool create archive mirror /dev/sda1 /dev/sdb mirror /dev/sda2 /dev/sdc mirror /dev/sda3 /dev/sdd mirror /dev/sda4 /dev/sde1
Run Code Online (Sandbox Code Playgroud)

这将创建 4 个镜像 vdev。如果任何一个磁盘出现故障,可以更换它(使用任何大小的磁盘)并进行分区以重新创建丢失的分区。可以将 ZFS vdev 添加到池中但不能删除,这一点很重要。因此,如果可能的话,当您购买新驱动器时,您希望重新排列现有的 vdev。假设下一次购买的是 3TB 驱动器。您的最佳配置是 3.5TB 可用,如下图所述。现在是 5 个 vdev 对。这可以通过适当的分区以及连续失败和重新分区驱动器来实现。

+--------------------------------------------------------------+-------------+
| 3 TB (sdf1)       : (sdf2)      : (sdf3)      : (sdf4)       | 500GB (sde) |
+--------------------------------------------------------------+-------------+-+
| 2TB (sda1)        | 400GB (sdb) | 400GB (sdc) | 750GB (sdd1) : (sdd2)      :X| 
+------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

维护这对镜像驱动器也可以使用 LVM 或 MD RAID 来完成,其想法是确保每个驱动器始终有一个镜像驱动器或分区。因为一切都是镜像的,所以我们可以在添加或删除驱动器时自由地使驱动器发生故障并重新排列分区。如果需要,使用 LVM 或 MD 可以移除驱动器并缩小阵列,代价是 ZFS 中的恢复工具与 BTRFS 相比不太复杂。

对这个程序有什么意见吗?一个好的脚本可以处理驱动器的无损分配和重新排列。对 LVM 与 MD 与 ZFS 有何评论?对生成的奇怪分区数组的性能有何评论?同一驱动器上跨多个分区的数据排列会导致过度的磁头搜索和早期故障吗?

BTRFS 开发人员:每个人都想要这个,而 LVM 或 MD 在技术上不是必需的(在我看来,不是最优的)。使维护冗余异构阵列变得容易将是 btrfs 的一个杀手级功能。这是对 LVM/MD/ZFS 的一种黑客攻击。最大限度地减少重传/重新同步是非常可取的。

是的,这显然是穷人的Drobo。一个人不应该需要专用的硬件...

Bob*_*ath 4

我已经使用 ZFS 对此进行了测试,写入性能约为应有的一半,因为 ZFS 将读取和写入分布在所有 vdev 上(因此将 I/O 划分到同一磁盘上的多个位置)。因此,速度受到分区最多的磁盘速度的限制。读取速度似乎等于磁盘带宽。请注意,两个磁盘上的一对 ZFS 分区的读取速度大约是单个磁盘的两倍,因为它可以并行地从磁盘读取。

与上述 ZFS 方案相比,使用 MD LINEAR 阵列或 LVM 创建两半会带来两倍的写入性能,但缺点是 LVM 和 MD 不知道数据存储在哪里。如果发生磁盘故障或升级,阵列的一侧必须完全销毁并重新同步/重新传送,然后是另一侧。(例如,重新同步/重新传送必须复制 2*(数组大小))

因此,最佳解决方案似乎是跨两个 LVM 或 MD LINEAR 设备创建单个 ZFS 镜像 vdev,将磁盘组合成大小相等的“两半”。这大约是任何一个磁盘的读取带宽的两倍,写入带宽等于各个磁盘的带宽。

使用 BTRFS raid1 代替 ZFS 也可以,但读取带宽只有一半,因为 ZFS 将其读取分布到双倍带宽,而 BTRFS 似乎没有(根据我的测试)。BTRFS 的优点是分区可以缩小,而 ZFS 则不能(因此,如果发生故障后有大量空闲空间,使用 BTRFS 可以通过缩小文件系统然后重新排列磁盘来重建更小的冗余阵列)。

手动完成此操作很乏味,但使用一些好的脚本就可以轻松完成。