关键词: linux software raid, md, raid10, r10_private_data_s, near_copies, far_copies, far_offset
内核版本:2.6.18
linux内核md模块实现的RAID10有三种laout模式,分别为near, far和offset。当用mdadm命令来创建RAID10盘时,可以选用这三种中的一种(其实near和far模式可以混用,但是把1个chunk做4个或以上的备份没啥意义吧)。
[1]三种模式的特点
near方式下,同一个chunk被复制n份,一般为2份,这2份会存在2个相邻的盘上相同的offset处。far方式下,同一个chunk的n个副本会存在相隔很远的地方。所有数据的第一个副本会以RAID0条带的方式存在所有磁盘前面部分,所有数据的第二个副本也会以RAID0条带的方式存在所有磁盘后面部分,同时far模式保证同一chunk的所有备份都存在不同的磁盘上。
far方式能提供跟RAID0相当的连续读性能,但是写的性能会降低(会给写带来更多的寻道时间) [1][2],因此far方式更适合于读多于写的应用场景。
Offset方式下,同一个chunk的n个副本会以连续的偏移量存在连续的磁盘上(偏移1个磁盘,offset偏移1个chunk)。每个stripe的副本以一个磁盘的偏移量存储。如果chunk大小合适,offset方式能够提供与far方式相同的读性能,但是写性能不会像near方式那么差。
组成RAID10磁盘的数量不必是每个chunk副本数的整数倍,但至少得有每个chunk副本数那么多的磁盘。
[2]三种layout方式的示例
(columns are drives, rows are stripes, LETTERS are chunks of data)
n2 layout:
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
.. .. .. .. .. .. .. .. ..
f2 layout:
2 drives 3 drives 4 drives
-------- -------------- --------------------
A1 A2 A1 A2 A3 A1 A2 A3 A4
A3 A4 A4 A5 A6 A5 A6 A7 A8
A5 A6 A7 A8 A9 A9 A10 A11 A12
.. .. .. .. .. .. .. .. ..
A2 A1 A3 A1 A2 A4 A1 A2 A3
A4 A3 A6 A4 A5 A8 A5 A6 A7
A6 A5 A9 A7 A8 A12 A9 A10 A11
.. .. .. .. .. .. .. .. ..
n2 f2 layout:
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
.. .. .. .. .. .. .. .. ..
o2 layout:
2 drives 3 drives 4 drives
-------- ------------ -----------------
A1 A2 A1 A2 A3 A1 A2 A3 A4
A2 A1 A3 A1 A2 A4 A1 A2 A3
A3 A4 A4 A5 A6 A5 A6 A7 A8
A4 A3 A6 A4 A5 A8 A5 A6 A7
A5 A6 A7 A8 A9 A9 A10 A11 A12
A6 A5 A9 A7 A8 A12 A9 A10 A11
.. .. .. .. .. .. .. .. ..
[3]内核里的几个关键参数
Drivers/md/raid10.h
struct r10_private_data_s {
......
/* geometry */
int near_copies; /* number of copies layed out raid0 style */
int far_copies; /* number of copies layed out
* at large strides across drives
*/
int far_offset; /* far_copies are offset by 1 stripe
* instead of many
*/
int copies; /* near_copies * far_copies.
* must be <= raid_disks
*/
sector_t stride; /* distance between far copies.
* This is size / far_copies unless
* far_offset, in which case it is
* 1 stripe.
*/
......
};
near_copies: 每个chunk有near_copies份副本(含自己)
far_copies: 每个设备被分成far_copies个section
far_offset: 如果offset为真,则offset模式被启动,同一个chunk被存在相邻设备的不同偏移量处。
参考资料:
[1]http://neil.brown.name/blog/20040827225440
[2]http://en.wikipedia.org/wiki/Non-standard_RAID_levels#Linux_MD_RAID_10
[3]man mdadm
[4]man md
[5]Linux-2.6.18kernel source code