ZFS 如何处理 RAID-Z 中的在线替换(理论值)

Kev*_*vin 7 zfs raidz

这是一个关于 ZFS 和 RAID-Z 的理论问题。为清楚起见,我将使用三磁盘单奇偶校验阵列作为示例,但问题可以扩展到任意数量的磁盘和任意奇偶校验。

假设池中有磁盘 A、B 和 C,并且它是干净的。

假设现在我们物理添加磁盘 D 的目的是替换磁盘 C,并且磁盘 C 仍然正常运行并且只是出于预防性维护而被替换。一些管理员可能只是猛拉 C 并安装 D,这会更有条理,因为设备不需要更改 ID - 但是这确实会使阵列暂时降级,因此对于此示例,假设我们在不脱机或删除 C 的情况下安装 D。Solaris 文档表明我们可以在不先将磁盘脱机的情况下替换磁盘,使用如下命令:

zpool replace pool C D
Run Code Online (Sandbox Code Playgroud)

这应该会导致重新同步到 D。让我们说重新同步沿着“光标”“向下”进行。(我不知道内部实现中使用的实际术语。)

现在假设在重新同步过程中,磁盘 A 出现故障。理论上,这应该是可恢复的,因为上面的游标 B 和 D 包含足够的奇偶校验,而下面的游标 B 和 C 包含足够的奇偶校验。但是,这是否实际上是可恢复的取决于 ZFS 中我不知道的内部设计决策(并且手册在某些方面没有说明)。

如果 ZFS 继续向光标下方的 C 发送写入,那么我们就没事了。但是,如果 ZFS 在内部将 C 视为它已经消失,仅根据 A 和 B 之间的奇偶校验重新同步 D,并且只在光标下方写入 A 和 B,那么我们就干杯了。

一些实验可以回答这个问题,但我希望这里的某个人可能已经知道 ZFS 处理这种情况的方式。提前感谢您的任何见解!

USD*_*att 6

使用基于文件的池(在 FreeBSD 8.3 上使用文件支持的 md 设备的 v28)进行测试表明它应该可以工作。在重新同步过程中,我能够使剩余的磁盘之一脱机。理想情况下,它需要使用真实磁盘进行测试,并实际拉出一个以 100% 确定,但 ZFS 非常乐意让我将磁盘脱机。

在脱机 md0 之前,池仍然完全在线,因此在我看来 ZFS 只是将替换的磁盘镜像到新磁盘,但在此过程中仍将整个磁盘视为可用磁盘。

    NAME                     STATE     READ WRITE CKSUM
    test                     DEGRADED     0     0     0
      raidz1-0               DEGRADED     0     0     0
        8480467682579886773  OFFLINE      0     0     0  was /dev/md0
        md1                  ONLINE       0     0     0
        replacing-2          ONLINE       0     0     0
          md2                ONLINE       0     0     0
          md3                ONLINE       0     0     0  (resilvering)
Run Code Online (Sandbox Code Playgroud)