使用mdadm进行位腐检测和校正


17

我将在我的家用linux盒nas中重新组织所有硬盘,并希望使用mdadm raid进行数据保护并灵活地调整阵列的形状。但是,在使用mdadm之前,我想知道它如何处理bit rot。特别是不会导致HDD发送不可恢复的读取错误消息的位腐烂。

鉴于我可能会在nas的8个磁盘中使用至少21TB的HDD,以及有关HDD 发生故障的可能性的各种报价,我想在从单个磁盘故障进行重建的过程中,我很可能会遇到其余磁盘上出现某种形式的位腐。如果在其中一个驱动器上发生了不可恢复的读取错误,则该驱动器实际上将其报告为错误,我相信使用raid6(是吗?)应该没问题。但是,如果从磁盘读取的数据是错误的,但是磁盘没有报告这种情况,那么即使使用raid6,我也看不到如何自动纠正它。这是我们需要关注的事情吗?鉴于文章是2010年,RAID5仍然有效以及我自己在家庭和工作中取得的成功经验,事情并不一定像流行语和行销所要让我们相信的那样悲惨和沮丧,但是我讨厌因为HDD失败而不得不从备份中恢复。

假设使用模式是,最多写入几次,偶尔读取一次,那么我将需要执行数据清理。我在archlinux Wiki上看到 了mdadm命令,用于将数据清理数组为

echo check > /sys/block/md0/md/sync_action

然后监控进度

cat /proc/mdstat

在我看来,它将读取所有磁盘的所有扇区,并检查数据是否与奇偶校验匹配,反之亦然。尽管我注意到文档中非常强调说在很多情况下,“检查”操作将无法自动更正,只能进行检测,而这将由用户自行解决。

我应该选择哪种mdadm RAID级别以最大程度地保护自己免受比特腐烂的侵害,我应该执行哪些维护和其他保护步骤?而这将不能保护我免受什么侵害?

编辑:我不打算开始RAID vs ZFS或任何其他技术QA。我想特别了解mdadm突袭。这也是为什么我在Unix&Linux而不是在SuperUser上询问的原因。

编辑:答案是: mdadm仅能纠正磁盘系统在数据清理期间报告的URE,并在清理期间检测到静默位腐烂,但无法/无法解决?


就数据保护而言,我在zfs中看到的主要好处是,每当您读取文件时,它都会清理文件的磁盘位置。这就是为什么我目前使用zfs对其进行设置的原因。但无论如何,我仍然需要定期进行全面磨砂。我有2个zfs池,每个池有3个磁盘,我想升级到8个磁盘的系统,其中任何驱动器都可能发生故障,并且仍然会有1个冗余驱动器,而zfs不灵活,无法进行这样的重塑。因为无论如何我都在重建,所以我正在重新访问mdadm。
BeowulfNode42

到目前为止,您对RAID5 / 6感到很幸运。事实是,现在是2013年,RAID仍然存在写入漏洞。如果在写入数据之后但在写入奇偶校验之前断电,则可能是破坏了良好的数据,并且由于不一致的原因,阵列也可能被烘烤。感谢RAID5。
bahamat 2013年

问题是,您想要做的最好是在文件系统层完成。否则,您可能需要某种方法来检测并最好纠正位腐烂(可能在减少冗余或无冗余的情况下),而RAID根本不适合这种情况。不仅不能保证您最终不会腐烂(如果一个驱动器发生故障而另一个驱动器从盘片上读取了错误位,该怎么办?),而且普通RAID也没有什么是重要数据和什么是概念的概念。只是噪音。由于ZFS仅清除参考数据,因此磁盘未使用部分上的位腐变为非问题。
CVn 2013年

确实,您不能指望在多个磁盘(甚至具有冗余)上分层放置随机文件系统,以突然保护您免受存储故障的影响。我并不是将ZFS推向大众的圣战(尽管我确实认为这是一个伟大的发明,并且可以在Linux上将它自己用于除根分区之外的所有其他东西,而根分区是mdraid1上的ext4,以实现软件兼容性),但是我也认识到,您的问题是ZFS从头开始设计的,旨在解决的问题之一:有保证的检测,以及如果可能的话,修复数据损坏,无论原因如何。
CVn 2013年

我认为您应该修改您的要求。即使应用了纠错功能,您真的需要位保护吗?您是否知道在磁盘的ECC纠正过的情况下,bitrot不太可能存在?
穴居人

Answers:


5

坦白地说,您拒绝RAIDZ2 ZFS实在令人惊讶。除了它不是Linux MD ,它似乎几乎可以完全满足您的需求。我并不愿意将ZFS推向大众,但简单的事实是,您的问题是ZFS 从头开始设计以解决的问题之一。依靠RAID(任何“常规” RAID)来提供错误检测和纠正(可能在冗余减少或无冗余的情况下)似乎是有风险的。即使在ZFS无法正确纠正数据错误的情况下,它也至少可以检测到该错误并告知您存在问题,从而允许您采取纠正措施。

你不具备做定期的全磨砂与ZFS,虽然它是推荐的做法。ZFS将验证从磁盘读取的数据是否与读取数据时写入的数据匹配,并且在出现不匹配的情况下,要么(a)使用冗余来重建原始数据,要么(b)将I / O错误报告给应用程序。另外,清理是低优先级的联机操作,与大多数文件系统中可以高优先级和脱机的文件系统检查有很大不同。如果您正在运行Scrub,但Scrub之外的其他东西想要执行I / O,则Scrub将在整个过程中都处于后排位置。ZFS清理代替RAID清理以及文件系统元数据和数据 完整性检查,这比检查RAID阵列以检测任何位腐烂要彻底得多(后者不会告诉您数据是否有意义,仅告诉您RAID控制器已正确写入数据)。

ZFS冗余(RAIDZ,镜像等)的优点是,在清理过程中无需检查未使用的磁盘位置的一致性;在清理过程中,仅检查实际数据,因为工具沿分配块链移动。这与非冗余池相同。对于“常规” RAID,必须检查所有数据(包括磁盘上任何未使用的位置),因为RAID控制器(无论是硬件还是软件)都不知道实际上是什么数据。

通过使用RAIDZ2 vdev,任何两个组成驱动器都可以发生故障,然后才有可能因另一个驱动器故障而导致实际数据丢失,因为您拥有两个驱动器的冗余价值。这与RAID6基本相同。

在ZFS中,将对所有数据(用户数据和元数据)进行校验和(除非您选择不这样做,但建议不要这样做),并且这些校验和用于确认数据由于任何原因未更改。同样,如果校验和与期望值不匹配,则将透明地重建数据或报告I / O错误。如果报告了一个I / O错误,或者一个scrub识别出一个损坏的文件,您将知道该文件中的数据可能已损坏,并且可以从备份中恢复该特定文件。无需完整阵列还原。

普通的甚至是双奇偶校验的RAID都无法保护您免受某些情况的困扰,例如当一个驱动器发生故障而又一个驱动器从磁盘上错误地读取数据时。假设一个驱动器发生故障,而其他驱动器中的任何一个都发生了一点翻转:突然,您发现了未被发现的损坏,除非您对此感到满意,否则您将需要一种至少可以检测到它的方法。减轻这种风险的方法是对磁盘上的每个块进行校验和,并确保校验和不会随数据一起损坏(防止出现高飞写入,孤立写入,写入磁盘上错误位置等错误)。只要启用了校验和,ZFS便会执行此操作。

唯一真正的缺点是,您无法通过向其添加设备来轻松扩展RAIDZ vdev。有一些解决方法,通常将诸如稀疏文件之类的东西作为vdev中的设备使用,并且通常被称为“如果是我的数据,我不会这样做”。因此,如果您使用RAIDZ路由(无论您使用RAIDZ,RAIDZ2还是RAIDZ3),都需要预先确定每个vdev中需要多少个驱动器。尽管vdev中的驱动器数量是固定的,但是您可以通过逐渐(确保保持在vdev的冗余阈值之内)用更大容量的驱动器替换并完全重新备份来增加vdev。


5
在我最初的问题中,我试图避免使用zfs vs raid参数,因为这方面有很多信息。我想要有关mdadm的特定信息。另外,由于我不会足够频繁地读取所有数据以确保定期清理数据,因此无论zfs还是raid,我都需要定期强制执行整个阵列清理。
BeowulfNode42 2013年

@ BeowulfNode42我个人建议对异常重要的数据使用应用程序层校验和(例如,使用sha256对重要数据进行校验和)。ZFS可以按块执行此操作,我认为这实在是太过分了。我认为这解释了为什么文件系统不像ZFS那样对它们的块进行校验和处理,因为IMO在我看来这更多的是应用层问题。
穴居人

1
@caveman我对你一无所知;我真的很喜欢这样的事实,我不必不断地对文件进行校验,以确保它们没有损坏。当然,绝大部分时间都没有损坏,在这种情况下,不会造成任何损害(使用ZFS,您可以在少数几个校验和算法中进行选择,因此您可以沿安全性/性能连续性选择首选点),但是自动文件系统级别的校验和可确保不存在未纠正的损坏,因为如果存在,您将通过接收I / O错误而不是损坏的数据来了解ZFS情况。
CVn

@MichaelKjörling不,它不能“保证”(仅相对于仅磁盘检查,就可以减少未被检测到的错误的可能性,而且还没有人量化过!因此,没人真正知道ZFS的校验和有多么有用:)),以及您可以使用简单的“读取”和“写入”包装器,这些包装器将透明地为您执行校验和。不需要将这些奇特的东西放入内核空间。
穴居人

3
@caveman不,zfs不在主题上。不是mdadm的RAID的可能实现都没有。我想了解mdadm。我已经尽可能多地否决了该答案,并且您对离题答案的评论填写了有关离题答案的更多信息,对原始问题没有帮助。
BeowulfNode42 '16

3

这个答案是基于我发现的各种证据进行推理的产物。我不知道内核Linux的实现方式是如何工作的,因为我不是内核开发人员,而且那里似乎有很多荒谬的错误信息。我认为内核Linux是明智的选择。除非我弄错了,否则我的答案应该适用。

许多驱动器使用ECC(纠错码)来检测读取错误。如果数据损坏,则内核应从支持ECC的驱动器收到该块的URE(不可恢复的读取错误)。在这种情况下(下面有一个例外),将损坏的数据或空的数据复制到良好的数据上将构成精神错乱。在这种情况下,内核应该知道哪些是好数据,哪些是坏数据。根据“ 现在是2010年,RAID5仍然有效……”文章:

考虑这种替代方法,我知道至少有两个阵列供应商会使用它。当RAID卷中的驱动器报告URE时,阵列控制器将通过从奇偶校验重建块来增加计数并满足I / O。然后,它在报告URE的磁盘上执行重写(可能通过验证),如果扇区损坏,则微码将重新映射,并且一切都会好起来。

但是,现在例外:如果驱动器不支持ECC,驱动器存在数据损坏或固件特别失灵的情况,则可能不会报告URE,并且会将损坏的数据提供给内核。在数据不匹配的情况下:看来,如果您使用的是2磁盘RAID1或RAID5,那么即使处于非降级状态,内核也无法知道哪个数据是正确的,因为只有一个奇偶校验阻滞,没有报告URE。在3磁盘RAID1或RAID6中,单个损坏的未标记URE的块将不匹配冗余奇偶校验(与其他关联的块结合使用),因此应该可以进行适当的自动恢复。

这个故事的寓意是:将驱动器与ECC一起使用。不幸的是,并非所有支持ECC的驱动器都宣传此功能。另一方面,请小心:我知道有人在2磁盘RAID1(或2副本RAID10)中使用便宜的SSD。其中一个驱动器在每次读取特定扇区时返回了随机损坏的数据。损坏的数据会自动复制到正确的数据上。如果SSD使用ECC且功能正常,则内核应已采取适当的纠正措施。


1
我认为所有现代硬盘都具有某种形式的内部ECC。它是否有效,正确或故障是另一回事。ECC必须在驱动器内部使用,才能报告URE。我最感兴趣的静音位腐烂即使在支持它的驱动器上也没有报告URE,因为当他们认为没有数据时,他们会认为它们具有正确的数据。
BeowulfNode42 '16

我认为您是指位随机翻转。在任何情况下,ECC均设计为检测翻转位。根据Wikipedia的介绍,Reed-Solomon纠错是一种常见的ECC格式,于1960年发明,至今仍在蓝光光盘+ HDD中使用。如果您发现该算法极其可靠,那么您的问题应该得到很好的回答,因为就定义而言,体面的现代硬件同样好,甚至更好,即使您不知道某个硬件的外观如何看着它。
sudoman '16

1
由于其他问题,例如当某些问题导致驱动器磁头未正确对准其认为正在写入的位置并溢出到附近扇区时,也会发生位腐。它可能会修复其打算工作的扇区,但是附近的扇区将受到损坏。如果它恰好以某种方式覆盖了data + ecc,则附近扇区的ECC报告为正常,则驱动器将永远不会知道它有问题。更有可能的是,一些流氓软件会指示驱动器写入不良数据,而硬盘将忠实地存储该不良数据。例如,错误的dd命令
BeowulfNode42 '16

2

为了获得所需的保护,我将在两个位置使用RAID6 +常规异地备份。

无论如何,我个人每周都要进行一次清理,并根据数据的重要性和更改速度每晚,每周和每月进行备份。


1
但是它提供什么位腐烂检测/校正功能?
BeowulfNode42 2015年

1
频繁清理的RAID6提供了一些位保护,因为双重奇偶校验有效地创建了同一块的三个版本,因此可以对哪个版本正确进行“投票”。AFAIK,Linux dm-raid中的RAID6清理只是这样做,如果我错了,请纠正我。
P.Péter

1
@P.Péter我意识到所涉及的数学可以使用投票系统,但是mdadm吗?您是否知道有关此的任何文档,或者是否有亲身经历导致您得出此结论。特别是根据Ethan的回答。
BeowulfNode42 '16

这是前一段时间,但我隐约记得在发表评论之前先阅读了mdadm RAID6机制。抱歉,不是很具体。:(我想我们可以在mdadm的使用一个真正的专家...
P.Péter

2

我没有足够的代表对此发表评论,但是我想指出,Linux中的mdadm系统无法纠正任何错误。如果您在清理RAID6的过程中告诉它“修复”错误,则如果存在不一致,它将通过假定数据部分正确并重新计算奇偶校验来“修复”它。


1
除非我对你有误解,否则这似乎不太可能。您是说损坏的块中的数据经常被复制到正确的块中吗?这将要求坏块不是来自支持ECC的驱动器(因此不会报告URE),并且您正在使用RAID5或2副本RAID1(而不是您建议的RAID6。)
sudoman

@sudoman,在清理过程中,如果Linux MD子系统检测到数据与奇偶校验之间不匹配,则它会盲目地认为奇偶校验是错误的,然后根据数据重新编写。可以使用RAID 6的双重奇偶校验来确定哪个错误,但是Linux MD子系统不会这样做。
Mark

1
伊桑,我不认为您对此信息有任何参考?还是您愿意分享自己记忆的个人经历的例子?考虑到该Q产生的风滚草,即使是轶事信息也将有所帮助。自从发布此问题以来,我在启动驱动器的mdadm RAID1上遇到了一些问题,当其中一个损坏时,USB棒上的价格(便宜)。后来的一些调查指出,失败的USB记忆棒没有足够的空间或没有任何错误检查,或者只是未能将数据写入某些块而没有产生写入错误。我必须重新安装操作系统。
BeowulfNode42

-2

有点腐臭。?当然...

我想您需要和SEAGATE交谈。(忘了吗?那是借口)吗?现在,所有驱动器都具有100位ECC校正功能,您需要首先证明其损坏。
我敢打赌你不能。(担心的是FUD的事情对吗?),例如害怕鬼魂或#13?并没有在这里完成。零证明发生了。更糟糕的是没有原因的证明。

首先定义位腐烂是什么意思?ouch ... HDD:ECC根据ECC 100位存储检查数据(甚至1位)。如果错误,则对其进行更正;如果它继续使SMART引擎出故障,则可以肯定地在SAS驱动器上,将其替换为性能良好的群集或扇区。使用备用群集。这样可以修复损坏。是的,从IBM的第一个驱动器到现在,从头到尾,所有驱动器都会变得越来越糟。但现在我们进行自我修复,请阅读完整的Seagate白皮书。在那里无休止地学习驱动器的工作原理。好?

这种情况一直持续下去,直到您用完备用零件(智能大脑),然后SMART尖叫着生命尽头。(或者像HP一样,甚至更早)使用HP P420控制器时,它一直在监视。我什至给我发了电子邮件,显示NEAR OUT OF SPARE集群。有时候,备件走得更快,很快就会有厄运的迹象,(肯定有10岁,在垃圾桶里少了。

我称BOGUS,而FUD有点烂。

我的猜测是某人的玩具PC出于某种原因将数据写错了。没有运行ECC内存?糟糕,实际服务器具有ECC RAM。病毒感染了?还是在写入过程中断电(没有UPS>?)?或记忆不良。或ESD损坏。或PSU产生大量噪音(严重)

我在这里称FUD。抱歉,


1
我刚刚澄清过,我在说我的家庭系统,因此ECC和服务器级硬件不在我的预算价格范围内。我的家庭实验室更容易发生意料之外的断电,即使其发生迷你起跳或其他随机事件,例如塔倒塌或发生其他情况。还可以通过多种其他方式告知HDD存储错误的数据,并让HDD存储该错误数据的ECC位。我不在乎错误是如何发生的,我希望可以轻松地解决它们。
BeowulfNode42 '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.