Linux RAID 简介

简介

RAID早先的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),本意为使用多块硬件中较为廉价且效能增长较慢的磁盘组成阵列,用来提升计算机性能,同时实现容错、逻辑数据备份的功能。但后来发现,大量便宜磁盘组合并不能适用于现实的生产环境,而该技术得到了越来越广泛的应用后,各种生产环境的实现方案并不便宜。所以后来Inexpensive被改为independent,意为独立磁盘冗余阵列(Redundant Array of Independent Drives)。

目的

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

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

RAID级别

RAID的级别并不是说等级越高越好,而是表示多块磁盘组织在一起工作的不同方式。

RAID级别的实现方式主要有以下三种:

  1. 外接式磁盘阵列:通过扩展卡提供适配能力。(生产环境主要实现方式。)
  2. 内接式RAID:主板集成RAID控制器。(BIOS。)
  3. 软件实现RAID:通过系统自带模块或软件方式实现。(现网环境不推荐使用。)

RAID级别简介:

由于RAID的级别众多,下面只介绍几个常用的RAID级别。

RAID-0:条带卷;

至少两块磁盘组成,将数据切割后,分别存入两个磁盘,读取时再从两个磁盘同时读取,提高了整体IO性能。

容量计算为:最小硬盘容量*硬盘个数。

优点:

  1. 读写新能提升。

缺点:

  1. 无容错能力。

最大磁盘容错:0。

RAID-1:镜像卷;

至少两块硬盘组成,将数据分别存入两个磁盘,读取时分别从两个磁盘读取,提高了容错能力。

容量计算为:最小硬盘容量。

优点:

  1. 读取性能提升;
  2. 良好的容错能力;
  3. 重建会更快。

缺点:

  1. 写入性能下降;
  2. 总容量减半;

最大磁盘容错:1。

RAID-4:奇偶校验;

针对RAID-0的优化,至少三块硬盘组成,数据分别存入两块盘,第三块盘存校验吗,以便进行数据恢复。

容量计算为:最小硬盘容量*(硬盘个数-1)。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. 单块盘作为校验盘,访问压力较大,比较容易坏的同时,可能会影响性能。
  2. 目前不常用。

最大磁盘容错:1。

RAID-5:单磁盘分布式奇偶校验;

针对RAID-4的提升,至少三块硬盘组成,三块硬盘轮流当校验盘,减轻了校验盘的压力。

容量计算为:最小硬盘容量*(硬盘个数-1)。

优点:

  1. 读写性能提升;
  2. 容错能力提升。

缺点:

  1. 暂未发现。

最大磁盘容错:1。

RAID-6:双磁盘分布式奇偶校验;

至少由四块硬盘组成,相对于RAID-5,增加1个磁盘作校验盘,大大提高了容错能力。

容量计算为:最小硬盘容量*(硬盘个数-2)。

优点:

  1. 读写性能提升;
  2. 容错能力提升。

缺点:

  1. 暂未发现。

最大磁盘容错:2。

RAID-10:镜像+条带;

混合型用法,至少四块硬盘,先把硬盘两两RAID-1,然后再整体RAID-0

容量计算为:最小硬盘容量*硬盘数量/2。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. RAID-1中的两块磁盘同时坏掉,整个组合将不可用。

最大磁盘容错:1-2。

RAID-01: 条带+镜像;

混合型用法,至少四块硬盘,先把硬盘两两RAID-0,然后再整体RAID-1

容量计算为:最小硬盘容量*硬盘数量/2。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. 任意一块磁盘坏点,都将导致RAID-0不可用,只剩下其他组的硬盘在运行,可靠性较低。
  2. RAID-1下的RAID-0中各有一块磁盘坏掉,整合组合将不可用。

最大磁盘容错:1-2。

RAID-50:单磁盘分布式奇偶校验+条带。

至少六块硬盘,先把每三块硬盘组成RAID-5,再结合成RAID-0,相当于在RAID-5的基础上再次提升了性能。

容量计算为:最小硬盘容量*(硬盘个数-2)。

优点:

  1. 读写性能提升;
  2. 容错能力更佳。

缺点:

  1. 容量利用率稍低。

最大磁盘容错:3-4。

RAID-60:双磁盘分布式奇偶校验+条带。

至少八块硬盘,和RAID-50相似,容错能力进一步提升,但容量利用率也进一步降低。

JBOD

不是标准的RAID级别,但也属于磁盘阵列的一种。

JBOD把各磁盘进行串联,虚拟成一个大容量的磁盘,读写能力由各磁盘分别决定。

容量计算为:磁盘容量++

优点:

  1. 将小容量磁盘结合成大容量磁盘,适用于某些特殊情景。

缺点:

  1. 无容错能力。

最大磁盘容错:0。

实现方式

软件实现RAID

结合内核中的md(multi devices)模块实现。

实现工具:mdadm

命令语法格式:

1
2
3
4
mdadm [mode] <raiddevice> [options] <component-devices>(设备分区模式必须为“fd  Linux raid”)`。

<raiddevice>:分配的设备文件名。
<component-devices>:磁盘分区。

支持的RAID级别:LINEAR(类似JBOD)RAID-0RAID-1RAID-4RAID-5RAID-6RAID10

模式(mode):

  • 创建:-C
  • 装配:-A(扫描磁盘原有的RAID模式,并重新合并成RAID使用);
  • 监控:-F
  • 管理:-f, -r, -a

-C 创建模式:

  • -n #:使用#个块设备来创建此RAID;
  • -l #:指明要创建的RAID的级别;
  • -a {yes|no}:是否自动创建目标RAID设备的设备文件;
  • -c CHUNK_SIZE:指明块大小;
  • -x #:指明空闲盘的个数;

-D 显示raid的详细信息。

管理模式:

  • -f:标记指定磁盘为损坏;
  • -a:添加磁盘;
  • -r:移除磁盘;

观察md的状态:

1
cat /proc/mdstat

停止md设备:

1
mdadm -S <raiddevice>

更多信息请参考man mdadm

示例:创建一个5G的RAID-1,并指定一块空闲硬盘容灾。

这里使用的是三块磁盘进行测试。

给三块磁盘分别进行分区(设备分区模式必须为“fd Linux 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
[hzz@magedu ~]$ sudo fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x4b641fab 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$ sudo fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x252be28b 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$ sudo fdisk /dev/sdd
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xc69b9099 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$

创建RAID-1,并指定一块空闲硬盘容灾。

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
[hzz@magedu ~]$ sudo mdadm -C /dev/md0 -l 1 -n 2 -x 1 /dev/sd[bcd]1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[hzz@magedu ~]$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdd1[2](S) sdc1[1] sdb1[0]
5237760 blocks super 1.2 [2/2] [UU]

unused devices: <none>
[hzz@magedu ~]$ sudo mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Apr 19 21:33:56 2017
Raid Level : raid1
Array Size : 5237760 (5.00 GiB 5.36 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Wed Apr 19 21:43:46 2017
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

Name : magedu:0 (local to host magedu)
UUID : edd36aaa:07f77b23:98d9bcf6:88a1db83
Events : 21

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

2 8 49 - spare /dev/sdd1
[hzz@magedu ~]$

可以看到RAID-1创建成功了,sdc1sdb1组成RAID-1sdd1作为空闲磁盘备用。

使用mdadm /dev/md0 -r /dev/sdd1mdadm /dev/md0 -a /dev/sdd1可以移除或添加磁盘。

下面要做的,就是格式化并挂载分区了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[hzz@magedu ~]$ sudo mkfs.xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=4, agsize=327360 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1309440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[hzz@magedu ~]$ mkdir -p /tmp/myRaidTest
[hzz@magedu ~]$ sudo mount /dev/md0 /tmp/myRaidTest
[hzz@magedu ~]$ cat /proc/mounts |grep myRaid
/dev/md0 /tmp/myRaidTest xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
[hzz@magedu ~]$

删除软RAID

软RAID创建后,如果不按顺序删除卸载,则磁盘在以后的使用中可能会遇到各种问题,下面说说怎么卸载软RAID。

使磁盘实效并卸载:

1
2
3
mdadm/dev/md0 --fail /dev/sdb --remove /dev/sdb
mdadm/dev/md0 --fail /dev/sdc --remove /dev/sdc
mdadm/dev/md0 --fail /dev/sdc --remove /dev/sdd

停止并删除RAID:

1
2
mdadm --stop /dev/md0
mdadm --remove /dev/md0

清空超级块信息:

1
2
3
mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd

清除其他配置:

1
2
rm -f /etc/mdadm.conf
rm -f /etc/raidtab