这是一个关于 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 处理这种情况的方式。提前感谢您的任何见解!
使用基于文件的池(使用文件支持的 md 设备的 FreeBSD 8.3 上的 v28)进行测试表明它应该可以工作。在重新银化过程中,我能够使剩余磁盘之一脱机。理想情况下,它需要使用真实磁盘进行测试并实际拉出一个才能 100% 确定,但 ZFS 非常乐意让我使磁盘脱机。
在使 md0 脱机之前,池仍然完全在线,所以在我看来 ZFS 只是将替换的磁盘镜像到新磁盘,但在此过程中仍然将整个磁盘视为可用。
磁盘 C 仍然在 RAIDZ 中使用,就像它从 VDev 中移除之前一样。正如 Matt 指出的那样,ZFS 通过使替换磁盘成为被替换磁盘的镜像并重新同步替换磁盘来替换磁盘。RAIDZ VDev 永远不会降级,也永远不会重新同步(直到 A 失败,这与替换操作完全分开)。
我不确定这是否重要。
在大多数情况下,你不应该使用 RAIDZ,而不是镜像......如果你这样做,你应该用备用的。
如果它正在读取的其中一个磁盘发生故障或不可用,则重新同步将失败。与Unrecoverable Read Error相同。到那时磁盘C将消失......