zoukankan      html  css  js  c++  java
  • linux内核md模块raid10数据落盘方式解析及几个关键参数的解读


    关键词: 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


  • 相关阅读:
    【作业3】应用分支与循环结构解决问题
    四、预习检查:填空,并注释"每空"填充的依据
    三、预习检查:选择正确答案,并简要说明为什么?
    作业 6 结构体
    实验 10 指针2 (2)为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:小写字母z变换成为a,其它字符变换成为该字符ASCII码顺序后1位的字符,比如o变换为p。
    实验 9 指针1 输入一行字符,要求用自定义的函数void f(char *line)统计和输出字符串中数字字符、英文字符和其他字符的个数
    作业 5 指针应用1
    实验9指针1
    实验 8 数组2 输出一张九九乘法口诀表。要求必须将乘积放入一个二维数组中,再输出该数组
    作业 4 函数应用 输出80到120之间的满足给定条件的所有整数,条件为构成该整数的每位数字都相同
  • 原文地址:https://www.cnblogs.com/bugchecker/p/3041600.html
Copyright © 2011-2022 走看看