首页 > 代码库 > Linux入门之磁盘管理(7)RAID的实现

Linux入门之磁盘管理(7)RAID的实现

Linux入门之磁盘管理(7)RAID的实现

RAID(Redundant Arrays of Inexpensive Independent Disks)被称为廉价冗余阵列,为了提高磁盘的性能或者保存数据完整,将多个磁盘合成一个“阵列”来提供更好的性能、冗余等。

RAID一般使用硬件raid,并配合指定 raid的接口或者raid卡来组成硬件raid,但是开销一般比较大,于是在linux中也提供了软件raid的实现。

 

raid的好处:

提高IO能力: 磁盘的并行读写

提高耐用性: 磁盘冗余来实现

 

RAID技术分类:

多个磁盘组成条带化

RAID1:镜像,mirror    保证数据的可用性

校验码

 

raid各个级别:

RAID level(级别):仅代表磁盘组织方式不同,没有上下之分

RAID-0条带化

性能提升:读、写

冗余能力 (容错能力):无

空间利用率:nS

至少需要2块磁盘

RAID-1镜像

性能提升:写性能下降,读性能提示

冗余能力:有

空间利用率:1/2

至少需要2

RAID-4多块数据盘异或运算值,存于专用校验盘

RAID-5

性能表现:读、写提升

冗余能力:有

空间利用率:(n-1)/n

至少需要3块盘

RAID-10

性能表现:读、写提升

冗余能力:有

空间利用率:1/2

至少需要4块盘

RAID-01

性能表现:读、写提升

冗余能力:有

空间利用率:1/2

至少需要4块盘

RAID-50

性能表现:读、写提升

冗余能力:有

空间利用率:(n-2)/n

至少需要6块盘

 

jdod 将多个小盘组合成一个大盘

性能表现:无提升

冗余能力:无

空间利用率:100%

至少需要2

 

软硬RAID的使用区别:

硬件RAIDBIOS主板下调整、RAID

软件RAID:内核模块支持 (md:multi disks

 

 

使用命令实现软件raid:

mdadm 管理命令,将任何设备做成RAID,并有多种模式选项命令

模式化的命令:

 创建模式:

-C   --create

 专用选项:

-l # :指定raid级别  --level

-n # : 设备个数     -num

-a {yes|no}:是否自动为其创建设备文件 --auto

-x # :指定空闲盘个数

-c CHUNK_SIZE:指定chunk大小

   管理模式:

 -a,--add   :添加raid成员

 -r,--remove :移除raid成员

 -f,--fail  : 模拟损坏raid成员

   监控模式:

          -F

 增长模式:

           -G

   装配模式:

           -A

   查看RAID阵列的详细信息

    mdadm  -D  /dev/md#

   --detail

 

   停止阵列:

    mdadm  -S  /dev/md#

 

特例:格式化md0设备指定分配条带和block

mke2fs -j -E stride=16 -b 4096 /dev/md0


RAID5案例:

1、创建一个3G的raid5级别设备(那么至少需要31G的设备):

#在/dev/sdb下创建6个分区,其类型指定为fd编号,表示为Linux raid

[root@mzf ~]# fdisk -l /dev/sdb 2> /dev/null | grep ‘^/dev‘
/dev/sdb1          1     132     1060258+   fd  Linux raid autodetect
/dev/sdb2         133     264     1060290   fd  Linux raid autodetect
/dev/sdb3         265     396     1060290   fd  Linux raid autodetect
/dev/sdb4         397     2610    17783955   5  Extended
/dev/sdb5         397     528     1060258+  fd  Linux raid autodetect
/dev/sdb6         529     660     1060258+  fd  Linux raid autodetect

2、使用mdadm命令

#使用mdadm创建为level 5级别raid

[root@mzf ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdb{1,2,3,5}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

#查看md0设备信息及成员

[root@mzf ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdb3[4] sdb5[3](S) sdb2[1] sdb1[0]
      2117632 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>

#查看md0raid级别

[root@mzf ~]# mdadm -D /dev/md0 | grep -i ‘level.*‘
     Raid Level : raid5

#查看成员信息及其状态:

[root@mzf ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘
   0     8     17      0      active sync   /dev/sdb1
   1     8     18      1      active sync   /dev/sdb2
   4     8     19      2      active sync   /dev/sdb3
   3     8     21      -      spare         /dev/sdb5

#要使用md0设备必须先格式化

[root@mzf ~]# mke2fs -t ext4 /dev/md0

#挂载md0设备

[root@mzf ~]# mkdir /mnt/md0
[root@mzf ~]# mount /dev/md0 /mnt/md0

#查看md0是否已经被识别为一个单个磁盘设备

[root@mzf ~]# fdisk -l 2> /dev/null | grep ‘md0‘
Disk /dev/md0: 2168 MB, 2168455168 bytes

#查看挂载点

[root@mzf ~]# df | grep ‘/md0‘
/dev/md0         2018796    3120   1909796   1% /mnt/md0

#拷贝配置文件到此挂载点

[root@mzf ~]# cp /etc/issue /etc/inittab /mnt/md0

#ls列出文件,发现出现了lost+found表示已经被识别了单个硬盘的单个分区

[root@mzf ~]# ls /mnt/md0
inittab  issue  lost+found


3、损坏模拟

#下面进行模拟损坏一块磁盘

#先查看此时md0成员信息,/dev/sdb5表示为备用,其它都是完好的

[root@mzf ~]# mdadm --detail /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘
  0     8       17        0      active sync   /dev/sdb1
  1     8       18        1      active sync   /dev/sdb2
  4     8       19        2      active sync   /dev/sdb3
  3     8       21        -      spare   /dev/sdb5

#使用-f或者--fail 选项模拟时/dev/sdb3分区损坏

[root@mzf ~]# mdadm /dev/md0  --fail /dev/sdb3
mdadm: set /dev/sdb3 faulty in /dev/md0

#再次查看分区信息,此时备用的sdb5已经自动顶了上去

[root@mzf ~]# mdadm --detail /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘
 0      8      17      0       active sync     /dev/sdb1
 1      8      18      1      active sync   /dev/sdb2
 3      8       21      2      spare rebuilding /dev/sdb5
 4      8      19      -      faulty   /dev/sdb3

#这时我们查看文件看看有没有损坏

[root@mzf ~]# cat /mnt/md0/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m

#下面修改此文件内容

[root@mzf ~]# sed -i ‘$a \new line \n hello world‘ /mnt/md0/issue

#查看修改后的文件内容

[root@mzf ~]# cat /mnt/md0/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
 
new line 
 hello world


4、移除成员

#这时我们移掉一块分区

[root@mzf ~]# mdadm /dev/md0 -r /dev/sdb3
mdadm: hot removed /dev/sdb3 from /dev/md0

说明:这里的热移除表示正在使用时进行移除

#再次查看成员

[root@mzf ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘
   0     8      17        0      active sync   /dev/sdb1
   1     8      18        1      active sync   /dev/sdb2
   3     8      21        2      active sync   /dev/sdb5


5、添加成员接管

#添加一个分区加入md0,这里要指定-n 表示为第4块硬盘

[root@mzf ~]# mdadm -G /dev/md0 -n 4 -a /dev/sdb6
mdadm: added /dev/sdb6
mdadm: Need to backup 3072K of critical section..

#再次查看md0磁盘阵列成员

[root@mzf ~]# mdadm -D /dev/md0 | grep ‘.*/dev/sdb[0-9]$‘
  0     8       17        0      active sync   /dev/sdb1
  1     8       18        1      active sync   /dev/sdb2
  3     8       21        2      active sync   /dev/sdb5
  4     8       22        3      active sync   /dev/sdb6

#再次查看数据,文件读取正常

[root@mzf ~]# cat /mnt/md0/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
 
new line 
 hello world

#再次加入

[root@mzf ~]# mdadm -G  /dev/md0 -n 5  -a /dev/sdb3
mdadm: added /dev/sdb3
mdadm: Need to backup 6144K of critical section..

#使用watch工具进行动态数据查看

[root@mzf ~]# watch -n 3 ‘cat /proc/mdstat‘

解析:这里表示数据同步中,使用watch可以不断进行读秒查看

 技术分享

#数据仍然存在

[root@mzf ~]# cat /mnt/md0/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
 
new line 
 hello world


6、保存md0阵列配置

#保存阵列数据配置

[root@mzf ~]# mdadm -D --scan /dev/md0 > /etc/mdadm.conf


7、停止md0阵列

#卸载md0设备

[root@mzf ~]# umount /mnt/md0

#停止磁盘阵列

[root@mzf ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

#内存中已经没有md0阵列了

[root@mzf ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
unused devices: <none>

#md0真的被停止了

[root@mzf ~]# fdisk -l 2> /dev/null | grep ‘md0‘


8、重启启动磁盘阵列

#重新启用md0阵列

[root@mzf ~]# mdadm -A -s /dev/md0
mdadm: /dev/md0 has been started with 5 drives.

#md0中5个设备都列了出来

[root@mzf ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdb1[0] sdb3[5] sdb6[4] sdb5[3] sdb2[1]
      4235264 blocks super 1.2 level 5, 512k chunk, algorithm 2 [5/5] [UUUUU]
      
unused devices: <none>

#挂载md0设备

[root@mzf ~]# mount /dev/md0 /mnt/md0

#文件数据依然存在

[root@mzf ~]# cat /mnt/md0/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
 
new line 
 hello world

注意:如果相要重新启用md0并读取原有设备成员,那么就需要madm -D -s的配置信息保存至/etc/mdadm.conf文件中,否则无法重新启用的。

 

9、测底清除设备成员的raid信息

#先卸载设备

[root@mzf ~]# umount /dev/md0

#停止阵列设备

[root@mzf ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0

#清除radi的超级块信息

[root@mzf ~]# mdadm --zero-superblock /dev/sdb{1,2,3,5,6}

#删除配置文件

[root@mzf ~]# rm -f /etc/mdadm.conf


本文出自 “神剑特兰克斯” 博客,请务必保留此出处http://mengzhaofu.blog.51cto.com/10085198/1844501

Linux入门之磁盘管理(7)RAID的实现