RAID磁盘阵列详解

麦浪2年前技术文章1129

1 RAID原理

无论是DAS、NAS还是SAN,都是存储系统,一个存储系统可以包含多块磁盘。不同磁盘之间的组织排列,就是磁盘阵列技术,也就是RAID技术。

RAID磁盘阵列技术的核心思想主要有两个,包括:

·       提升存储访问速度

·       提升存储可靠性

这两大核心思想的实现,主要依赖于:

·       独特的数据组织方式和存取方式,实现存储的高速访问

·       独特的数据冗余方式,实现数据备份,可恢复

1.1 RAID数据组织方式

RAID磁盘阵列中的数据组织形式如下图所示,主要从三个维度进行数据组织,即分区(Extent)、分条(Strip)、和条带(Stripe):

·        分区:是将磁盘进行纵向分割,比如将磁盘0分割为分区0和分区1,将磁盘1分割为分区2和分区3,依次类推;

·        分条:是将磁盘进行横向分割,比如将磁盘0、1、2、3,横向分割出分条0、分条1等;

·        条带:纵向分割的分区和横向分割的分条,交叉之后形成条带;比如分区0和分条0交叉,形成条带0,0;分区2和分条0交叉,形成条带2,0;

 raid1.png

需要注意的是条带可以包含多个数据块(Block),数据块是磁盘存储数据的最小单位,比如条带0,0包含数据块0和数据块1;一个条带包含的数据块数量,称之为分条深度,比如分条0深度为2,该分条内的条带均包含2个数据块,而分条1深度为1,该分条内的条带均包含1个数据块;一个分条跨越的分区数量,称之为分条尺寸,比如分条0跨越4个分区,所以分条尺寸为4;

可以看到上述数据组织形式是将数据打散开来的。虽然我们数据实际的组织形式是离散的,但是逻辑上呈现的仍然是连续的寻址空间。

1.2 RAID数据存取方式

根据上述离散的数据组织形式,不难发现数据的存取也是离散的。比如要将一段数据存入D0~D3,就需要将数据依次存入磁盘0的条带0,0,和磁盘1的条带2,0。反过来,数据的读取也是一样的。但是这种离散的数据存取方式,可以极大提高磁盘的存取速度。原因很简单,如果要写入数据D0~D7,可以将这些数据块并行写入四个磁盘,写入速度几乎提高四倍;反之,读取数据,也可以进行并行读取。

1.3 RAID数据冗余方式

RAID磁盘阵列中的数据冗余方式,主要分为镜像冗余和校验冗余,如下:

·       镜像冗余:这个很好理解,就是数据一比一镜像备份,比如磁盘1存储原始数据,磁盘2存储镜像备份数据,这时磁盘2就是磁盘1的备份。如果磁盘1故障,磁盘2可以直接恢复数据;

·       校验冗余:镜像冗余对于数据的保护性还是很强的,但是缺点很明显,就是存储利用率低。即两块磁盘,只有一块磁盘存储有效数据,另一块磁盘存储的是镜像备份数据,存储空间利用率只有50%,这个利用率已经非常低了;

这时候,可以基于一些校验算法(比如奇偶校验),根据原始数据,使用校验算法生成校验数据,这部分校验数据就是冗余数据。如果原始数据因为磁盘故障丢失,这时可以使用校验算法,基于校验数据(冗余数据)逆向恢复原始数据。

举个例子,异或校验算法,可以根据100个原始数据,生成50个校验数据(冗余数据),如果100个原始数据中有50个数据因为故障丢失了,那么根据剩下的50个原始数据,以及50个校验数据,使用异或校验算法,可以逆向恢复丢失的那50个原始数据。这样存储空间利用率是100(原始数据)/150(原始+校验数据)= 66.6666%。

通常,校验算法越先进,生成的校验数据(冗余数据)越少,存储空间利用率越高,但是越先进的校验算法也意味着该算法越复杂,执行起来越消耗资源。

在RAID中,可以选择使用XOR异或校验算法,或者海明码。后者海明码更加先进也更加复杂,运行海明码所带来的巨大资源消耗,往往让人难以接受。所以现在RAID中,多使用简单可行的异或校验算法。

2 RAID级别

遵循RAID基本数据组织原理基础上,RAID磁盘阵列实际可以灵活安排数据组织结构,以提供不同的数据保护能力和不同的数据存取性能,这就是不同的RAID级别。

RAID技术发展至今,已经有了RAID 0~6这七种级别,不同级别代表RAID磁盘阵列不同的存储性能,存储成本和数据安全性;现在依次看下这七种RAID级别,如下:

2.1 RAID 0

该级别提供了RAID磁盘阵列最高的存储性能,RAID 0就是完全按照【分区&分条&条带】这三个维度进行数据的组织存取,简称为条带化的数据存储。条带化的数据存储形式在前面已经详细讲解过了,这里不再赘述。

raid2.png

RAID 0提供了超高的数据存取速度,因为数据是条带化存储的,意味着数据可以并行存取,比如要读取数据D0~D7,则可以并行读取磁盘0的条带0,0;磁盘1的条带2,0;磁盘2的条带4,0以及磁盘3的条带6,0。反之,写入数据也可以进行并行写入。

所以RAID 0磁盘阵列的性能是和阵列中磁盘数量成正比的,最简单的公式就是

$$RAID 0总体性能=单一磁盘性能*磁盘数量$$

 比如阵列中包含4块磁盘,单一磁盘性能为50MBps,则RAID 0磁盘阵列性能为200MBps,因为可以同时并行存取这四块磁盘。

但是上述只是理想情况下的假设,因为RAID 0磁盘阵列存在性能的边际递减,也就是说如果单一磁盘性能为50MBps,则两块磁盘的RAID 0性能约为95MBps,三块磁盘的RAID 0性能约为130MBps,依次类推。但就算存在性能的边际递减,RAID 0磁盘阵列的存储性能,仍然是最优秀的。

综上,RAID 0的优点是存储性能高,缺点也很明显,即不提供数据保护。

2.2 RAID 1

RAID 1级别的数据组织形式,非常简单,采用最简单的镜像备份数据,如下:

raid3.png

根据上图所示,可以看到RAID 1级别的数据组织就是使用两块磁盘,一块磁盘存储原始数据,另一块磁盘存储镜像备份数据。如果因为磁盘故障导致原始数据丢失,根据另一块磁盘里的镜像备份数据可以快速恢复数据。所以RAID 1级别提供了较高的数据可靠性。

相较于RAID 0级别,RAID 1级别在数据存储性能上是有损失的,尤其是写入数据。因为每次写入数据实际写入的数据既要写入原始磁盘,也要写入镜像备份的磁盘(如果镜像备份的磁盘性能较低,容易形成性能瓶颈)。但是读取数据的性能还是可以的,因为可以从原始磁盘和镜像磁盘并行读取数据;但无论如何,RAID 1肯定比不上RAID 0级别的存储性能。

综上,RAID 1级别的优点是数据可靠性高,缺点也很明显,就是存储成本高(因为需要两块磁盘,一块存储原始数据,一块存储镜像备份数据),存储空间利用率低(只有50%)。所以RAID 1级别磁盘阵列,适合数据可靠性要求非常高的场景,比如银行、证券交易所等。

2.3 RAID 2

考虑采用镜像备份的方式保护数据,存储成本较高,存储空间利用率较低,所以可以使用校验冗余的方式保护数据,而不再使用RAID 1中的镜像冗余。

RAID 2就是基于海明码,计算校验冗余数据,如果原始数据丢失,根据校验数据、海明码算法,可以逆向计算,并恢复原始数据,如下:

raid4.png

根据上图所示,可以看到前三块磁盘存储的是原始数据,最后两块磁盘存储的是海明码根据原始数据计算出的校验数据,所以最后两块磁盘也被称为校验盘。

校验算法可以正向计算(原始数据>校验数据),即使用校验算法,根据原始数据,计算出校验数据;校验算法也可以反向计算(校验数据->原始数据),即使用校验算法,根据校验数据算出原始数据。这一特性,也就保证了如果有原始数据丢失,那么根据校验数据,可以计算恢复出原始数据。

但是海明码算法有个特点,就是如果原始数据磁盘较少,那么校验磁盘和原始数据磁盘的数量几乎一致,比如原始数据磁盘3个,那么校验磁盘就需要2个(存储空间利用率60%),再比如原始数据磁盘4个,那么校验磁盘就需要3个(存储空间利用率57%)。但是如果原始磁盘的数量非常多,那么校验磁盘的数量会快速下降,比如原始磁盘数量64个,那么校验磁盘只需要7个(存储空间利用率90%)。

综上,RAID 2级别的优点是依据海明码提供数据保护,缺点是在数据量较低(数据磁盘较少)时,校验磁盘的数量几乎和数据磁盘的数量一致,导致存储成本高,存储空间利用率低。所以RAID 1级别非常适合于一些大数据存储场景,本身就需要海量磁盘进行数据存储。

2.4 RAID 3

采用海明码校验算法,在存储数据量较少时体现不出海明码的先进性,同时海明码本身算法复杂,海明码计算起来也非常消耗资源,所以磁盘阵列里更加倾向于简单的异或校验算法,这就是RAID 3级别。RAID 3级别,使用异或校验算法,计算校验数据,为原始数据,提供校验冗余的保护:

raid5.png

另外,RAID 3的数据组织形式,和RAID 0一样,采用条带化的数据组织形式,所以RAID 3在保证了数据存储性能较高的前提下提供了数据的校验保护,可以说是非常经济实惠的磁盘阵列技术。

2.5 RAID 5

RAID 5和RAID 3非常相似,都是采用条带化的数据组织形式(存储性能高),也都采用简单的异或校验算法,计算校验数据,提供原始数据的校验保护(数据可靠性高)。

唯一的区别,在于RAID 3级别将所有的校验数据专门存放于检验盘,如果校验盘故障了,则所有的校验数据丢失,原始数据的保护性也就没有了。所以RAID 5将校验数据,分散的存放于各个磁盘,不再单独设置校验盘,如下:

raid6.png

根据上图所示,可以发现RAID 5级别不再单独设置校验盘,校验数据(P数据)分散存放于各个磁盘。这样无论哪个磁盘故障,校验数据都不会完全丢失,剩余的校验数据,仍然可以帮助完成原始数据的回复。

2.6 RAID 6

无论是RAID 3还是RAID 5,它们使用异或运算计算校验数据,保护原始数据,所提供的保护性都是有限的,只能保护一块原始数据磁盘。换言之,如果磁盘阵列中有一块数据磁盘故障,根据校验数据可以恢复那块数据磁盘中的原始数据,但是如果同时两块(或以上)磁盘故障,那么就无法完全恢复数据了。这个实际并不难理解,所有的保护措施,都是有限保护,而不是无限保护。

RAID 6的核心思想,就是如果同时两块数据磁盘故障了,能不能恢复数据,答案是肯定的。只需要执行两次异或校验算法,生成两份校验数据,校验数据的增加,使得即使出现两块数据磁盘故障,两块故障数据磁盘里的原始数据,也都可以进行恢复,如下:

raid7.png

根据上图所示,可以发现RAID 6使用两次异或运算,计算出了两份校验数据(横向校验数据和斜向校验数据),校验数据的增加也就保证了就算是两块数据磁盘故障,也能恢复数据。

如果大胆去预测,只要不断增加校验数据,我们甚至可以保证三块数据磁盘故障情况下恢复数据,或者四块数据磁盘故障情况下恢复数据等等。但是一味增加校验数据就意味着磁盘存储利用率的不断下降,如果存储空间利用率都不到50%(即校验数据都超过了原始数据),那么还不如直接使用RAID 1镜像备份来保护数据。

综上,RAID 6通过增加校验数据,提供更高的数据保护,但是因为校验数据多了(冗余数据多了),所以存储空间利用率也在下降。

2.7 RAID 10

因为RAID 1级别并没有使用条带化的数据组织形式,如下所示,所以虽然RAID 1提供了非常高的数据保护(镜像保护),但是存储性能整体不高。

raid8.png

我们自然而然地在想,能不能在RAID 1级别中也引入条带化的数据组织形式,考虑到RAID 0级别是条带化数据组织的典型,于是将RAID 1和RAID 0结合,就产生了RAID 10级别,即使用RAID 1的镜像备份保护数据(提升数据可靠性),也使用RAID 0的条带化组织数据(提升存储性能)。

raid9.png

综上,所有的RAID级别,大致可以分为三类:

·        RAID 0级别,以条带化形式组织数据,提供超高的存储性能

·        RAID 1级别,以镜像冗余保护数据,提供超高的存储可靠性

·        RAID 2&RAID 3&RAID 5&RAID 6,这四个级别,均以校验冗余,提供数据的保护性;其中RAID 2使用海明码校验算法,RAID 3 & RAID 5 & RAID 6均使用异或校验算法。 

RAID 等级

RAID0

RAID1

RAID3

RAID5

RAID6

RAID10

别名

条带

镜像

专用奇偶校验条带

分布奇偶校验条带

双重奇偶校验条带

镜像加条带

容错性

冗余类型

热备份选择

读性能

随机写性能

一般

一般

连续写性能

一般

需要磁盘数

n1

2n (n1)

n3

n3

n4

2n(n2)4

可用容量

全部

50%

(n-1)/n

(n-1)/n

(n-2)/n

50%

3 RAID实战:

使用 fdisk -l 命令查看一下自己添加的5 块硬盘是否已经添加成功

raid10.png

接着对创建的5个硬盘进行分区与更改文件类型;使用fdisk /dev/sdb修改第一个硬盘sdbn创建分区,p创建主分区,后面起始和Last直接按回车键就好;接着按t键修改文件类型为raid类型,代码为"fd"w保存并退出。

raid11.png

3.1 创建RAID0:

# mdadm -C -v /dev/md0 -l0 -n2 /dev/sd[b-c]1   //raid 0设备名称为/dev/md0 -l指定raid等级,-n指定磁盘个数

# cat /proc/mdstat   //查看概要
Personalities : [raid0]
md0 : active raid0 sdc1[1] sdb1[0]
      20951040 blocks super 1.2 512k chunks
unused devices: <none>
[root@ergou dev]# mdadm -D /dev/md0   //查看详情
/dev/md0:
Number   Major   Minor   RaidDevice State
  0       8       17        0      active sync   /dev/sdb1
  1       8       33        1      active sync   /dev/sdc1
 
#  mkfs.xfs /dev/md0   //格式化
#  mkdir /raid0      //挂载
#  mount /dev/md0 /raid0
#  df -Th | grep /raid0

3.2 创建RAID1:

# mdadm -C -v /dev/md1 -l1 -n2 /dev/sd[d-e]1 -x1 /dev/sdf1
# cat /proc/mdstat
# mkfs.xfs /dev/md1
# mkdir /raid1
# mount /dev/md1 /raid1
# df -Th | grep /raid

3.3 创建RAID5:

#  mdadm -C -v /dev/md5 -n3 -l5 /dev/sd[b-d]1 -x1 /dev/sde1
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: /dev/sdd1 appears to be part of a raid array:
       level=raid1 devices=2 ctime=Mon Aug  9 17:50:22 2021
mdadm: size set to 10475520K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
      20951040 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [==>..................]  recovery = 13.4% (1411072/10475520) finish=1.0min speed=141107K/sec

[root@ergou ~]# mdadm -D /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Aug  9 17:56:26 2021
        Raid Level : raid5
        Array Size : 20951040 (19.98 GiB 21.45 GB)
     Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Aug  9 17:56:44 2021
             State : clean, degraded, recovering
    Active Devices : 2
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 2

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 23% complete

              Name : ergou:5  (local to host ergou)
              UUID : 5acf4999:4d382df2:60cf4983:1c7c924b
            Events : 4

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       4       8       49        2      active sync   /dev/sdd1

       3       8       65        -      spare   /dev/sde1

模拟磁盘损坏

[root@ergou ~]# mdadm -f /dev/md5 /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md5
[root@ergou ~]#  mdadm -D /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Aug  9 17:56:26 2021
        Raid Level : raid5
        Array Size : 20951040 (19.98 GiB 21.45 GB)
     Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Aug  9 17:58:09 2021
             State : clean, FAILED
    Active Devices : 1
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 2

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : ergou:5  (local to host ergou)
              UUID : 5acf4999:4d382df2:60cf4983:1c7c924b
            Events : 46

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1  //正在同步数据
       -       0        0        1      removed
       -       0        0        2      removed

       1       8       33        -      faulty   /dev/sdc1     //损坏
       3       8       65        -      spare   /dev/sde1
       4       8       49        -      spare   /dev/sdd1

磁盘替换:将损坏的磁盘移出并添加新磁盘

# mdadm /dev/md5 -r /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md5

# mdadm -D /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Aug  9 19:55:35 2021
        Raid Level : raid5
        Array Size : 20951040 (19.98 GiB 21.45 GB)
     Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Mon Aug  9 20:02:47 2021
             State : clean, degraded, recovering
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 74% complete

              Name : ergou:5  (local to host ergou)
              UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
            Events : 32

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       3       8       65        1      spare rebuilding   /dev/sde1
       4       8       49        2      active sync   /dev/sdd1

# mdadm -D /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Aug  9 19:55:35 2021
        Raid Level : raid5
        Array Size : 20951040 (19.98 GiB 21.45 GB)
     Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Mon Aug  9 20:04:02 2021
             State : clean
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : ergou:5  (local to host ergou)
              UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
            Events : 38

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       3       8       65        1      active sync   /dev/sde1
       4       8       49        2      active sync   /dev/sdd1

#  mdadm /dev/md5 -a /dev/sdf1     //添加新磁盘
mdadm: added /dev/sdf1

# mdadm -D /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Aug  9 19:55:35 2021
        Raid Level : raid5
        Array Size : 20951040 (19.98 GiB 21.45 GB)
     Used Dev Size : 10475520 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Aug  9 20:05:05 2021
             State : clean
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : ergou:5  (local to host ergou)
              UUID : 764f44ea:c62d2493:89faaab2:6c4490b0
            Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       3       8       65        1      active sync   /dev/sde1
       4       8       49        2      active sync   /dev/sdd1

       5       8       81        -      spare   /dev/sdf1

3.4 创建RAID10

创建两个RAID1,分别命名为md1 和md2

# mdadm -Cv /dev/md1 -l1 -n2 /dev/sd[b-c]1
# mdadm -Cv /dev/md2 -l1 -n2 /dev/sd[d-e]1

可以使用该命令查看RAID磁盘的详细信息

# mdadm -D /dev/md1
# mdadm -D /dev/md2

使用该命令查看磁盘是否已经做了RAID

# mdadm -E /dev/sd[b-e]1
# mdadm -E /dev/sd[b-c]1

创建RAID0 ,将其命名为md10,指定使用RAID1中的md1和md2做RAID0

# mdadm -Cv /dev/md10 -l0 -n2 /dev/md1  /dev/md2

查看一下磁盘的详细信息

# mdadm -D /dev/md10

进入根目录下创建目录md10,将RAID10的md10进行格式化之后挂载在md10目录下,然后就可以在该阵列中进行读写了

# cd /
# mkdir /md10
# mkfs.xfs /dev/md10
# mount /dev/md10 md10
# df -Th

补充:

磁盘扩充:

#  mdadm -C -v /dev/md5 -n3 -l5 /dev/sd[b-d]1 -x1 /dev/sde1      //同上raid5
#  mdadm -G /dev/md5 -n4   //-G指定增长模式,-n指定工作盘数量


相关文章

Java-API-MapReduce的操作WordCount篇

Java-API-MapReduce的操作WordCount篇

首先就是pom文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/...

MongoDB的碎片化问题

一、碎片化问题1.1 为什么会出现碎片化的问题在生产业务中,一般会对集合数据进行频繁的增删改,常见的碎片化原因有:1、记录被remove,但是其空间没有被复用drop命令会直接删除集合的物理文件,空间...

Kubernetes源码解读(四)--Lister&Watcher源码分析

Kubernetes源码解读(四)--Lister&Watcher源码分析

Lister&&Watcher是Reflector的一个主要能力提供者,我们来看看Lister&&Watcher是如何实现List()和watch()的过程的。List...

EMR集群主机/opt/bignode目录占用巨大并持续增长

EMR集群主机/opt/bignode目录占用巨大并持续增长

问题现象:如下qa环境集群中,master节点出现如下磁盘告警处理步骤:登陆到该节点服务器,首先定位是哪个目录占用系统盘空间较大定位是由于:/opt/bignode/blocklet_indexing...

LINUX 安全运维-OpenSSH安全

LINUX 安全运维-OpenSSH安全

SSH 是建立在应用层基础上的安全协议,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一...

域名购买及备案

域名购买及备案

购买域名域名控制台 -- 域名列表 -- 注册域名注意域名购买时候域名系统中填写的持有者单位名称需与提交审核证件中的单位名称严格完全一致的模板认证中企业/组织相关材料及填写要求可参考此文档https:...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。