我知道大多数 RAID 的工作原理。但我偶然发现了推荐的袭击10,f2 在研究 Linux 软件 RAID 时,我遇到了模式。我不太明白它在 2 个或 3 个磁盘上是如何工作的。有人能给我解释一下吗?或者给我指出一篇解释它的好文章?
答案1
事实上我认为维基百科比实际文档解释得更好。以下是文章中的文字。
Linux 内核软件 RAID 驱动程序(称为 md,代表“多设备”)可用于构建经典的 RAID 1+0 阵列,但也可(自版本 2.6.9 起)作为具有一些有趣扩展的单级阵列。标准“近”布局(其中每个块在 k 路条带阵列中重复 n 次)相当于标准 RAID-10 布置,但它不需要 n 除以 k。例如,2、3 和 4 个驱动器上的 n2 布局如下所示:
2 drives 3 drives 4 drives
-------- ---------- --------------
A1 A1 A1 A1 A2 A1 A1 A2 A2
A2 A2 A2 A3 A3 A3 A3 A4 A4
A3 A3 A4 A4 A5 A5 A5 A6 A6
A4 A4 A5 A6 A6 A7 A7 A8 A8
.. .. .. .. .. .. .. .. ..
4 驱动器示例与标准 RAID-1+0 阵列相同,而 3 驱动器示例是 RAID-1E 的软件实现。2 驱动器示例相当于 RAID 1。该驱动程序还支持“远”布局,其中所有驱动器被分成 f 个部分。所有块在每个部分中重复,但偏移一个设备。例如,2 驱动器和 3 驱动器阵列上的 f2 布局如下所示:
2 drives 3 drives
-------- ------------
A1 A2 A1 A2 A3
A3 A4 A4 A5 A6
A5 A6 A7 A8 A9
.. .. .. .. ..
A2 A1 A3 A1 A2
A4 A3 A6 A4 A5
A6 A5 A9 A7 A8
.. .. .. .. ..
这是为镜像阵列的条带化性能而设计的;顺序读取可以像 RAID-0 一样进行条带化,随机读取速度稍快(可能快 10-20%,因为使用磁盘较快的外部扇区和较短的平均寻道时间),顺序和随机写入的性能与其他镜像 raid 大致相同。对于读取频率高于写入频率的系统,此布局表现良好,这在许多系统中非常常见。每个驱动器的第一个 1/f 是标准 RAID-0 阵列。因此,您可以在仅 2 个驱动器的镜像集上获得条带化性能。near 和 far 选项可以同时使用。每个部分中的块偏移 n 个设备。例如,n2 f2 布局存储每个扇区的 2×2 = 4 个副本,因此至少需要 4 个驱动器:
4 drives 4 drives
-------------- -------------------
A1 A1 A2 A2 A1 A1 A2 A2 A3
A3 A3 A4 A4 A3 A4 A4 A5 A5
A5 A5 A6 A6 A6 A6 A7 A7 A8
A7 A7 A8 A8 A8 A9 A9 A10 A10
.. .. .. .. .. .. .. .. ..
A2 A2 A1 A1 A2 A3 A1 A1 A2
A4 A4 A3 A3 A5 A5 A3 A4 A4
A6 A6 A5 A5 A7 A8 A6 A6 A7
A8 A8 A7 A7 A10 A10 A8 A9 A9
.. .. .. .. .. .. .. .. ..
从 Linux 2.6.18 开始,驱动程序还支持偏移布局,其中每个条带重复 o 次。例如,2 驱动器阵列和 3 驱动器阵列上的 o2 布局如下:
2 drives 3 drives
-------- ----------
A1 A2 A1 A2 A3
A2 A1 A3 A1 A2
A3 A4 A4 A5 A6
A4 A3 A6 A4 A5
A5 A6 A7 A8 A9
A6 A5 A9 A7 A8
.. .. .. .. ..
注意:k 是驱动器数量,n#、f# 和 o# 是 mdadm --layout 选项中的参数。Linux 还可以使用 md 驱动程序创建其他标准 RAID 配置(0、1、4、5、6)。
答案2
据我所知f2RAID10 阵列保留每个块的至少 2 个副本,并且它们彼此存储得很远。
以下是手册页中的相关部分。
-p, --layout= 此选项配置 raid5 和 raid10 阵列的数据布局细节
...
最后,RAID10 的布局选项是“n”、“o”或“p”之一,后跟一个小数字。默认值为“n2”。n 表示“近”副本。一个数据块的多个副本在不同设备中的偏移量相似。
o 表示“偏移”副本。不是在条带内复制块,而是复制整个条带,但由一个设备旋转,因此重复的块位于不同的设备上。因此,块的后续副本位于下一个驱动器中,并且位于下一个块下方。
f 信号 '远的' 副本(多个副本具有非常不同的偏移量)。有关“near”和“far”的更多详细信息,请参阅 md(4)。
RAID10 是 RAID1 和 RAID0 的组合,有时也称为 RAID1+0。每个数据块都会被复制一定次数,而生成的数据块集合会分布在多个驱动器上。配置 RAID10 阵列时,需要指定所需的每个数据块的副本数(通常为 2),以及副本应该是“近”、“偏移”还是“远”。(请注意,“偏移”布局仅在 2.6.18 版中可用)。
什么时候 '靠近' 选择副本时,给定块的多个副本会连续分布在阵列的条带上,因此数据块的两个副本可能在两个相邻的设备上具有相同的偏移量。
什么时候 '远的' 选择副本后,给定块的多个副本会彼此相距很远。所有数据块的第一个副本将以 RAID0 方式分布在所有驱动器的早期部分,然后所有块的下一个副本将分布在所有驱动器的后期部分,始终确保任何给定块的所有副本都在不同的驱动器上。
这 '远的' 安排可以提供与 RAID0 阵列相同的顺序读取性能,但是却以降低写入性能为代价。
当选择“偏移”副本时,给定块的多个副本将放置在连续的驱动器上,并以连续的偏移量排列。实际上,每个条带都会被复制,副本会偏移一个设备。如果使用适当大的块大小,这应该会提供与“远”类似的读取特性,但不会进行太多的写入搜索。
需要注意的是,RAID10 阵列中的设备数量不需要是每个数据块副本数量的倍数,而是至少要与副本数量一样多。
例如,如果创建一个包含 5 个设备和 2 个副本的阵列,则将有相当于 2.5 个设备的空间可用,并且每个块将存储在两个不同的设备上。
答案3
这很有趣,解释得很好。但是,普通 RAID1 也具有这样的功能,至少在 Linux 软件 RAID 上,能够以非常好的性能并行支持多个读取器:
数据可从任意一个设备读取。驱动程序尝试将读取请求分布到所有设备以最大程度地提高性能。
[...] 理论上,拥有 N 磁盘 RAID1 将允许 N 个连续线程从所有磁盘读取数据。(man 4 md,RAID1 部分)
看起来 RAID10 在其近布局中更适合这种行为(不是像 RAID0 那样加速单线程 I/O,而是加速多线程 I/O)。具有 4 个磁盘的 n2f2 与具有 4 个磁盘的 RAID1 类似。
具有 4 个磁盘的 n2 布局将同时实现以下两个目的:使单个线程的读取性能翻倍,使两个线程的读取性能翻两番(如果 Linux md RAID10 调度程序实现良好,则一个线程应该读取一对,另一个线程应该读取另一对)。
一切都取决于你需要什么!我还没有做过基准测试。
答案4
首先,mdadm R10 是一种特殊模式,它不是 R0(R1,R1,R1..)f2 是 2 个远副本,用于实现冗余。
两个答案都很好,我想补充一些基准测试结果。我无法将它们放在评论部分...
我已经使用英特尔 X79 C200 系列芯片组 SATA 控制器(2x6Gbps 4x3Gbps)64GB 内存 Xeon 2680 进行了测试。
使用 fio 基准测试行:
sudo fio --refill_buffers --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --bs=1024K --iodepth=32 --rw=read --size=5G --filename=testfile --timeout=60
用写入替换读取,您将得到一个写入测试...
Results for 6x 1TB Seagate Barraccuda chunk=512k (MB/sec) :
SingleDisk 189/183
R0 1132/1078
R10 n2 c=32k 911/350 (w parts)
R10 n2 940/311 (w parts)
R10 n2 981/262 (w parts, bs=10M)
R10 f2 1032/264 (w parts)
R0(R1+R1+R1) 578/385 (w parts)
R1(R0+R0) 550/300 (w/o parts) !!! RETEST needed
R0(R5+R5) 686/236 (w/o parts) !!! RETEST needed
8 Disk Western Digital Gold 18TB Datacenter Disks chunk=512k (MB/sec):
R0 c=512k 1334/1313
R10 f2 c=512k 1316/283
Note:
(w parts) --> converted and joined ext4 partitions used sdX1
(w/o parts) --> used raw disk as sdX