RAID 4/5/6 缓存

除了正常的 RAID 磁盘之外,Raid 4/5/6 可以包含一个额外的磁盘用于数据缓存。缓存磁盘不会改变 RAID 磁盘的角色。缓存磁盘将数据缓存到 RAID 磁盘。缓存可以是直写模式(自 4.4 起支持)或回写模式(自 4.10 起支持)。mdadm(自 3.4 起支持)有一个新选项 '--write-journal' 来创建带缓存的阵列。有关详细信息,请参阅 mdadm 手册。默认情况下(RAID 阵列启动时),缓存处于直写模式。用户可以通过以下方式将其切换到回写模式:

echo "write-back" > /sys/block/md0/md/journal_mode

并通过以下方式将其切换回直写模式:

echo "write-through" > /sys/block/md0/md/journal_mode

在这两种模式下,所有对阵列的写入都会先到达缓存磁盘。这意味着缓存磁盘必须快速且可持续。

直写模式

此模式主要修复“写入空洞”问题。对于 RAID 4/5/6 阵列,不干净的关机可能会导致某些条带中的数据处于不一致的状态,例如,数据和奇偶校验不匹配。原因是条带写入涉及多个 RAID 磁盘,并且可能在不干净的关机之前写入尚未到达所有 RAID 磁盘。如果阵列数据不一致,我们称之为阵列降级。MD 尝试重新同步阵列以使其恢复到正常状态。但在重新同步完成之前,任何系统崩溃都将暴露 RAID 阵列中真实数据损坏的机会。这个问题被称为“写入空洞”。

直写缓存将首先将所有数据缓存在缓存磁盘上。在数据在缓存磁盘上安全后,数据将被刷新到 RAID 磁盘上。两步写入将保证 MD 可以在不干净的关机后恢复正确的数据,即使阵列已降级。因此,缓存可以关闭“写入空洞”。

在直写模式下,MD 在数据在 RAID 磁盘上安全后,向上层(通常是文件系统)报告 IO 完成,因此缓存磁盘故障不会导致数据丢失。当然,缓存磁盘故障意味着阵列再次暴露于“写入空洞”。

在直写模式下,不需要大的缓存磁盘。几百兆字节就足够了。

回写模式

回写模式也修复了“写入空洞”问题,因为所有写入数据都缓存在缓存磁盘上。但是“回写”缓存的主要目标是加速写入。如果写入跨越条带的所有 RAID 磁盘,我们称之为全条带写入。对于非全条带写入,MD 必须读取旧数据才能计算新的奇偶校验。这些同步读取会降低写入吞吐量。一些按顺序但未在同一时间分派的写入也会受到这种开销的影响。回写缓存将聚合数据,并在数据成为全条带写入后才将数据刷新到 RAID 磁盘。这将完全避免开销,因此对某些工作负载非常有帮助。一个典型的例子是先进行顺序写入,然后进行 fsync 的工作负载。

在回写模式下,MD 在数据到达缓存磁盘后立即向上层(通常是文件系统)报告 IO 完成。在满足特定条件后,数据会稍后刷新到 raid 磁盘。因此,缓存磁盘故障将导致数据丢失。

在回写模式下,MD 还会将数据缓存在内存中。内存缓存包含与缓存磁盘上存储的相同数据,因此断电不会导致数据丢失。内存缓存大小对阵列的性能有影响。建议尺寸大一点。用户可以通过以下方式配置大小:

echo "2048" > /sys/block/md0/md/stripe_cache_size

在这种模式下,太小的缓存磁盘会降低写入聚合的效率,具体取决于工作负载。建议在回写模式下使用至少几个 GB 大小的缓存磁盘。

实现

直写和回写缓存使用相同的磁盘格式。缓存磁盘被组织为一个简单的写入日志。该日志由“元数据”和“数据”对组成。元数据描述数据。它还包括校验和和序列 ID 用于恢复识别。数据可以是 IO 数据和奇偶校验数据。数据也经过校验和。校验和存储在数据前面的元数据中。校验和是一种优化,因为 MD 可以自由写入元数据和数据,而无需担心顺序。MD 超级块有一个字段指向日志头的有效元数据。

日志的实现非常简单。困难的部分是 MD 将数据写入缓存磁盘和 RAID 磁盘的顺序。具体来说,在直写模式下,MD 计算 IO 数据的奇偶校验,将 IO 数据和奇偶校验都写入日志,在数据和奇偶校验在日志中稳定下来后,将数据和奇偶校验写入 RAID 磁盘,最后完成 IO。读取就像往常一样从 raid 磁盘读取。

在回写模式下,MD 将 IO 数据写入日志并报告 IO 完成。此时数据也完全缓存在内存中,这意味着读取必须查询内存缓存。如果满足某些条件,MD 会将数据刷新到 RAID 磁盘。MD 将计算数据的奇偶校验并将奇偶校验写入日志。完成后,MD 会将数据和奇偶校验都写入 RAID 磁盘,然后 MD 可以释放内存缓存。刷新条件可能是条带变成全条带写入,缓存磁盘空间不足或内核内存缓存空间不足。

在不干净的关机后,MD 会进行恢复。MD 从日志中读取所有元数据和数据。序列 ID 和校验和将帮助我们检测损坏的元数据和数据。如果 MD 找到一个包含数据和有效奇偶校验的条带(raid4/5 为 1 个奇偶校验,raid6 为 2 个),MD 会将数据和奇偶校验写入 RAID 磁盘。如果奇偶校验不完整,则会被丢弃。如果部分数据损坏,也会被丢弃。然后 MD 加载有效数据并以正常方式将它们写入 RAID 磁盘。