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