这是关于 ZFS 和 RAID-Z 的一个理论性问题。为了清楚起见,我将使用三磁盘单奇偶校验阵列作为示例,但该问题可以扩展到任意数量的磁盘和任意奇偶校验。
假设池中有磁盘 A、B 和 C,并且是干净的。
现在假设我们物理上添加了磁盘 D 以替换磁盘 C,并且磁盘 C 仍然正常运行,只是出于预防性维护而被替换。一些管理员可能只是删除 C 并安装 D,这样更有条理,因为设备不需要更改 ID - 但是这确实会导致阵列暂时降级,因此对于此示例,假设我们安装 D 而不脱机或删除 C。Solaris 文档指出,我们可以在不先脱机的情况下替换磁盘,使用以下命令:
zpool replace pool C D
这应该会导致 D 上的重新同步。我们假设重新同步沿着“光标”向下进行。(我不知道内部实现中使用的实际术语。)
现在假设在重新同步过程中,磁盘 A 发生故障。理论上,这应该是可以恢复的,因为游标上方的 B 和 D 包含足够的奇偶校验,游标下方的 B 和 C 包含足够的奇偶校验。但是,这是否真的可以恢复取决于 ZFS 中的内部设计决策,我不知道(手册中没有用某些术语说明)。
如果 ZFS 继续向光标下方的 C 发送写入,那么我们就没问题了。但是,如果 ZFS 在内部将 C 视为已经消失,仅从 A 和 B 之间的奇偶校验重新同步 D,并且仅在光标下方写入 A 和 B,那么我们就完蛋了。
一些实验可以回答这个问题,但我希望也许有人已经知道 ZFS 如何处理这种情况。提前感谢您的任何见解!
答案1
使用基于文件的池(FreeBSD 8.3 上的 v28,使用文件支持的 md 设备)进行测试表明它应该可以工作。在重新镀银过程中,我能够将剩余磁盘之一脱机。理想情况下,它需要使用真实磁盘进行测试,并实际拉出一个磁盘才能 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)
答案2
磁盘 C 在 RAIDZ 中的使用方式与从 VDev 中移除之前完全相同。正如 Matt 指出的那样,ZFS 通过将替换磁盘设为被替换磁盘的镜像并重新同步替换磁盘来替换磁盘。RAIDZ VDev 永远不会降级,也永远不会重新同步(直到 A 发生故障,这与替换操作完全无关)。
答案3
我不确定这是否重要。
在多数情况下,你不应该使用 RAIDZ,而不是镜子......如果您这样做,您应该使用备用件。
如果正在读取的磁盘之一发生故障或不可用,则重新同步将失败。与不可恢复的读取错误。到那时,磁盘 C 就消失了……