Linux存储之RAID技术

本文主要介绍Linux存储技术中的RAID的概念和操作方法。

1. RAID概念

RAID(Redundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。RAID的基本想法是把多个便宜的小磁盘组合到一起,成为一个磁盘组,使性能达到或超过一个容量巨大、价格昂贵的磁盘。

目前 RAID技术大致分为两种:基于硬件的RAID技术和基于软件的RAID技术。 本文介绍的是软RAID。

2. RAID级别

raid 0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%

​ A B

​ 1 2

​ 3 4

raid 1 镜像备份(mirror),同一份资料完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%

​ A B

​ 1 1

​ 2 2

​ 3 3

​ 4 4

raid 5 由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复

​ disk 1 disk 2 disk 3

​ 数据 数据 校验

​ 检验 数据 数据

​ 数据 检验 数据

raid 10 先做raid1,再做raid0

raid01 先做raid0,再做raid1

3. 软RAID实现

使用vmware或者kvm直接在线加8个1G大小的硬盘

linear 线型

stripe 条带

mirror 镜像

  • 创建raid 0
1
2
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: array /dev/md0 started.

创建过程中可以用另一终端cat /proc/mdstat去查看正在创建的状态信息

1
2
3
4
# mkfs.ext4 /dev/md0
# mount /dev/md0 /mnt/
# df -h |grep mnt
# cat /proc/mdstat
  • 创建raid 1
1
2
3
4
# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
# mkfs.ext4 /dev/md1
# mount /dev/md1 /media/
# df -h |grep md

对上面的raid0和raid1的一个写性能使用dd命令进行测试,下面命令可以多测几次

1
2
# dd if=/dev/zero of=/mnt/aaa bs=1M count=1000
# dd if=/dev/zero of=/media/bbb bs=1M count=1000

测试的结果是raid0写性能比raid1要好

1
# yum install sysstat -y

验证raid0,在做raid0的两个盘上查看io情况

终端1:iostat 2 两秒一次查看所有的盘上的IO情况

终端2: dd if=/dev/zero of=/mnt/aaa bs=1M count=1000

可以看到两个盘上都有写的io,并且/dev/sdb和/dev/sdc的IO一样,总和才等于/dev/md0的IO;验证了raid0的功能(条带)

验证raid1,在做raid1的两个盘上查看io情况

终端1:iostat 2 两秒一次查看所有的盘上的IO情况

终端2: dd if=/dev/zero of=/media/aaa bs=1M count=1000

可以看到两个盘上都有写的io,并且/dev/sdd和/dev/sde的IO一样,并且也等于/dev/md1的IO;验证了raid1的功能(镜像)

  • 创建raid5
1
2
3
4
5
6
7
8
9
10
# mdadm --create /dev/md5 --level=5 --raid-devices=4 /dev/sdf /dev/sdg /dev/sdh /dev/sdi
mdadm: array /dev/md5 started.
# watch cat /proc/mdstat --这里监控一下它们盘之间的数据同步;等它们同步完毕再进行下面的格式化
# mkfs.ext4 /dev/md5
# mount /dev/md5 /misc/
# df -h |grep md
/dev/md0 2.0G 36M 1.9G 2% /mnt --raid 0利用率为100%
/dev/md1 1008M 18M 940M 2% /media --raid 1利用率为50%
/dev/md5 3.0G 69M 2.8G 3% /misc --raid 5利用率为n-1/n,在这里就是3/4
# cat /proc/mdstat

验证raid5,在做raid5的四个盘上查看io情况

终端1:iostat 2 两秒一次查看所有的盘上的IO情况

终端2: dd if=/dev/zero of=/misc/aaa bs=1M count=1000

4. RAID启停

1
2
3
4
5
6
7
8
9
# vim /etc/mdadm.conf			手动编写raid的配置文件,此文件不存在,要手动建立,并写上
DEVICES /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/
sdg /dev/sdh /dev/sdi 把做了raid的分区写上来。或者写成DEVICES /dev/sd[bcdefghi]。但不能写成DEVICES /dev/sd{b,c,d,e,f,g,h,i}
# mdadm --detail --scan >> /etc/mdadm.conf 扫描当前raid的信息,并追加到配置文件里
# cat /etc/mdadm.conf
DEVICES /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi
ARRAY /dev/md0 level=raid0 num-devices=2 metadata=0.90 UUID=84209045:9c03c4cb:7f755b8d:cc471294
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=4e62fdc1:6c2a652f:fb72c05d:356d5c76
ARRAY /dev/md5 level=raid5 num-devices=4 metadata=0.90 UUID=c3c1f37b:9fba8a89:a711dc6c:01a5ddb3
  • 停止raid设备
1
2
3
4
5
6
7
8
9
10
11
12
先umount 已经挂载的raid设备
# umount /mnt/
# umount /media/
# umount /misc/

然后使用命令停止
# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
# mdadm --stop /dev/md5
mdadm: stopped /dev/md5
  • 启动raid设备”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(1) 有/etc/mdadm.conf配置文件的情况下
# mdadm -A /dev/md0
mdadm: /dev/md0 has been started with 2 drives.
# mdadm -A /dev/md1
mdadm: /dev/md1 has been started with 2 drives.
# mdadm -A /dev/md5
mdadm: /dev/md5 has been started with 4 drives.

# cat /proc/mdstat --再查看,就有信息了,并且raid里的数据还在



(2) 没有配置文件的情况下,手动把设备名写上就可以了
# mdadm -A /dev/md0 /dev/sd{b,c}
mdadm: /dev/md0 has been started with 2 drives.

# mdadm -A /dev/md1 /dev/sd{d,e}
mdadm: /dev/md1 has been started with 2 drives.

# mdadm -A /dev/md5 /dev/sd{f,g,h,i}
mdadm: /dev/md5 has been started with 4 drives.


(3) 如果连设备名都不知道,可以去查看每个设备的raid信息,使用uuid把raid设备重新组合
# mdadm -E /dev/sdf
/dev/sdf:
Magic : a92b4efc
Version : 0.90.00
UUID : b091e16b:f8df9671:465755db:c640595b --UUID,同一个raid里每个磁盘查看的都是这个值
Creation Time : Sat May 7 11:23:52 2011
Raid Level : raid5
Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
Array Size : 3145536 (3.00 GiB 3.22 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 5

Update Time : Sat May 7 11:42:09 2011
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Checksum : facef367 - correct
Events : 2

Layout : left-symmetric
Chunk Size : 64K

Number Major Minor RaidDevice State
this 0 8 80 0 active sync /dev/sdf

0 0 8 80 0 active sync /dev/sdf
1 1 8 96 1 active sync /dev/sdg
2 2 8 112 2 active sync /dev/sdh
3 3 8 128 3 active sync /dev/sdi


# mdadm -A --uuid=b091e16b:f8df9671:465755db:c640595b /dev/md5
mdadm: /dev/md5 has been started with 4 drives.

上面组合后的名字可以随意写,甚至是不存在的一个名字,相当于是重新组合

5. 软raid的热插拔实验

模拟raid中其中一块盘故障

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# mdadm /dev/md5 --fail /dev/sdf
mdadm: set /dev/sdf faulty in /dev/md5
--使用--fail对raid中其中一块盘打一个fail标记

# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdf[4](F) sdi[3] sdh[2] sdg[1]--有个F标记
3145536 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]

md1 : active raid1 sdd[0] sde[1]
1048512 blocks [2/2] [UU]

md0 : active raid0 sdb[0] sdc[1]
2097024 blocks 64k chunks

# mdadm /dev/md5 --remove /dev/sdf
mdadm: hot removed /dev/sdf
热移除故障磁盘

# mdadm /dev/md5 --add /dev/sdj --增加一块新的磁盘上去
mdadm: re-added /dev/sdj
--刚增加完后,机器负载较高,因为现在它在对新盘同步数据

# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdj[4] sdi[3] sdh[2] sdg[1]
3145536 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]
[=====>...............] recovery = 29.2% (307840/1048512) finish=0.0min speed=153920K/sec --这里可以看到在同步中

md1 : active raid1 sdd[0] sde[1]
1048512 blocks [2/2] [UU]

md0 : active raid0 sdb[0] sdc[1]
2097024 blocks 64k chunks

同步完成后,查看数据还在;

6. 删除raid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(1) 第一步
# umount
(2) 第二步
# mdadm /dev/md5 --fail /dev/sdf --remove /dev/sdf
mdadm: set /dev/sdf faulty in /dev/md5
mdadm: hot removed /dev/sdf
# mdadm /dev/md5 --fail /dev/sdg --remove /dev/sdg
mdadm: set /dev/sdg faulty in /dev/md5
mdadm: hot removed /dev/sdg
# mdadm /dev/md5 --fail /dev/sdh --remove /dev/sdh
mdadm: set /dev/sdh faulty in /dev/md5
mdadm: hot removed /dev/sdh
# mdadm /dev/md5 --fail /dev/sdi --remove /dev/sdi
mdadm: set /dev/sdi faulty in /dev/md5
mdadm: hot removed /dev/sdi
(3) 第三步
# mdadm --stop /dev/md5
mdadm: stopped /dev/md5
(4) 第四步
直接用fdisk删除分区,或者用下面命令擦除superblock
# mdadm --misc --zero-superblock /dev/sdf
# mdadm --misc --zero-superblock /dev/sdg
# mdadm --misc --zero-superblock /dev/sdh
# mdadm --misc --zero-superblock /dev/sdi
---------------- The End ----------------