Linux 6.2 内核将包括对 Btrfs 中 RAID5/6 的改进

已提议将 Btrfs 改进纳入 Linux 6.2 内核中,以修复 RAID 5/6 实现中的写入漏洞问题。 问题的本质在于,如果在记录过程中发生崩溃,最初无法了解哪个RAID设备上的哪个块被正确写入,以及哪个块没有完成记录。 如果在这种情况下尝试恢复 RAID,则与被写入的块相对应的块可能会被破坏,因为 RAID 块的状态不同步。 此问题发生在任何未采取特殊措施来消除这种影响的 RAID1/5/6 阵列中。

在 RAID 实现中,例如 btrfs 中的 RAID1,通过在两个副本中使用校验和来解决此问题;如果存在不匹配,则只需从第二个副本恢复数据即可。 如果某些设备开始发送不正确的数据而不是完全失败,则此方法也适用。

然而,在 RAID5/6 的情况下,文件系统不存储奇偶校验块的校验和:在正常情况下,块的有效性通过它们都已校验和的事实来验证,并且奇偶校验块可以被重建从数据来看。 然而,在部分记录的情况下,这种方法在某些情况下可能不起作用。 在这种情况下,当恢复数组时,属于不完整记录的块可能会被错误地恢复。

对于 btrfs,如果生成的记录小于条带,则此问题最为相关。 在这种情况下,文件系统必须执行读-修改-写操作(read-modify-write,RMW)。 如果遇到写入不完整的块,则 RMW 操作可能会导致无论校验和如何都无法检测到的损坏。 开发人员进行了更改,RMW操作在执行此操作之前检查块的校验和,如果需要恢复数据,它还会在记录后检查校验和。 不幸的是,在写入不完整条带(RMW)的情况下,这会导致计算校验和的额外开销,但会显着提高可靠性。 对于RAID6来说,这样的逻辑还没有准备好,但是,对于RAID6中的这种故障,必须同时在2个设备上写入失败,这种可能性较小。

此外,我们还可以注意到开发人员对使用 RAID5/6 的建议,其本质是 Btrfs 中的元数据和数据存储配置文件可能有所不同。 在这种情况下,您可以使用配置文件 RAID1(镜像)甚至 RAID1C3(3 个副本)来存储元数据,使用 RAID5 或 RAID6 来存储数据。 一方面,这确保了可靠的元数据保护和不存在“写入漏洞”,另一方面,也确保了更有效地利用空间,这是 RAID5/6 的特点。 这可以避免元数据损坏并可以纠正数据损坏。

还可以注意到,对于内核 6.2 中 Btrfs 中的 SSD,将默认激活“丢弃”操作的异步执行(标记不再需要物理存储的释放块)。 这种模式的优点是高性能,因为在队列中对“丢弃”操作进行了有效分组,并由后台处理器对队列进行进一步处理,这就是为什么正常的 FS 操作不会像同步“那样”减慢速度。当块被释放时,SSD 可以做出更好的决策。 另一方面,您将不再需要使用 fstrim 等实用程序,因为 FS 中的所有可用块都将被清除,无需额外扫描,也不会减慢操作速度。

来源: opennet.ru

添加评论