Answers:
“副本数= 2”(或3)更适合与没有冗余(单个磁盘或条带)的池一起使用。目标是能够恢复较小的磁盘损坏,而不是整个设备故障。在后一种情况下,该池不可卸载,因此不会发生同上的块还原。
如果您有冗余(mirroring / raidz / raidz2 / raidz3),则同上区块与其他区块没有什么不同,因此清理/重新同步将重新创建它们。
For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state).
我假定copys = 2或3不被视为冗余配置。
copies=1
并将其升级到copies=2
,那么您之后可能会希望重新进行银/刷新操作,这将创建这些实例。但是@jilliagre是正确的:ditto块不构成冗余配置。即使池中有多个设备,也无法保证将块设置在另一台设备上。
我发现这个问题确实很有趣,花了一个小时浏览文档之后,我才开始研究代码。这是我发现的。
首先,一些术语。同上块(与镜像相反,这些副本是镜像副本)是在写入时自动创建的,但可能与原始副本位于同一虚拟设备(vdev)中,也可能不在同一虚拟设备(vdev)中。另一方面,镜像块始终会反映到另一个虚拟设备上。
但是,该代码将这两种类型的块都称为子代。您会在此处看到ditto块只是具有的子对象io_vd == NULL
(这在write函数中)。对于镜像块,io_vd
应将其设置为相应的虚拟设备(例如,第二个磁盘)。
考虑到这一点,当到达读取部分时,如果所有子项(不包含镜像或同上块)不包含期望值good_copies
,则将其视为不安全,然后根据需要重写它们。因此,听起来您的问题的答案是-是的,当您至少有一个良好的副本并且满足以下任一条件时,它将重写它们:
!也许有人可以指出缺陷,但是通过这个小练习,我很喜欢ZFS,希望对您有所帮助!
@jlliagre和其他人似乎认为,如果zpool中的一个磁盘(vdevs)死了,但整个zpool却死了,但是该池不是多余的(镜像/ raidz)。这不是真的; 一个多磁盘池将永远生存下去,即使它不是一个镜面或RAIDZ一个完整的磁盘故障。
ZFS元数据始终至少被复制2次,因此完整磁盘(或其任何部分)的完全故障将不会破坏文件系统。此外,许多文件(尤其是较小的文件)不会分散在所有磁盘上,因此不一定会因磁盘故障而出现故障。OP正在询问使用同上块(用户数据副本> 1)的多磁盘池的情况。在这里,一个完整的磁盘故障应该永远不会导致任何数据丢失。ZFS将始终尝试将ditto块置于远离原始块的位置,对于具有多个vdev的池,这始终意味着在另一个vdev上(一个vdev占池的50%以上可能是一个例外,这是非常不寻常的) 。文件系统元数据也总是比同上级别多复制+1或+2倍,因此它将始终在磁盘故障中幸免。此外,如果一个池中的磁盘多于三个,则应该可以丢失多达一半的磁盘而不会丢失任何数据;ZFS将ditto块存储在下一个磁盘上,只要您不会丢失两个相邻的磁盘,就不会丢失数据。(ditto = 2的三个相邻磁盘故障)。
当有足够的数据副本可访问文件时(无论这些副本来自ditto块,镜像还是raidz),则在访问文件时将修复所有丢失的数据副本。这就是擦洗的目的;读取所有数据,并通过使用冗余副本来修复所有不良数据。因此,要直接回答OP问题,您只需在更换故障驱动器后进行擦洗,即可恢复所有副本。
与往常一样,您可以通过创建池来进行试验,这些池的后备存储vdev只是普通的稀疏文件。通过删除或破坏vdev文件,您可以模拟任何类型的故障,并可以一路验证池,文件系统和数据的完整性。
编辑:经过实验后,如果磁盘在拷贝数大于等于2的多磁盘非冗余池中发生故障,则zfs似乎会使池失败。一个或多个磁盘上的局部数据损坏应保持生存状态,并应通过清理来修复。