写孔:哪些 RAID 级别受到影响?

Mar*_*ale 7 raid storage mdadm software-raid raidz

在了解 RAIDZ 的优势的过程中,我遇到了write hole的概念。

正如本页所解释的,写空洞是指在写入过程中断电时阵列磁盘之间出现的不一致。该页面还解释了它会影响 RAID-5/6(如果在写入数据后但在计算奇偶校验之前断电)和 RAID-1(数据写入一个磁盘而不是其他磁盘) ,而且它是一个只能要么再同步/擦洗,或其中一个磁盘的重建期间(灾难性)期间被检测到的隐蔽的问题...然而,大多数 所述 其他 来源谈论它,因为它仅受影响的奇偶基于 RAID 级别。

据我了解,我认为这也可能是 RAID-1 的一个问题,因为从包含该漏洞的磁盘读取将返回垃圾,所以...是否每个RAID 级别都有问题?它是否依赖于实现?它只影响软件 RAID,还是硬件控制器?(补充:mdadm这方面的票价如何?)

sho*_*hok 5

术语写入孔用于描述在处理非电池保护 RAID 阵列时出现的两个相似但不同的问题:

  • 有时它被错误地定义为由于突然断电而导致 RAID 阵列中的任何损坏。有了这个(错误的)定义,RAID1 很容易出现写空洞,因为你不能原子地写入两个不同的磁盘;

  • 写入空洞的正确定义,即在条带更新期间突然断电导致整个条带数据冗余的丢失,仅适用于基于奇偶校验的 RAID。

写入孔的第二个正确的定义需要更多解释:让我们假设一个 3 磁盘 RAID5,具有 64K 块大小和 128K 条带大小(每个条带 +64K 奇偶校验大小)。如果在将 4K 写入磁盘 #1 后断电,但磁盘 #3 上的奇偶校验更新期间,我们可能会遇到虚假(即:损坏的)奇偶校验块和未检测到的数据一致性问题。如果稍后磁盘 #2 死机并且奇偶校验用于通过对磁盘 #1 和磁盘 #3 进行异或来恢复原始数据,则重建的 64K(最初驻留在磁盘 #2 上且最近写入)仍然会损坏。

这是一个人为的例子,但它应该暴露与写入孔相关的主要问题 :丢失未触及的、静止的、不相关的数据与最新的中断写入共享同一条带。换句话说,如果 fileA 是多年前写入的,但与刚刚写入的 fileB 共享同一条带,并且系统在 fileB 更新期间断电,则 fileA 将处于危险之中。

另一件要考虑的事情是数组的写策略:使用读/重构/写(即:当部分写发生时重写整个条带)与读/修改/写(即:只更新受影响的块+奇偶校验)暴露于不同类型的写孔。

从上面可以清楚地看出,RAID0 和 RAID1 没有适当的写漏洞:它们没有奇偶校验,这可能会导致整个条带“不同步”失效。请注意,RAID1 镜像支路在非正常关机后可能会不同步,但唯一的损坏将是最新写入的数据。以前写入的数据(即:静止数据)不会遇到任何麻烦。

定义并确定了适当的写入漏洞后,如何避免?

  • HW RAID 使用非易失性写入缓存(即:BBU+DRAM 或电容式闪存模块)来持久存储要写入的更新。如果断电,当电源恢复和系统启动时,硬件 RAID 卡将重新发出任何挂起的操作,将其缓存刷新到磁盘盘片。这不仅可以防止正确的写入漏洞,还可以防止上次写入的数据损坏;

  • Linux MD RAID 使用写入位图,更新它们之前记录要写入的条带。如果断电,则使用脏位图重新计算受影响条带的任何奇偶校验数据。这仅防止真正的写孔;最新写入的数据可能会损坏(除非由 fsync()+write 屏障支持)。相同的方法用于重新同步 RAID1 阵列的不同步部分(确保两个镜像分支同步,尽管镜像不存在写入孔);

  • 较新的 Linux MD RAID5/6 应该可以选择使用日志/日志设备,部分模拟适当硬件 RAID 卡的非易失性回写缓存(并且,根据特定的补丁/实现,防止写入漏洞和最后-写入数据损坏或仅来自写入孔);

  • 最后,RAIDZ避免两者写入漏洞,并使用最“优雅”,但是影响性能的,方法最后的数据损坏:只写全尺寸条纹(和日记的ZIL / SLOG任何同步写入)。

有用链接:
https : //neil.brown.name/blog/20110614101708
https://www.kernel.org/doc/Documentation/md/raid5-ppl.txt
https://www.kernel.org/doc/Documentation /md/raid5-cache.txt
https://lwn.net/Articles/665299/


Mar*_*ale 2

写漏洞会影响除 RAID-0 之外的所有RAID 级别;条带 (RAID-4/5/6) 和镜像 (RAID-1) 配置都可能容易受到攻击,这仅仅是因为在 2 个或更多磁盘中不可能进行原子写入。

我说“可能”是因为问题取决于实现。撇开 RAID-Z 等下一代文件系统解决方案不谈,经典的软件 RAID 实现也找到了解决此问题的方法:最近mdadm引入了一项日志功能,该功能使用专用缓存磁盘来避免这种情况,即使您选择不使用通过此功能,它还会在每次非正常关闭后强制重新同步,从而在写入漏洞发生时立即捕获并解决它。

感谢 #zfs irc 频道的帮助!