一些演示声称 zfs 具有:
zfs 可以检测并纠正静默数据损坏。
例如从这里http://www.eecis.udel.edu/~bmiller/DE-OSUG/ECECIS-ZFS.pdf
- 但是您是否需要分配一些备用磁盘或 zfs 池来手动执行此操作?或者这是 zfs 固有的?
- 单磁盘 zfs 文件系统是否具有此功能或您必须获得 RAIDZ?
答案1
1.但是您是否需要分配一些备用磁盘或 zfs 池来手动执行此操作?或者这是 zfs 固有的?
受影响的数据需要冗余才能实现这一点。无需额外的磁盘即可实现此冗余。多个磁盘也并不意味着冗余。
ZFS 支持备用设备,但它们用于替换处于故障状态的其他设备。它们不用于数据冗余。
2. 单磁盘 zfs 文件系统是否具有此功能或您必须获得 RAIDZ?
无论池配置如何,除非您明确禁用校验和,否则 ZFS 始终会检测到损坏的数据,但这是一个非常糟糕的主意。
单个磁盘池可以在损坏的块包含元数据时恢复该块。只有将副本属性设置为 2 或更高时,才能恢复包含文件数据的块。
条带配置中的多个磁盘池类似于单个磁盘池,即元数据可以在磁盘腐烂后继续存在,同样,块的存在是文件数据自我修复的必要条件。
冗余配置中的多个磁盘池(镜像、raidz、raidz2、raidz3)可以恢复任何磁盘腐烂问题(当然,除非出现多个磁盘故障等大规模错误情况)。
读取受影响的文件(或元数据或 zvol 块)时会检测到错误。如果 ZFS 可以恢复错误,则会透明地修复错误并返回正确的数据。否则,会报告读取错误。请注意,校验和不是 ECC,因此它不能用于恢复损坏的块,只能用于检测它们。
如果您想要验证整个池而不等待读取发生,则可以使用清理机制。ZFS 将检查所有已使用的块,并在可能的情况下自行修复损坏的块。
答案2
要检测整个磁盘上的此类腐烂,您必须定期运行数据清理。一些发行版在 cron 作业中执行此操作,因此请查看它。
命令是zpool scrub techrx
。您一次只能运行一个清理进程。
每次从磁盘读取数据时,zfs 都会检查读取的数据是否腐烂。因此,您很确定读取的是干净的数据。建议每周运行一次完整检查,最多每月一次(我们对大多数 RAID 都这样做)。
1 您不需要分配磁盘空间。数据更正是在可用空间内完成的(我记得曾经看到过首先通过重写错误扇区来完成,如果发生故障,则会在其他地方重写,但这可能不准确)。当然,如果您的磁盘已经 100% 满了,这可能不可能
2 该过程基于已集成到 zfs 中的校验和
3 大多数情况下,清理会纠正数据,因为校验和实际上是一种纠错码。如果损坏的数据太大,则 zfs 无法恢复它们,但您的磁盘已经可以视为已损坏
您可以在此处获得更多信息:
运行定期数据清理:http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
zfs 再次自我修复静默损坏:http://hub.opensolaris.org/bin/view/Community+Group+zfs/selfheal