linux磁盘阵列raid详解

 

一丶raid

 

 

1.raid定义

磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。

 

2.raid的优缺点

优点

提高传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量(Throughput)。在RAID中,可以让很多磁盘驱动器同时传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可以达到单个磁盘驱动器几倍、几十倍甚至上百倍的速率。这也是RAID最初想要解决的问题。因为当时CPU的速度增长很快,而磁盘驱动器的数据传输速率无法大幅提高,所以需要有一种方案解决二者之间的矛盾。RAID最后成功了。
通过数据校验提供容错功能。普通磁盘驱动器无法提供容错功能,如果不包括写在磁盘上的CRC(循环冗余校验)码的话。RAID容错是建立在每个磁盘驱动器的硬件容错功能之上的,所以它提供更高的安全性。在很多RAID模式中都有较为完备的相互校验/恢复的措施,甚至是直接相互的镜像备份,从而大大提高了RAID系统的容错度,提高了系统的稳定冗余性。

缺点

RAID0没有冗余功能,如果一个磁盘(物理)损坏,则所有的数据都无法使用。
RAID1磁盘的利用率最高只能达到50%(使用两块盘的情况下),是所有RAID级别中最低的。
RAID0+1以理解为是RAID 0和RAID 1的折中方案。RAID 0+1可以为系统提供数据安全保障,但保障程度要比 Mirror低而磁盘空间利用率要比Mirror高。

3.常用RAID及其特点

 

 

RAID0(需要2块以上硬盘)

 

 

Raid0数据储存方法如下(假设有两块硬盘D1、D2):

特点:数据被并行写入每个磁盘,每个磁盘都保存了完整数据的一部分,读取也采用并行方式,磁盘数量越多,读取和写入速度越快。因为没有冗余,一个硬盘坏掉全部数据丢失。至少两块硬盘才能组成Raid0阵列。

D1D2
数据1 数据2
数据3 数据4
数据5 数据6

容量:所有硬盘之和。


原理: raid 0 条带化 chunk size n*min(size) (#读写的提升 至少2块盘)

实现方式:就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。
  在使用中电脑数据依次写入到各块硬盘中,它的最大优点就是可以整倍的提高硬盘的容量。如使用了三块80GB的硬盘组建成RAID 0模式,那么磁盘容量就会是240GB。
  其速度方面,各单独一块硬盘的速度完全相同。最大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的1/N。

 

 特点:

1:RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余
2:RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据
3:RAID 0不能应用于数据安全性要求高的场合

 

 

RAID1(需要2块硬盘)

 

 

 

 

 

Raid1数据储存方法如下(假设有两块硬盘D1、D2):

D1D2
数据1 数据1
数据2 数据2
数据3 数据3

特点:有数据冗余,可靠性强,D1、D2被写入相同的数据,其中D2可以作为D1的完整备份。读取时,从两块硬盘上并行读取,写入慢,读取快。任何一块硬盘坏掉不会丢失数据,至少两块硬盘并且两块硬盘大小相等才能组成Raid1阵列。

容量:所有硬盘容量之和的一半(一半写数据,一半用来做备份)。

 

 

原理:raid 1 镜像 min(size) (#写性能略降低 ,读性能提升 至少2块盘)

原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,
只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,
具备很好的磁盘冗余能力

 

 特点:

1:通过磁盘数据境像实现数据冗余,在成对的独立磁盘上产生互为备份的数据
2:当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能
3:RAID1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据

 

 

RAID5(需要3块以上硬盘)

 

 

 

 

 

Raid5数据储存方法如下(假设有三块硬盘D1、D2、D3):

D1D2D3
数据1 数据2 校验和1
校验和2 数据3 数据4
数据5 校验和3 数据6

特点:采用奇偶校验,可靠性强,磁盘校验和被散列到不同的磁盘里面,增加了读写速率。只有当两块磁盘同时丢失时,数据才无法恢复,至少三块硬盘并且硬盘大小应该相等才能组成Raid5阵列。

容量:所有硬盘容量之和减去其中一块硬盘的容量,被减去的容量被分配到三块硬盘的不同区域用来存放数据校验信息。

 

原理:raid 5 奇偶校验 (#(n-1)*min(size) 至少3块盘)

RAID5的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的磁盘上,所以提高了可靠性。但是它对数据传输的并行性解决不好,而且控制器的设计也相当困难。

 

特点:

1:N((N>=3)块盘组成阵列,一份数据产生N1个条带,同时还有1份校验数据,共N份数据在N块盘上循环均衡存储
2:N块盘同时读写,读性能很高,但由于有校验机制的问题,写性能相对不高(N-1)/N磁盘利用率
3:可靠性高,允许坏1块盘,不影响所有数据

 

 

Raid10(需要4块以上硬盘)

 

 

 

 

 

 

Raid10(Raid1+Raid0)是现在比较常用的一种磁盘阵列级别,它的容错好,读写数据效率较高,但经费相对也较高。

Raid10数据储存方法如下(假设有四块硬盘D1、D2、D3、D4):

D1D2D3D4
数据1 数据1 数据2 数据2
数据3 数据3 数据4 数据4

特点:备份和并发式存取数据,可靠性强。D1、D2组成一个阵列Raid1,其中D1是数据盘,D2是备份盘;D3、D4也组成一个Raid1,其中D3是数据盘,D4是备份盘;在这个基础上将D1、D2作为一个整体,将D3、D4也作为一个整体,这两个整体之间再组成一个Raid0阵列。这样不仅仅读取数据会非常快,并发写入的速度也会随着磁盘的增多而变快。至少四块硬盘并且每块硬盘大小应该相等才能组成Raid10阵列。

容量:所有硬盘容量之和的一半(一半写数据,一半用来备份数据)。


原理:raid 10 (#先做多个raid1,再组成raid0 安全性优于raid01)

先镜射再分区数据,再将所有硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID 1运作。优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,
而且磁盘的利用率比较低.

 

特点:

1:N(偶数,N>=4)块盘两两镜像后,再组合成一个RAID 0
2:N/2磁盘利用率
3:N/2块盘同时写入,N块盘同时读取
4:性能高,可靠性高

 

 

Raid01

 

 

 

 

Raid01数据储存方法如下(假设有四块硬盘D1、D2、D3、D4):

D1D2D3D4
数据1 数据2 数据1 数据2
数据3 数据4 数据3 数据4

特点:D1、D2组成一个阵列Raid0,D3、D4也组成一个阵列Raid0,D1、D2和D3、D4再组成一个Raid1。D1和D2作为数据盘阵列,D3和D4作为数据备份阵列,这种方式并不常用,至少四块硬盘并且每块硬盘大小应该相等才能组成Raid01阵列。

容量:所有硬盘容量之和的一半。

原理:raid 01 (#先做多个raid0,再组成raid1)

先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作.
优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低

 

 

RAID50

 

 

 

原理:raid 50 (#先做多个raid5,再组成raid0,安全性略低于raid10)

RAID50具备更高的容错能力,因为它允许某个组内有一个磁盘出现故障,而不会造成数据丢失。而且因为奇偶位分部于RAID5子磁盘组上,故重建速度有很大提高。
优势:更高的容错能力,具备更快数据读取速率的潜力。

 

 

 

 

 

raid用法及常用选项

 

用法

 

mdadm -C /dev/md0 -a yes -n 2 -l 0 /dev/sdc /dev/sdd
mdadm -C /dev/md1 -a yes -n 2 -l 1 /dev/sde /dev/sdf
mdadm -C /dev/md1 -a yes -n 2 -l 1 -x 1 /dev/sd{e,f,g}

 


常用选项

-C 创建raid
-a yes 自动创建raid设备/dev/mdX
-n num 阵列中磁盘的数量
-l num 阵列的等级
-x num 热备盘的数量
mdadm -D /dev/mdx 查看raid信息
cat /proc/mdstat 查看全部的raid信息
mdadm -S /dev/mdx 停止raid
mdadm -A /dev/mdx /dev/sdc /dev/sda
cat /proc/mdstat
mdadm -D -s > /etc/mdadm.conf 将raid信息保存至文件
mdadm -A -s 激活/etc/mdadm.conf中的所有raid设备
mdadm -F /dev/md1 实时监控raid状态

 

 

raid1,raid5专用命令

 

mdadm /dev/md1 -f /dev/sdx 将md1中的sdx设置为坏的设备
mdadm /dev/md1 -r /dev/sd 将md1中的sdx从raid成员中删除
mdadm /dev/md1 -a /dev/sdx 向md1中增加新成员sdx
mdadm -G /dev/md1 -n 3 -a /dev/sdh 将raid1 md1的成员数量改为3,并加入新的成员(不是加为热备盘)

 


删除硬盘raid

mdadm --zero-superblock /dev/sdx 删除某块硬盘的raid信息

 

 共享热备盘实现方式

 

mdadm -D -s > /etc/mdadm.conf
在需要共享的多组raid信息最后分别都写上spare-group=magedu
然后再加一新行,顶头写MAILADDR root@localhost
service mdmonitor restart

 

 

二、Linux创建磁盘阵列实例

 

这一部分通过Linux上的mdadm命令来实现Raid10磁盘阵列。

 

a.实验环境介绍

实验环境为一台安装了5块硬盘的计算机,操作系统是CentOS7,除系统所在硬盘(/dev/sda)外,其余四块20G的硬盘盘符分别为(/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde);

主要用到的命令:mdadm;

CentOS7中mdadm默认已安装,如果没有安装,可以使用yum在线安装,如下:

 

#首先确保已经连接到互联网,搜索一下yum服务器上是否存在mdadm

qing@qingsword.com:~$ sudo yum search mdadm

 

#根据搜索结果和系统环境选择对应的版本安装

qing@qingsword.com:~$ sudo yum install mdadm.x86_64

 

#安装需要root权限,请确保普通用户可用sudo或切换到root权限操作

 

到这里,实验的准备工作完成。

 

 

b.创建磁盘阵列Raid10

 

参数详解:

磁盘阵列创建需要root权限;

-C 创建一个新的RAID起名为md0;

-a yes 自动创建对应设备;

-l 指定RAID级别,本例是10;

-n 活动的磁盘数量(备份盘除外);

因为RAID10最少需要4块硬盘,后面的sd[b-e]都被添加到md0中;

 如果要创建其他级别的RAID,只需要更改-l参数后的级别,并根据所需要的硬盘的数量更改-n参数后面的数量即可;

qing@qingsword.com:~$ sudo mdadm -C /dev/md0 -a yes -l 10 -n 4 /dev/sd[b-e]

Continue creating array? (y/n)  y #输入y继续

 

#如果每块硬盘容量都很大,RAID的创建不是瞬间完成的,通过查看下面这个文件,可以看到一个创建进度,确保全部完成后再进行下一步

qing@qingsword.com:~$ cat /proc/mdstat

Personalities : [raid10]

[====>................]  resync = 24.0%

#只有这个到达100%才算完成

 

#查看刚才创建的磁盘阵列md0详细信息

qing@qingsword.com:~$  sudo mdadm -D /dev/md0

 

c.配置开机自启动磁盘阵列




新创建的磁盘阵列默认是不能开机自启动的,需要手动创建一个配置文件,让系统在启动的时候自动启动Raid(经过测试,CentOS7并不需要创建这个配置文件,如果重启后磁盘阵列没有随机启动,请使用下面的方法配置一次):

#这个配置文件的创建需要root权限才可进行,切换到root

qing@qingsword.com:~$ su root

 

#将mdadm信息写入配置文件

root@qingsword.com:~# mdadm -D --scan > /etc/mdadm.conf

 

 

 

 

 

d.将磁盘阵列挂载到目录使用

 

#挂载前先需要对磁盘阵列格式化

qing@qingsword.com:~$ sudo mkfs.ext4 /dev/md0

 

#挂载,本例挂载到/mnt目录

qing@qingsword.com:~$ sudo mount /dev/md0 /mnt

 

#查看已经挂载的设备,可以看到/dev/md0可使用的大小是40G,上面已经介绍过,Raid10可用大小是活动硬盘总和的一半

qing@qingsword.com:~$ sudo df -h

Filesystem                   Size  Used Avail Use% Mounted on

...

/dev/md0                     40G   176M   38G  1%  /mnt

 

3.创建冗余磁盘阵列

 

可以在创建RAID的时候指定有几块冗余磁盘,当工作磁盘出现故障的时候,冗余磁盘自动启动,顶替出现故障的磁盘继续工作,请看下面的实例:

#假设有6块硬盘,前面4块用作RAID10,后面两块将被用作冗余(参数-x 2表示有2块硬盘用作冗余)

qing@qingsword.com:~$ sudo mdadm -C /dev/md0 -a yes -l 10 -n 4 -x 2 /dev/sd[b-g]

 

#查看磁盘阵列详细详细

qing@qingsword.com:~$ sudo mdadm -D /dev/md0

...

Raid Level : raid10

...

Raid Devices : 4 #参与磁盘阵列硬盘数4

Total Devices : 6 #总硬盘数6

...

Active Devices : 4 #正在工作的硬盘4

Working Devices : 6 #能够工作的硬盘6个

Failed Devices : 0  #故障硬盘数0

Spare Devices : 2 #空闲硬盘数2

 

Number Major Minor RaidDevice State

  0  8  16   0  active sync set-A  /dev/sdb

  1  8  32   1  active sync set-B  /dev/sdc

  2  8  48   2  active sync set-A  /dev/sdd

  3  8  64   3  active sync set-B  /dev/sde

 

  4  8  80   -   spare   /dev/sdf #两个冗余磁盘

  5  8  96   -   spare   /dev/sdg

 

下面手动将一块磁盘标记为故障,看看冗余盘是否起作用:

#将md0中sdc标记为故障

qing@qingsword.com:~$ sudo mdadm /dev/md0 -f /dev/sdc

mdadm: set /dev/sdc faulty in /dev/md0

 

qing@qingsword.com:~$ sudo mdadm -D

...

Active Devices : 4

Working Devices : 5

#还有5个能工作的磁盘(包括剩下冗余的1个)

Failed Devices : 1 #坏掉1个

Spare Devices : 1 #空闲1个

 

Number Major Minor RaidDevice State

  0  8  16  0  active sync set-A  /dev/sdb

  5  8  96  1  active sync set-B  /dev/sdg

  2  8  48  2  active sync set-A  /dev/sdd

  3  8  64  3  active sync set-B  /dev/sde

 

  1  8  32  -  faulty  /dev/sdc

  4  8  80  -  spare  /dev/sdf

 

假如/dev/sdc经过测试后发现没有问题,想要重新加入md0使用,可以在系统重启后,使用"mdadm /dev/md0 -a /dev/sdc"命令将它重新(添加)启用。

如果以后,想要加入一块新硬盘到这个raid10里作为备份盘,这块新硬盘需要和其他硬盘(或分区)保持相同的大小,然后使用下面的命令添加:

#添加后,就会在备份列表中看到/dev/sdh这块硬盘了

qing@qingsword.com:~$ sudo mdadm /dev/md0 --add /dev/sdh

 

#或简写命令如下,效果同上

qing@qingsword.com:~$ sudo mdadm /dev/md0 -a /dev/sdh

 

0×4.删除磁盘阵列

 

要想彻底清除RAID以及数据,请使用下面的方法:

#1.如果已经挂载,先卸载

qing@qingsword.com:~$ sudo umount /dev/md0

 

#2.关闭RAID

qing@qingsword.com:~$ sudo mdadm -S /dev/md0

 

#3.将磁盘sdb至sdf中的所有数据全部用0填充(创建时有多少块硬盘,这里就写多少块,例如上面创建了冗余是从b-g,那么这里就写/dev/sd[b-g])

qing@qingsword.com:~$ sudo mdadm --zero-superblock /dev/sd[b-f]

 

#4.删除启动配置文件(如果有)

qing@qingsword.com:~$ sudo rm -rf /etc/mdadm.conf

 

 

 

 

参考:https://blog.51cto.com/13570215/2084757

https://www.qingsword.com/qing/922.html

 

posted @ 2020-11-09 12:30  钟桂耀  阅读(5684)  评论(0编辑  收藏  举报