这是一个关于 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 处理这种情况的方式。提前感谢您的任何见解!
使用基于文件的池(在 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)
| 归档时间: |
|
| 查看次数: |
1732 次 |
| 最近记录: |