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

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

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

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

使用 ZFS 连接两个 X 驱动器非常简单。但我发现无法使用 ZFS 的内部方法将生成的 vdev(大小 2X)镜像到另一个 2X 磁盘。

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

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

答案1

ZFS确实不支持你想做的事情。你可以努力让它做你想做的事,但你在这样做的过程中一直在与预期用途作斗争。

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

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

                            _ small1*
                           /
          _ raid0left ----<                    _ largeleft
         /                 \                  /
pool ---<                   >---- large* ----<
         \                 /                  \
          ` raid0right ---<                    ` largeright
                           \
                            ` small2*

看到它看起来多么脆弱吗?其一,无论出于何种原因丢失该大驱动器,您都会丢失所有冗余,从而极大地限制了 ZFS 从错误中恢复的能力。

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

它还会将您锁定在这种设置中,因为至少在我上次查看时,vdev 只能添加到池中,而不能删除。您可以替换 vdev 中的设备,但如果不销毁并重新创建整个池,则无法对 vdev 本身执行任何操作。另请记住,池中的每个 vdev 至少需要正常运行DEGRADED才能使池正常运行。因此,即使在最好的情况下,您也不会获得比简单镜像配置更高的可靠性,因为即使没有任何其他故障,一个物理设备的故障也会降低条带两侧的性能。在这种情况下,最好希望这两个小驱动器能够承受重新镀银的严格要求。

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

如果是我,我只会再买一个与大驱动器尺寸相同的驱动器,并设置一个简单的双向镜子。

相关内容