一位朋友正在和我讨论位腐烂问题 - 驱动器上的位随机翻转,损坏数据。这种情况极为罕见,但随着时间推移,这可能会成为一个问题,而且无法检测到。
驱动器不会认为它是坏扇区,备份只会认为文件已更改。没有涉及校验和来验证完整性。即使在 RAID 设置中,也会检测到差异,但无法知道哪个镜像副本是正确的。
这是真正的问题吗?如果是,该怎么办?我的朋友推荐使用 zfs 作为解决方案,但我无法想象将我们工作中的文件服务器扁平化,使用 Solaris 和 zfs。
答案1
首先:您的文件系统可能没有校验和,但您的硬盘本身有校验和。例如,有 SMART。一旦有太多位被翻转,错误当然就无法纠正。如果您真的不走运,位可能会发生变化,以至于校验和不会失效;然后错误甚至不会被检测到。所以,糟糕的事情能会发生;但声称随机的位翻转会立即破坏数据是错误的。
但是,是的,当你把数万亿的数据放在硬盘上时,它们不会永远保持原样;这是一个真正的问题!ZFS 可以在每次读取数据时进行完整性检查;这类似于你的硬盘本身已经执行的操作,但这是另一种保护措施,你需要为此牺牲一些空间,因此你提高了对数据损坏的抵御能力。
当您的文件系统足够好时,未检测到的错误发生的概率就会变得非常低,您不再需要关心这个问题,并且您可能会认为在您使用的数据存储格式中内置校验和是不必要的。
无论哪种方式:不,并非不可能发现。
但文件系统本身永远无法保证每次故障都能恢复;它不是灵丹妙药。您仍然必须有备份和计划/算法,以便在检测到错误时采取相应措施。
答案2
是的,这是一个问题,主要是因为驱动器大小增加了。大多数 SATA 驱动器的 URE(不可纠正读取错误)率为 10^14。或者,从统计上讲,驱动器供应商表示每读取 12TB 数据,驱动器就会返回读取失败(您通常可以在驱动器规格表上查找它们)。驱动器将继续为驱动器的所有其他部分正常工作。企业 FC 和 SCSI 驱动器的 URE 率通常为 10^15(120TB),并且有少量 SATA 驱动器有助于降低这一比率。
我从未见过两个磁盘同时停止旋转,但我曾遇到过 raid5 卷遇到此问题(5 年前,使用 5400RPM 消费级 PATA 驱动器)。驱动器发生故障,被标记为死机,然后对备用驱动器进行重建。问题是,在重建期间,第二个驱动器无法读取那一小块数据。根据执行 raid 的人,整个卷可能都死机了,或者只是那一小块数据可能死机了。假设只有一个块死机了,如果您尝试读取它,您将收到错误,但如果您写入它,驱动器将将其重新映射到另一个位置。
有多种方法可以防止:raid6(或同等方法)可以防止双磁盘故障,这是最好的方法,其他方法是使用 URE 感知文件系统(如 ZFS),使用较小的 raid 组,因此从统计上讲,达到 URE 驱动器限制的可能性较低(镜像大型驱动器或 raid5 较小的驱动器),磁盘清理和 SMART 也有帮助,但它本身并不是真正的保护措施,只是作为上述方法的补充。
我管理着近 3000 个磁盘阵列,这些阵列不断检查驱动器,寻找潜在的 URE。我收到的 URE 信息流相当稳定(每次发现一个 URE 时,它都会在驱动器发生故障之前修复它并提醒我),如果我使用的是 raid5 而不是 raid6,并且其中一个驱动器完全坏了...如果它击中某些位置,我就会遇到麻烦。
答案3
硬盘通常不会将数据位编码为单个磁畴——硬盘制造商始终意识到磁畴可能会翻转,并在驱动器中内置了错误检测和纠正功能。
如果某个位发生翻转,则驱动器包含足够的冗余数据,这些数据可以在下次读取该扇区时得到纠正。如果您检查驱动器上的 SMART 统计数据,就会看到这一点,即“可纠正错误率”。
根据驱动器的详细信息,它甚至应该能够从扇区中的多个翻转位中恢复。可以悄悄纠正的翻转位数是有限制的,并且可能可以检测为错误的翻转位数也有另一个限制(即使不再有足够的可靠数据来纠正它)
所有这些加起来就是硬盘可以自动纠正大多数错误,并且可以可靠地检测出大多数剩余的错误。您必须在单个扇区中出现大量位错误,并且这些错误都发生在再次读取该扇区之前,并且这些错误必须使得内部错误检测代码再次将其视为有效数据,否则您就不会出现无声故障。这并非不可能,我相信运营非常大型数据中心的公司确实看到过这种情况(或者更确切地说,这种情况发生了,他们不你也许不会亲眼看到它发生,但问题肯定没有你想象的那么严重。
答案4
从理论上讲,这值得担忧。实际上,这也是我们保留儿童/父母/祖父母备份的部分原因。在我看来,年度备份需要保留至少 5 年,如果你遇到的情况比这更早,那么该文件显然就不那么重要了。
除非你处理的是可能会液化某人的大脑,我不确定风险与回报是否足以改变文件系统。