我和大多数人都面临着同样的问题:如何创建一个可靠的个人存储解决方案:
- 硬盘故障的频率令人担忧。丢失文件是不可接受的。
- 我会时不时地买一块新硬盘。不可避免的是,最优价格/GB 大小与上次购买的硬盘不同。
2 表示随着时间的推移,我拥有一个异构磁盘集合。我希望使用它们全部,并且故障磁盘通常会被更大的磁盘替换。
- 对我来说,数据完整性和可靠性比速度更重要。
因此,经过几天的苦思冥想(并且多年来一直在思考这个问题),我提出了以下解决方案。我将描述一个基于原生 Linux ZFS 测试过的解决方案,它可以在 Ubuntu PPA 中使用,但可以使用 LVM、MD 和 btrfs 来实现相同的目的。为此,我将使用 RAID1(ZFS 镜像 vdev)。
- 给定您的一组驱动器,将它们分成两组磁盘,使得每组的容量尽可能接近另一组的容量。
- 对较大的磁盘进行分区,使得另一组中有一个分区的大小与较小的磁盘之一完全相同。
- 创建镜像 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 的破解。最小化 resliver/resync 是极其可取的。
是的,这显然是穷人的 Drobo。人们不需要专用硬件来使用它……
答案1
我已经使用 ZFS 对此进行了测试,写入性能大约是应有的一半,因为 ZFS 将读取和写入分布在所有 vdev 上(因此将 I/O 划分到同一磁盘上的多个位置)。因此,速度受到分区最多的磁盘速度的限制。读取速度似乎等于磁盘带宽。请注意,两个磁盘上的一对 ZFS 分区的读取速度大约是单个磁盘的两倍,因为它可以并行读取磁盘。
使用 MD LINEAR 阵列或 LVM 创建两半,与上述 ZFS 方案相比,写入性能提高了一倍,但缺点是 LVM 和 MD 不知道数据存储在哪里。如果发生磁盘故障或升级,必须完全销毁阵列的一侧并重新同步/重新切片,然后再销毁另一侧。(例如,重新同步/重新切片必须复制 2*(阵列大小))
因此,最佳解决方案似乎是在两个 LVM 或 MD LINEAR 设备上创建一个 ZFS 镜像 vdev,将磁盘合并为大小相等的“两半”。这大约是任何磁盘读取带宽的两倍,写入带宽等于单个磁盘带宽。
使用 BTRFS raid1 代替 ZFS 也可以,但读取带宽只有一半,因为 ZFS 会分配读取以加倍带宽,而 BTRFS 似乎不会(根据我的测试)。BTRFS 的优势在于分区可以缩小,而 ZFS 则不能(因此,如果发生故障后您有大量空闲空间,则可以使用 BTRFS 通过缩小文件系统然后重新排列磁盘来重建较小的冗余阵列)。
手动完成这项工作很繁琐,但使用一些好的脚本就很容易了。