当驱动器上发生错误时,假设它总是被检测到并报告给操作系统(如果是软件 RAID,如 mdadm)或 RAID 控制器(如果是硬件 RAID)作为读取失败(即它不会静默返回损坏的数据),然后 RAID 软件/控制器将采用该事实并使用 RAID 中的其他驱动器来读取数据(假设它是具有冗余的 RAID 类型)?
据我了解,现代企业级驱动器有适当的错误检测方案,所以我假设是这种情况,但很难在网上找到任何结论性的东西。我想这个答案在一定程度上取决于驱动器内置错误检测的质量,所以如果它很重要,我最感兴趣的是英特尔 DC S3500 系列 SSD。
编辑 2015 年 6 月 5 日 - 澄清:
具体来说,我想知道今天用于检测错误的算法是否防弹。在一个简单的例子中,如果错误检测只是对扇区中的所有位进行 XOR,那么如果两个位被翻转,则不会检测到错误。我想它们比这更先进,但我想知道错误未被发现的几率是多少,如果它是如此之低以至于我们甚至不必担心它,以及是否有一些权威来源或值得信赖的文章在某个地方可以被引用。
编辑 2015 年 6 月 10 日
更新了问题标题和问题正文,使其更适用于磁盘错误的概念(不像最初那样以 mdadm 为中心)。
硬盘驱动器确实有多种纠错方法来防止数据损坏。硬盘驱动器分为扇区,其中一些可能会变得完全不可写/不可读或通过数据损坏返回错误数据 - 我们称第一个坏扇区损坏和后一个无声数据损坏。
坏部门腐败
驱动器本身已经通过多种方式处理了第一个损坏。在工厂,每个制造的驱动器都经过坏扇区测试,这些坏扇区被放入主要缺陷列表 (p-list)。在驱动器的正常使用过程中,内部系统可能会通过正常的磨损发现更多的坏扇区——这些坏扇区被放入Grown Defect List(g-list)中。有些驱动器有更多列表,但这两个是最常见的。
驱动器本身通过将对硬盘驱动器扇区的访问重新映射到备用扇区而不通知操作系统来应对这些错误。但是,每次重新映射发生时,硬盘驱动器 SMART 系统中的适当值都会增加,从而表明硬盘驱动器的磨损越来越大。要查找的指标是 SMART 5 - Reallocated Sector Count,而其他重要的指标是 187(报告的不可纠正错误)、197(当前待处理的扇区数)和 198(离线不可纠正)。
为了找到坏扇区,硬盘驱动器使用内部纠错码 (ECC),可用于确定特定扇区中数据的完整性。这样,它可以检查扇区中的写入和读取错误,并在必要时更新 g-list。
来源
静默数据损坏
由于我们确实有相当多的内部数据完整性检查,因此无声数据损坏应该非常少见——毕竟,由于硬盘驱动器的任务是可靠地保存数据,它们应该正确地完成这项工作。
为了将用户请求读取或写入之外的静默数据损坏量降至最低,RAID 系统会定期检查完整驱动器的 ECC 以更新 g-list(数据清理)。如果发生错误,则在检查扇区 ECC 后从另一个 RAID 成员重建数据。
然而,所有的数据校正和完整性检查都必须在某个地方完成——固件。这些低级程序中的错误可能仍然会导致问题,机械问题和误报 ECC 总和也可能会导致问题。一个示例是未经检查的写入,其中固件错误地报告写入成功,而实际的硬盘驱动器写入没有发生或有故障(身份差异)。
有一些关于这些故障的统计发生的研究,其中文件系统数据完整性检查确实报告了故障而没有底层驱动器报告问题,因此显示出无声的数据损坏。
TLDR:在 17 个月的时间跨度内,平均低于 0.3% 的消费者磁盘和低于 0.02% 的企业磁盘包含此类身份差异,并检查了 150 万个磁盘(总共 365 个磁盘存在身份差异) - 请参阅表 10 和第 5 节在本出版物中。
来源
是的,mdadm 将检测到此类错误,将故障驱动器标记为有缺陷,并将其从工作阵列中删除,如果冗余可用,该阵列将继续以降级模式运行。
但是 AFAIK mdadm 在“软件”级别执行此操作,基于它从驱动器接收到的错误以响应其通用 I/O 请求(适用于任何驱动器),而不是通过查询驱动器特定的错误检测功能。
嗯,事情有点复杂。
现代硬盘驱动器不仅检测错误,它们还有一些备用扇区和智能控制器,试图重新定位坏扇区。即当你尝试读取某个逻辑扇区时,第一次没有读取,控制器会尝试多次读取,有时重试几次后才能读取;然后它将数据写回备用扇区,将逻辑扇区重新映射到新扇区并将旧扇区标记为坏扇区,最后为您提供数据。所有这些过程对读者来说都是完全透明的,你不会注意到任何错误。但是,这通常会反映在 SMART 统计数据中,如果这种情况越来越频繁地发生,您可以看到驱动器在实际发生故障之前就会发生故障。这就是为什么在您的系统上使用 SMART 监控工具非常重要的原因。
当一个扇区根本没有读取,或者控制器用完备用扇区时,驱动器将返回读取错误。错误检测现在非常安全,它对扇区数据使用某种 CRC。当返回读取错误时,mdadm 将看到它,将驱动器标记为不可用并将阵列切换到降级模式。