我有一台 FreeNAS 8.3 文件服务器,其中 ZFS 在 raidz 中运行四个 3TB 磁盘。
camcontrol 设备列表:
在 scbus0 目标 0 lun 0 (pass0,ada0) 在 scbus1 目标 0 lun 0 (pass1,ada1) 在 scbus2 目标 0 lun 0 (pass2,ada2) 在 scbus3 目标 0 lun 0 (pass3,ada3) 在 scbus6 目标 0 lun 0 (pass4,da0)
上周我注意到四个磁盘中有两个开始出现故障:
freenas smartd[2241]: 设备:/dev/ada0,24 个当前无法读取(待处理)的扇区 freenas smartd[2241]: 设备:/dev/ada0,24 个脱机无法纠正的扇区 freenas smartd[2241]: 设备:/dev/ada2,24 个当前无法读取(待处理)的扇区 freenas smartd[2241]: 设备:/dev/ada2,24 个脱机无法纠正的扇区
但是 zpool status -v 没有显示任何错误。我对 ZFS 不太熟悉,这是由另一个管理员设置的。出于某种原因,我以为我可以简单地逐个更换故障驱动器。这就是我接下来要做的。
2014-10-13.17:41:29 zpool 离线 vol1 gptid/24726389-df9e-11e1-9963-c860009da3f8 2014-10-13.18:19:24 zpool 替换 vol1 15380758640793782293 gptid/f1a3e8b8-5326-11e4-966d-c860009da3f8 2014-10-13.18:21:28 zpool 分离 vol1 15380758640793782293
重新同步过程完成后,我收到一个快照数据损坏的错误。系统设置为每小时快照一次,保存两周,每天快照一次,保存六个月。
[root@freenas]~# zpool 状态 -v 池:vol1 状态: 在线 状态:一个或多个设备发生错误,导致数据 损坏。应用程序可能会受到影响。 操作:如果可能,恢复有问题的文件。否则,恢复 整个池的备份。 参见:http://www.sun.com/msg/ZFS-8000-8A 扫描:2014 年 10 月 14 日星期二 22:10:59,耗时 27 小时 51 分钟,重新镀银 2.25T,出现 1 个错误 配置: 名称 状态 读写 CKSUM vol1 在线 0 0 1 raidz1-0 在线 0 0 2 gptid/f1a3e8b8-5326-11e4-966d-c860009da3f8 在线 0 0 0 gptid/24f91374-df9e-11e1-9963-c860009da3f8 在线 0 0 0 gptid/25865cb9-df9e-11e1-9963-c860009da3f8 在线 0 0 0 gptid/260cd97a-df9e-11e1-9963-c860009da3f8 在线 0 0 0 错误:在以下文件中检测到永久性错误: [电子邮件保护]:/home/.../some.pdf
现在这个文件很久以前就被删除了,所以我根本不关心它,我想我可以删除快照,但这让事情变得更糟:
[root@freenas]~# zfs 销毁[电子邮件保护] [root@freenas]~# zpool 状态 -v 池:vol1 状态: 在线 状态:一个或多个设备发生错误,导致数据 损坏。应用程序可能会受到影响。 操作:如果可能,恢复有问题的文件。否则,恢复 整个池的备份。 参见:http://www.sun.com/msg/ZFS-8000-8A 扫描:2014 年 10 月 14 日星期二 22:10:59,耗时 27 小时 51 分钟,重新镀银 2.25T,出现 1 个错误 配置: 名称 状态 读写 CKSUM vol1 在线 0 0 1 raidz1-0 在线 0 0 2 gptid/f1a3e8b8-5326-11e4-966d-c860009da3f8 在线 0 0 0 gptid/24f91374-df9e-11e1-9963-c860009da3f8 在线 0 0 0 gptid/25865cb9-df9e-11e1-9963-c860009da3f8 在线 0 0 0 gptid/260cd97a-df9e-11e1-9963-c860009da3f8 在线 0 0 0 错误:在以下文件中检测到永久性错误: <0x7c343>:<0x45b6bcd>
因此,我决定进一步调查,阅读 Oracle 文档,并发现了这一点:“如果四路 RAID-Z(raidz1)虚拟设备中的两个磁盘出现故障,则无法更换任何磁盘,因为没有足够的副本来检索数据。” ada2 仍然抛出错误,看起来我无法在现有池中替换它,因为这会使数据不可用?
这是否意味着恢复的唯一方法是备份现有数据、销毁池、替换 ada2、创建新池并在新池上恢复数据?或者还有其他方法可以做到这一点,也许删除 20140830 之前的所有快照?顺便说一句,最新的清理发现了另一个包含损坏数据的快照,显然是同一个文件:
[电子邮件保护]:/home/.../some.pdf
答案1
我相信你之所以看到这样的事情
errors: Permanent errors have been detected in the following files:
<0x7c343>:<0x45b6bcd>
是因为快照里的数据仍然存在,而且仅仅是快照而已。
请记住,ZFS 中的快照只是一个时间点标记;它实际上并不复制任何块,它只是在数据被替换时保持对旧块的引用(使用 ZFS 的正常写时复制行为)。因此,如果有任何快照引用坏块,它将在清理期间继续显示为错误。
该错误仅影响该特定文件,并且您的其他数据不会因该错误而面临任何其他风险。
“修复”是依次销毁包含受影响文件的每个快照。一旦所有这些快照都被销毁,对坏块的引用将不再存在,并且 ZFS(希望)将报告没有错误。
此外,在 ZFS 池中更换发生故障但仍可运行(边缘)设备的推荐方法是zpool replace pool old-dev new-dev
在整个更换过程中同时使用旧设备和新设备。这样,ZFS 就可以在可能的情况下使用边缘设备上的数据。完成后zpool replace
,旧设备将自动从池中移除,并且可以物理断开连接。显然,这需要在主机上有适当数量的额外互连可用。