我打算从 FreeBSD 构建一个 ZFS 文件服务器。我最近了解到,一旦 RAIDZ udev 成为池的一部分,我就无法对其进行扩展。这是一个问题,因为我是家庭用户,可能每年最多添加一个磁盘。
但是,如果我将整个池的副本数设置为 3,然后将各个驱动器分开放入池中,结果会怎样?我读到过一些文章说,如果可能,副本将尝试分布在驱动器上。这有保证吗?我真的只是想以低成本保护数据免受位衰减和驱动器故障的影响。速度不是问题,因为它将通过 1Gb 网络传输,最多可以播放 720p 的播客。
如果出现单个驱动器故障,我的数据是否能得到保证?是否有我没有考虑到的事情?欢迎提供任何意见。
答案1
使用同一池中的 raidz vdev + 单个磁盘 vdev 不会保护您。您应该同时将两个磁盘(并镜像它们)添加到 zpool,这将覆盖一个磁盘故障。
原因是copies
不能保证块最终会位于不同的磁盘上。
扩展 raidz vdev 的一个替代方法是,zfs send
在添加磁盘并重建 raidz vdev 时将所有数据临时存储在某个地方,然后zfs receive
再将其恢复。一旦超过几 TB,这将变得很困难,因为您需要大量空间来存储数据。
答案2
文件系统数据很可能是冗余的,尤其是在副本数=3 的情况下,这样您的数据将受到保护以免遭受位腐烂。
但是,由于无法用新磁盘替换故障磁盘,因此无法可靠地防止整个磁盘故障。即使在故障发生后您应该能够访问所有数据,但系统无法在重新启动后继续运行,因为您的池无法导入。
看ZFS:丢失驱动器后如何恢复正确数量的副本?对于类似的问题。
答案3
很有趣,今天发现了这个。副本应保证由“副本”创建的 ditto 块存储在不同的 vdev 上: https://blogs.oracle.com/bill/entry/ditto_blocks_the_amazing_tape(参见“传播它们”部分)
因此,根据这篇博文,在具有多个可用副本的文件系统上,您将受到保护,以免出现磁盘完全故障。但是仅有的在这些文件系统上。
“在具有多个设备 (vdev) 的存储池中,事情会变得更加棘手。我们将每个块的副本分配到单独的 vdev 上”