互联网上的许多资源包含有关 RAID 块的读/写逻辑的相互矛盾的信息。
该答案包含以下(看似相互矛盾的)信息:
512 KB 块大小并不要求系统每次写入 4 KB 时都写入 512 KB,或者每次应用程序读取 4 KB 时都读取 512 KB 的设备表面。
[当从具有 64 KiB 块大小的 RAID 读取 16 KiB 块时] RAID 将在写入该 4 KiB 文件/16 KiB 块时执行读取/修改/写入操作,因为 RAID 的最小存储单位是 64 KiB。
另一方面,该资源包含以下信息:
例如,如果您有一个 10 KB 的文本文件,且块大小为 256 KB,则该 10 KB 的数据将存储在 256 KB 的块中,其余块将留空。相反,如果使用 16 KB 的块,则存储该 10 KB 文件时浪费的空间要少得多。
我特别有以下问题:
- 当使用无奇偶校验的方案读取/写入小于 RAID 块大小的某些数据单元时,是否需要对整个块进行读取/修改/写入操作,还是仅对修改的部分块进行读取/修改/写入操作?
- 当使用具有奇偶校验的RAID 方案时,这会改变问题 1 的答案吗?
- 正如第二个参考文献中提到的,写入小于 RAID 块的数据单元是否会以某种方式使 RAID 块的其余部分保持空白?这在我看来似乎是不正确的,但我想澄清一下,因为这个资源非常明确地说明了这一点。
- 这些答案是否会根据 RAID 实现(Linux 内核、硬件 RAID 等)而改变?
如果可能的话,提供某种权威参考(一些 RAID 规范、源代码等)就太好了。
提前致谢!
块大小主要决定数据如何在设备之间分布(如果您想读取 RAID 设备上的字节 1234567890,则要查找哪个物理设备和偏移量)。
它不会直接影响 RAID 算法,在 RAID 5 中,这是一个简单的 XOR 操作,也称为按位 XOR。从数学上讲,这是对位进行操作,因此不依赖于字节、扇区或块。RAID 6 稍微复杂一些,但仍然足够相似。
因此不需要处理整个块。
对于Linux mdadm RAID,可以尝试通过实验来验证:
创建一些虚拟驱动器(使用稀疏文件):
在上面放置一个 mdadm RAID 6(使用
--assume-clean
它,除了元数据之外,它不写入任何内容):向随机偏移量进行小规模写入:
结果:
所有映像都有 1 个区(用于 mdadm 元数据),因此您可以忽略它。只有 3 个映像有 2 个区(数据、奇偶校验 1、奇偶校验 2)。因此只有这些被写入。
如您所见,范围是一个扇区,而不是一个块。
原始数据如下:
由于所有数据均为零,因此 RAID 5 的奇偶校验
TEST
仍为TEST
。对于 RAID6 奇偶校验,TEST
则变为)$Y)
。您可以通过用随机数据填充数组来扩展此实验,然后仅在这 3 个设备中的一个或多个的目标偏移处/周围写入 {4,16,512,4096,16384} 字节零,然后重复该实验。
这样您就可以确定 mdadm 不是以单字节级别分辨率运行的(但仍然没有超出扇区,更不用说整个块了)。
您可能还会注意到,如果在写入之前奇偶校验已经错误,它会写入错误的奇偶校验(使用奇偶校验来更新奇偶校验而不是从数据重新计算)。