ZFS或LVM或MD冗余异构存储建议


10

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

  1. 硬盘发生故障并具有令人震惊的规律性。丢失文件是不可接受的。
  2. 我会不时购买新的硬盘。不可避免的是,最佳价格/ GB与上次购买的硬盘大小不同。
  3. 2表示随着时间的推移,我将拥有异构的磁盘集合。我想全部使用它们,出现故障的磁盘通常将替换为较大的磁盘。

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

因此,在将这个问题猛烈抨击几天(并且在我的脑后多年)之后,我提出了以下解决方案。我将描述基于Ubuntu PPA中可用的本机Linux ZFS测试过的解决方案,但是可以使用LVM,MD和btrfs来实现相同的解决方案。为此,我将使用RAID1(ZFS镜像vdevs)。

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

例如,考虑一个新的2TB驱动器,一个较旧的750GB驱动器,2个较旧的400GB驱动器和一个较旧的500GB驱动器的磁盘集。最佳的镜像分区具有2TB的可用空间,并在下图中进行了描述,其中“:”分隔分区,“ |” 分离磁盘:

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

创建您的zpool为

zpool create archive mirror /dev/sda1 /dev/sdb mirror /dev/sda2 /dev/sdc mirror /dev/sda3 /dev/sdd mirror /dev/sda4 /dev/sde1

这将创建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| 
+------------------------------------------------------------------------------+

也可以使用LVM或MD RAID维护这对镜像驱动器,其目的是确保每个驱动器始终具有镜像驱动器或分区。由于所有内容均已镜像,因此在添加或删除驱动器时,我们可以随意使驱动器发生故障并重新排列分区。如果需要,使用LVM或MD可以删除驱动器并缩小阵列,但与BTRFS相比,ZFS中较复杂的恢复工具为代价。

对这个程序有什么意见吗?一个好的脚本可以处理驱动器的无损分配和重新布置。对LVM,MD,ZFS有何评论?对所得的奇怪分区阵列的性能有何评论?同一驱动器上多个分区之间的数据安排会导致过多的磁头查找和早期故障吗?

BTRFS开发人员:每个人都希望这样做,并且LVM或MD在技术上不是必需的(我认为次优)。轻松维护冗余的异构阵列将是btrfs的杀手级功能。确实是LVM / MD / ZFS的黑客。最大限度地减少传送/重新同步是非常可取的。

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

Answers:


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可以通过收缩文件系统然后重新排列磁盘来重建较小的冗余阵列)。

手工完成这很繁琐,但是使用一些好的脚本很容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.