Linux应该这么学第7章使用 RAID 与 LVM 磁盘阵列技术
本章讲解了如下内容:
➢ RAID(独立冗余磁盘阵列);
➢ LVM(逻辑卷管理器)。
在学习了第 6 章讲解的硬盘设备分区、格式化、挂载等知识后,本章将深入讲解各个常
用 RAID(Redundant Array of Independent Disks,独立冗余磁盘阵列)技术方案的特性,并通
过实际部署 RAID 10、RAID 5+备份盘等方案来更直观地查看 RAID 的强大效果,以便进一步
满足生产环境对硬盘设备的 IO 读写速度和数据冗余备份机制的需求。同时,考虑到用户可能
会动态调整存储资源,本章还将介绍 LVM(Logical Volume Manager,逻辑卷管理器)的部署、
扩容、缩小、快照以及卸载删除的相关知识。相信读者在学完本章内容后,便可以在企业级生
产环境中灵活运用 RAID 和 LVM 来满足对存储资源的高级管理需求了。
7.1 RAID(独立冗余磁盘阵列)
近年来, CPU 的处理性能保持着高速增长,Intel 公司在 2017 年最新发布的 i9-7980XE
处理器芯片更是达到了 18 核心 36 线程。但与此同时,硬盘设备的性能提升却不是很大,因
此逐渐成为当代计算机整体性能的瓶颈。而且,由于硬盘设备需要进行持续、频繁、大量的
IO 操作,相较于其他设备,其损坏几率也大幅增加,导致重要数据丢失的几率也随之增加。
1988 年,加利福尼亚大学伯克利分校首次提出并定义了 RAID 技术的概念。RAID 技术
通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区
段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的
性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据
冗余备份效果。
任何事物都有它的两面性。RAID 技术确实具有非常好的数据冗余备份功能,但是它也相
应地提高了成本支出。就像原本我们只有一个电话本,但是为了避免遗失,我们将联系人号
码信息写成了两份,自然要为此多买一个电话本,这也就相应地提升了成本支出。RAID 技术
的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现代
企业更看重的则是 RAID 技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升。也就是
说,RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度,所以
它在绝大多数运营商或大中型企业中得以广泛部署和应用。
出于成本和技术方面的考虑,需要针对不同的需求在数据可靠性及读写性能上作出权衡,
制定出满足各自需求的不同方案。目前已有的 RAID 磁盘阵列的方案至少有十几种,而刘遄
老师接下来会详细讲解 RAID 0、RAID 1、RAID 5 与 RAID 10 这 4 种最常见的方案。
7.1.1 RAID 0
RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成
一个大的卷组,并将数据依次写入到各个物理硬盘中。这样一来,在最理想的状态下,硬盘设
备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。
通俗来说,RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修
复能力。如图 7-1 所示,数据被分别写入到不同的硬盘设备中,即 disk1 和 disk2 硬盘设备会
分别保存数据资料,最终实现提升读取、写入速度的效果。
7.1.2 RAID 1尽管 RAID 0 技术提升了硬盘设备的读写速度,但是它是将数据依次写入到各个物理硬
盘中,也就是说,它的数据是分开存放的,其中任何一块硬盘发生故障都会损坏整个系统的
数据。因此,如果生产环境对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时,
就需要用到 RAID 1 技术了。
在图 7-2 所示的 RAID 1 技术示意图中可以看到,它是把两块以上的硬盘设备进行绑
定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备
份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常
使用。
RAID 1 技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数
据,因此硬盘设备的利用率得以下降,从理论上来说,图 7-2 所示的硬盘空间的真实可用率只
有 50%,由三块硬盘设备组成的 RAID 1 磁盘阵列的可用率只有 33%左右,以此类推。而且,
由于需要把数据同时写入到两块以上的硬盘设备,这无疑也在一定程度上增大了系统计算功
能的负载。
那么,有没有一种 RAID 方案既考虑到了硬盘设备的读写速度和数据安全性,还兼顾了
成本问题呢?实际上,单从数据安全和成本问题上来讲,就不可能在保持原有硬盘设备的利
用率且还不增加新设备的情况下,能大幅提升数据的安全性。刘遄老师也没有必要忽悠各位
读者,下面将要讲解的 RAID 5 技术虽然在理论上兼顾了三者(读写速度、数据安全性、成
本),但实际上更像是对这三者的“相互妥协”。
7.1.3 RAID 5
如图 7-3 所示,RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。
RAID 5 磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到
除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命
缺陷;图 7-3 中 parity 部分存放的就是数据的奇偶校验信息,换句话说,就是 RAID 5 技术实
际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试
重建损坏的数据。RAID 这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性
与存储成本问题。
7.1.4 RAID 10
鉴于 RAID 5 技术是因为硬盘设备的成本问题对读写速度和数据的安全性能而有了一定
的妥协,但是大部分企业更在乎的是数据本身的价值而非硬盘价格,因此生产环境中主要使
用 RAID 10 技术。
顾名思义,RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”。如图 7-4 所示,
RAID 10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列,以保
证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设
备的读写速度。这样从理论上来讲,只要坏的不是同一组中的所有硬盘,那么最多可以损
坏 50%的硬盘设备而不丢失数据。由于 RAID 10 技术继承了 RAID 0 的高读写速度和 RAID
1 的数据安全性,在不考虑成本的情况下 RAID 10 的性能都超过了 RAID 5,因此当前成
为广泛使用的一种存储技术。
7.1.5 部署磁盘阵列
在具备了上一章的硬盘设备管理基础之后,再来部署 RAID 和 LVM 就变得十分轻松了。首
先,需要在虚拟机中添加 4 块硬盘设备来制作一个 RAID 10 磁盘阵列,如图 7-5 所示。
这几块硬盘设备是模拟出来的,不需要特意去买几块真实的物理硬盘插到电脑上。需要
注意的是,一定要记得在关闭系统之后,再在虚拟机中添加硬盘设备,否则可能会因为计算
机架构的不同而导致虚拟机系统无法识别添加的硬盘设备。
mdadm 命令用于管理 Linux 系统中的软件 RAID 硬盘阵列,格式为“mdadm [模式] <RAID
设备名称> [选项] [成员设备名称]”。
当前,生产环境中用到的服务器一般都配备 RAID 阵列卡,尽管服务器的价格越来越便
宜,但是我们没有必要为了做一个实验而去单独购买一台服务器,而是可以学会用 mdadm 命
令在 Linux 系统中创建和管理软件 RAID 磁盘阵列,而且它涉及的理论知识的操作过程与生
产环境中的完全一致。mdadm 命令的常用参数以及作用如表 7-1 所示。
接下来,使用 mdadm 命令创建 RAID 10,名称为“/dev/md0”。
第 6 章中讲到,udev 是 Linux 系统内核中用来给硬件命名的服务,其命名规则也非
常简单。我们可以通过命名规则猜测到第二个 SCSI 存储设备的名称会是/dev/sdb,然后
依此类推。使用硬盘设备来部署 RAID 磁盘阵列很像是将几位同学组成一个班级,但总
不能将班级命名为/dev/sdbcde 吧。尽管这样可以一眼看出它是由哪些元素组成的,但是
并不利于我们的记忆和阅读。更何况如果我们是使用 10、50、100 个硬盘来部署 RAID
磁盘阵列呢?
此时,就需要使用 mdadm 中的参数了。其中,-C 参数代表创建一个 RAID 阵列卡;-v 参
数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID
磁盘阵列的名称;-a yes 参数代表自动创建设备文件;-n 4 参数代表使用 4 块硬盘来部署这个
RAID 磁盘阵列;而-l 10 参数则代表 RAID 10 方案;最后再加上 4 块硬盘设备的名称就搞定
了。
[[email protected] ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20955136K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
其次,把制作好的 RAID 磁盘阵列格式化为 ext4 格式。
[[email protected] ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477568 blocks
523878 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
再次,创建挂载点然后把硬盘设备进行挂载操作。挂载成功后可看到可用空间为
40GB。
[[email protected] ~]# mkdir /RAID
[[email protected] ~]# mount /dev/md0 /RAID/
[[email protected] ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root 50G 6.2G 44G 13% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 84K 912M 1% /dev/shm
tmpfs 912M 9.0M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 1014M 174M 841M 18% /boot
/dev/mapper/cl-home 47G 37M 47G 1% /home
tmpfs 183M 12K 183M 1% /run/user/42
tmpfs 183M 0 183M 0% /run/user/0
/dev/md0 40G 49M 38G 1% /RAID
最后,查看/dev/md0 磁盘阵列的详细信息,并把挂载信息写入到配置文件中,使其永久
生效。
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 2 16:51:12 2018
Raid Level : raid10
Array Size : 41910272 (39.97 GiB 42.92 GB)
Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Nov 2 16:55:16 2018
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost:0 (local to host localhost)
UUID : 736b6527:5ef5d6f1:fe7b274b:46d306b9
Events : 19
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
7.1.6 损坏磁盘阵列及修复
之所以在生产环境中部署 RAID 10 磁盘阵列,是为了提高硬盘存储设备的读写速度及数
据的安全性,但由于我们的硬盘设备是在虚拟机中模拟出来的,因此对读写速度的改善可能
并不直观,因此刘遄老师决定给各位读者讲解一下 RAID 磁盘阵列损坏后的处理方法,这样
大家在步入运维岗位后遇到类似问题时,也可以轻松解决。
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用 mdadm 命令将其
移除,然后查看 RAID 磁盘阵列的状态,可以发现状态已经改变。
[[email protected] ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 2 16:51:12 2018
Raid Level : raid10
Array Size : 41910272 (39.97 GiB 42.92 GB)
Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Nov 2 16:57:36 2018
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost:0 (local to host localhost)
UUID : 736b6527:5ef5d6f1:fe7b274b:46d306b9
Events : 21
Number Major Minor RaidDevice State
- 0 0 0 removed
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
0 8 16 - faulty /dev/sdb
在 RAID 10 级别的磁盘阵列中,当 RAID 1 磁盘阵列中存在一个故障盘时并不影响 RAID
10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令来予以替换即可,在此期间
我们可以在/RAID 目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先
重启系统,然后再把新的硬盘添加到 RAID 磁盘阵列中。
[[email protected] ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 2 17:09:44 2018
Raid Level : raid10
Array Size : 41910272 (39.97 GiB 42.92 GB)
Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Nov 2 17:10:44 2018
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost:0 (local to host localhost)
UUID : 190f31d6:b078b001:f5fe07cb:d191131a
Events : 12
Number Major Minor RaidDevice State
- 0 0 0 removed
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
0 8 16 - faulty /dev/sdb
[[email protected] ~]# mdadm -r /dev/md0 /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 2 17:09:44 2018
Raid Level : raid10
Array Size : 41910272 (39.97 GiB 42.92 GB)
Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 3
Persistence : Superblock is persistent
Update Time : Fri Nov 2 17:11:13 2018
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost:0 (local to host localhost)
UUID : 190f31d6:b078b001:f5fe07cb:d191131a
Events : 13
Number Major Minor RaidDevice State
- 0 0 0 removed
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
[[email protected] ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 2 17:09:44 2018
Raid Level : raid10
Array Size : 41910272 (39.97 GiB 42.92 GB)
Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Nov 2 17:11:58 2018
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Rebuild Status : 12% complete
Name : localhost:0 (local to host localhost)
UUID : 190f31d6:b078b001:f5fe07cb:d191131a
Events : 16
Number Major Minor RaidDevice State
4 8 16 0 spare rebuilding /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