Linux RAID 简介
简介
RAID早先的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),本意为使用多块硬件中较为廉价且效能增长较慢的磁盘组成阵列,用来提升计算机性能,同时实现容错、逻辑数据备份的功能。但后来发现,大量便宜磁盘组合并不能适用于现实的生产环境,而该技术得到了越来越广泛的应用后,各种生产环境的实现方案并不便宜。所以后来 Inexpensive
被改为 Independent
,意为独立磁盘冗余阵列(Redundant Array of Independent Drives)。
目的
- 提高 IO 能力:磁盘并行读写;
- 提高耐用性:磁盘冗余来实现。
RAID级别
RAID 的级别并不是说等级越高越好,而是表示多块磁盘组织在一起工作的不同方式。
RAID 级别的实现方式主要有以下三种:
- 外接式磁盘阵列:通过扩展卡提供适配能力。(生产环境主要实现方式。)
- 内接式 RAID:主板集成RAID控制器。(BIOS。)
- 软件实现 RAID:通过系统自带模块或软件方式实现。(现网环境不推荐使用。)
由于 RAID 的级别众多,下面只介绍几个常用的 RAID 级别。
RAID-0:条带卷
至少两块磁盘组成,将数据切割后,分别存入两个磁盘,读取时再从两个磁盘同时读取,提高了整体 IO 性能。
容量计算为:硬盘容量*硬盘个数。
优点:
- 读写新能提升。
缺点:
- 无容错能力。
磁盘容错:0。
RAID-1:镜像卷
至少两块硬盘组成,将数据分别存入两个磁盘,读取时分别从两个磁盘读取,提高了容错能力。
容量计算为:最小硬盘容量。
优点:
- 读取性能提升;
- 良好的容错能力;
- 重建会更快。
缺点:
- 写入性能下降;
- 总容量减半;
磁盘容错:1。
RAID-4:奇偶校验
针对 RAID-0
的优化,至少三块硬盘组成,数据分别存入两块盘,第三块盘存校验码,以便进行数据恢复。
容量计算为:最小硬盘容量*(硬盘个数-1)。
优点:
- 读写性能提升;
- 有一定的容错能力。
缺点:
- 单块盘作为校验盘,访问压力较大,比较容易坏的同时,可能会影响性能。
- 目前不常用。
磁盘容错:1。
RAID-5:单磁盘分布式奇偶校验
针对 RAID-4
的提升,至少三块硬盘组成,三块硬盘轮流当校验盘,减轻了校验盘的压力。
容量计算为:最小硬盘容量*(硬盘个数-1)。
优点:
- 读写性能提升;
- 容错能力提升。
缺点:
- 暂未发现。
磁盘容错:1。
RAID-6:双磁盘分布式奇偶校验
至少由四块硬盘组成,相对于 RAID-5
,增加1个磁盘作校验盘,大大提高了容错能力。
容量计算为:最小硬盘容量*(硬盘个数-2)。
优点:
- 读写性能提升;
- 容错能力提升。
缺点:
- 暂未发现。
磁盘容错:2。
RAID-10:镜像+条带
混合型用法,至少四块硬盘,先把硬盘两两 RAID-1
,然后再整体 RAID-0
。
容量计算为:Raid-1 容量++。
优点:
- 读写性能提升;
- 有一定的容错能力。
缺点:
RAID-1
中的两块磁盘同时坏掉,整个组合将不可用。
磁盘容错:最小容错1,最大容错视 Raid-1 的个数而定。
RAID-01: 条带+镜像
混合型用法,至少四块硬盘,先把硬盘两两 RAID-0
,然后再整体 RAID-1
。
容量计算为:最小容量的 Raid-0。
优点:
- 读写性能提升;
- 有一定的容错能力。
缺点:
- 任意一块磁盘坏点,都将导致
RAID-0
不可用,只剩下其他组的硬盘在运行,可靠性较低。 - 若
RAID-1
下的RAID-0
中各有一块磁盘坏掉,整合组合将不可用。
磁盘容错:1-2。
RAID-50:单磁盘分布式奇偶校验+条带
至少六块硬盘,先把每三块硬盘组成 RAID-5
,再结合成 RAID-0
,相当于在 RAID-5
的基础上再次提升了性能。
容量计算为:Raid-5 容量++。
优点:
- 读写性能提升;
- 容错能力更佳。
缺点:
- 容量利用率稍低。
磁盘容错:最小容错1,最大容错视 Raid-5 个数而定。
RAID-60:双磁盘分布式奇偶校验+条带
至少八块硬盘,和 RAID-50
相似,容错能力进一步提升,但容量利用率也进一步降低。
JBOD
不是标准的 RAID 级别,但也属于磁盘阵列的一种。
JBOD
把各磁盘进行串联,虚拟成一个大容量的磁盘,读写能力由各磁盘分别决定。
容量计算为:磁盘容量++
优点:
- 将小容量磁盘结合成大容量磁盘,适用于某些特殊情景。
缺点:
- 无容错能力。
磁盘容错:0。
实现方式
软件实现 RAID
结合内核中的 md
(multi devices) 模块实现。
实现工具:mdadm
。
命令语法格式:
mdadm [mode] [options] (设备分区模式必须为「fd Linux raid」)`。
:分配的设备文件名。
:磁盘分区。
支持的 RAID 级别:LINEAR(类似JBOD)
,RAID-0
,RAID-1
,RAID-4
,RAID-5
,RAID-6
,RAID10
。
模式(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的状态:
cat /proc/mdstat
停止md设备:
mdadm -S
更多信息请参考man mdadm
。
示例:创建一个5G的 RAID-1,并指定一块空闲硬盘容灾。
这里使用的是三块磁盘进行测试。
给三块磁盘分别进行分区(设备分区模式必须为「fd Linux raid」)。
[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
,并指定一块空闲硬盘容灾。
[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:
[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
创建成功了,sdc1
和 sdb1
组成 RAID-1
,sdd1
作为空闲磁盘备用。
使用 mdadm /dev/md0 -r /dev/sdd1
和mdadm /dev/md0 -a /dev/sdd1
可以移除或添加磁盘。
下面要做的,就是格式化并挂载分区了。
[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。
使磁盘实效并卸载:
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:
mdadm --stop /dev/md0
mdadm --remove /dev/md0
清空超级块信息:
mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd
清除其他配置:
rm -f /etc/mdadm.conf
rm -f /etc/raidtab
了解更多:RAID技术的发展及应用