在一个大磁盘和两个小磁盘的 RAID0 上进行 ZFS 镜像

H. *_*uch 5 raid zfs

您有:两个大小为 X 的磁盘和一个大小为 2X 的磁盘。

你想要:zpool 具有大小为 2X 的类似镜像的冗余

使用 ZFS 可以直接连接两个 X 驱动器。但是我发现无法使用 ZFS 的内部手段将生成的 vdev(大小为 2X)镜像到另一个 2X 磁盘。

我想到了这些(或多或少不优雅的)解决方案:

  1. 使用操作系统工具(Linux 的 mdadm,FreeBSD 的 gstripe)将两个 X 驱动器连接到一个可以与 2X 镜像的单个物理设备。但我对 ZFS 的额外复杂性、平台依赖性和失去裸机优势感到不安。
  2. 将 2X 驱动器细分为两个分区,并通过zpool create tank mirror /dev/Xone /dev/2Xpart1 mirror /dev/Xtwo /dev/2Xpart2其中条带分区分散在物理连续硬件上的方式创建具有四个成员的 RAID10 等效项。

use*_*ser 5

ZFS 真的不支持你想做的事情。有可能将它拼凑成你想做的事,但你这样做是在与预期的用途作斗争。

值得记住的是,ZFS 是一种企业文件系统和卷管理器解决方案。在企业环境中,无论采用哪种方式,您所描述的增加的复杂性都会使购买相同大小的驱动器的成本相形见绌。

考虑到您可能确实拥有的情况,最干净的解决方案是将较大的驱动器分成两半,然后设置一个包含两个 vdev 的池,每个 vdev 具有一个较小的磁盘和一个较大的磁盘的一半。然后,ZFS 将在两个 vdev 之间对数据进行条带化,为您提供两路镜像的两个宽条带集:在标准 RAID 术语中,两个设备的两个 RAID 1 中的一个 RAID 0,其中每个 RAID 上的一个设备1 实际上是单个设备的一部分。像这样(物理设备用 * 标记):

                            _ small1*
                           /
          _ raid0left ----<                    _ largeleft
         /                 \                  /
pool ---<                   >---- large* ----<
         \                 /                  \
          ` raid0right ---<                    ` largeright
                           \
                            ` small2*
Run Code Online (Sandbox Code Playgroud)

看看它看起来有多脆弱?一方面,由于任何原因丢失了那个大驱动器,您将失去所有冗余,极大地限制了 ZFS 从错误中恢复的能力。

这样做将迫使更大的磁盘疯狂地寻找以满足 I/O 请求,因为 ZFS 会将它视为两个独立的设备,而实际上它只是一个,并且很可能会关闭许多 ZFS 的优化,因为 ZFS 不能再假设它控制着整个更大的驱动器。如果它是一个旋转驱动器,那么单独寻找就会给它带来巨大的压力。

它也几乎将您锁定在此设置中,因为至少我最后一次查看时,vdevs 只能添加到池中,而不能删除。您可以替换 vdev 中的设备,但您无法在不破坏和重新创建整个池的情况下对 vdev 本身进行任何操作。还请记住,池中的每个 vdev 都至少需要运行才能DEGRADED使池正常工作。因此,即使在最好的情况下,您也不会获得比简单镜像配置更高的可靠性,因为即使没有任何其他故障,一个物理设备的故障也会降低条带化的两端。在这种情况下,最好希望这两个小驱动器能够经受住 resilver 的严苛考验。

如果您无论如何都尝试这样做,除非较大的磁盘是 SSD,否则在我看来,单独的查找活动将对池的性能绝对是毁灭性的,绝对是在 IOPS 方面,并且可能在吞吐量方面。

如果是我,我会得到一个与较大驱动器相同大小的第二个驱动器,并设置一个简单的双向镜像。