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
太小的缓存磁盘会使此模式下的写入聚合效率降低,具体取决于工作负载。建议在回写模式下使用至少几千兆字节大小的缓存磁盘。
实现¶
直写和回写缓存使用相同的磁盘格式。缓存磁盘被组织为一个简单的写入日志。日志由“元数据”和“数据”对组成。元数据描述数据。它还包括用于恢复识别的校验和和序列 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 磁盘。