多年前的一些具有里程碑意义的studies现在表明大型数据集中的silent corruption比以前预期的要广泛得多(今天我猜你会说它是more than commonly realized)。
假设应用程序和操作系统编写了一个扇区并且有时间让所有内容刷新,没有崩溃或异常关闭,或者软件错误会导致错误的数据被保存。
稍后,读回扇区,并且HDD没有读取错误。但它包含错误的数据。
由于HDD数据编码包含纠错码,我认为通常会通过检查注意到任何神秘状态改变。即使检查不是很强,一些错误也会漏掉,仍会有更多检测到的错误告诉你驱动器有问题。但事实并非如此:显然,数据被发现是错误的,没有任何症状。
怎么会发生这种情况?
我在桌面PC上的经验是,有时曾经发现的文件很糟糕,但也许这是由于在写入过程中未被注意到的问题,无论是移动扇区还是文件系统跟踪数据。重点是,可能在写入时引入错误,其中数据在HDD(或RAID硬件)内部被破坏,因此错误数据被写入其纠错码以匹配。如果这是(唯一)原因,那么单个验证应足以表明它确实写入了。
或者,数据在磁盘上被认为是正常后会变坏吗?也就是说,验证一次,一切都很好;稍后验证,并且在此期间未写入该扇区时发现错误。我认为这就是意思,因为写入时错误很容易通过改进的刷新检查来处理。
那么如果不跳过与数据一起使用的纠错码,怎么会发生呢?
答案 0 :(得分:4)
某些方面可能会发生无声数据损坏:
偶然与其错误代码匹配的腐败本身不太可能,但是大量数据和生日悖论确保它们确实发生。今天的驱动器始终存在内部读取错误,并严重依赖校验和来捕获它们。如果是这样,他们只是重新读取该扇区,直到他们有一个良好的读取,如果一个扇区变得太糟糕,他们默默地将它与备用扇区交换。如果在从SATA电缆读取数据时发生校验和错误,SATA控制器可能也会静默地重新发送数据。
通过使用更长的校验和,可以使随机损坏仍然与校验和匹配的可能性变小,但这涉及更多的存储和处理开销。对于SATA等标准化协议,您不能仅在不破坏兼容性的情况下更改校验和大小。并且没有协议或磁盘级校验和将为您节省固件错误或其他软件错误。
像ZFS / Btrfs这样的文件系统级校验和的一大优势是它们可以捕获所有这些错误,除了主内存损坏(使用ECC内存以防止这种情况)和软件错误。并且它们可以使用比单个磁盘块更大的校验和块大小,以减少更长校验和的存储开销。
答案 1 :(得分:2)
请参阅提供充分说明的http://en.wikipedia.org/wiki/Silent_data_corruption#Silent_data_corruption。我还想提一下生日悖论,它解释了为什么错误概率高于直觉预期的概率。请参阅http://en.wikipedia.org/wiki/Birthday_paradox。
写入时,计算CRC的扇区并写入磁盘。在读取时,数据与CRC一起被读取。从已从磁盘读取的数据重新计算CRC,然后将其与从磁盘读取的CRC进行比较。
磁盘级别可能出现什么问题,但会被检测到: - 一个或多个数据位未正确写入。 - 一个或多个CRC位未正确写入磁盘。 - 两者都已正确写入磁盘但后来损坏了。 - 两者都写得正确,但控制器坏了或有问题。
磁盘上可能出现什么问题,但未检测到(无提示错误): - 数据或CRC由于磁盘写入错误或由于缺陷扇区读取而损坏,但(尽管概率很低)计算出的CRC与从器件读取的CRC匹配。这就是生日悖论发挥作用的地方。
通过磁盘: - 控制器从磁盘正确读取数据,但通过SATA电缆错误地将数据传输到内存。我假设SATA有某种类型的纠错,但是你可以在这里重复这个过程。 - 数据从磁盘传输到控制器并通过SATA电缆,但存储器位反转。
答案 2 :(得分:2)
一种类型的静默损坏是由于许多硬盘驱动器本身具有一点写缓存(与磁盘控制器和/或操作系统上的缓存不同)。
对于此硬盘驱动器内部缓存,在大多数情况下,它的不断电是安全的。即,如果有人在高I / O写入速率操作期间拔出插头,则硬盘缓存中的数据将丢失。
例如,在我曾经研究过的基于戴尔的高端数据库企业服务器上,如果有人在进行大量写入操作时意外拔出插件(可能是50%的时间),我们很有可能发生数据库损坏)。我们现在的标准操作过程是禁用硬盘驱动器内部缓存(禁用磁盘控制器缓存,或者在磁盘控制器级别设置写回缓存并没有为我们关闭硬盘驱动器内部缓存)
有关详细信息,请参阅http://brad.livejournal.com/2116715.html以及检测此问题的测试工具。
请注意,操作系统崩溃不会导致此类损坏。只有电源故障。