00:00/00:00

本章节已编写及校对完毕,现有奖征集建议、若您发现本章中有错别字或补充欢迎联系刘遄老师QQ:5604241。

章节简述:

学习了第6章节对硬盘设备分区、格式化、挂载等知识技能后,为了能够进一步满足生产环境中对存储设备IO读写速度和数据冗余备份机制的更高需求,本章节将会深入为您讲解各个常用RAID磁盘阵列组技术方案的特性,并实践部署RAID10、RAID5+备份盘等方案来更直观的看到RAID磁盘阵列组的强大效果。

同时为了满足用户对存储资源的动态调整的需求,还会深入的学习LVM逻辑卷管理器的部署、扩容、缩小、快照及卸载删除的步骤。总之,学完本章节后将让您能够胜任企业级生产环境的RAID、LVM存储资源的管理工作,绝对当之无愧是《Linux就该这么学》书籍中非常干货的内容。

7.1 RAID磁盘冗余阵列

现在计算机硬件中CPU处理器平均每年可提升30%-50%的计算性能,不仅如此,还在能耗方面有着不错的持续改善,但硬盘设备的性能提升仅仅为每年7%-10%,显然已经逐步成为了当代计算机整体性能的瓶颈问题,并且因为持续、频繁、大量的IO读写操作使得硬盘相比其他设备还存在很大损坏几率,导致重要的数据丢失。因此在1988年,由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID独立磁盘冗余阵列(Redundant Array of Independent Disks),RAID技术就是把许多块硬盘设备组合成一个容量更大、更安全的硬盘组,可以把数据切割成多个区段后分别存放在各个不同物理硬盘设备上,然后利用分散读写需求来提升硬盘组整体的性能,同时把重要数据同步保存多份到不同的物理硬盘设备上,起到非常好的数据冗余备份效果。

但就像宇宙万物运转也总要遵循着规则,不可能一项技术照顾到所有的需求,满足所有人的想法,所以当咱们坐下来静静思考下刚刚所说的优点也会发现一个重要事实——提高成本了。就像原本只有一个电话本,但是为了保障数据安全所以把联系人号码信息写成了两份,自然就要为多买的一个电话本而承担更多的成本支出,RAID硬盘组技术的设计初衷是减少对硬盘设备的支出花费,但与数据价值相比较,现在企业更在乎的是RAID技术不仅能够提升硬盘的吞吐量,还为硬盘提供了冗余备份机制,也就是说不仅增加了存储设备的IO读写速度,还很大程度上降低了硬盘设备损坏后丢失数据的可能性,所以这项技术已经成为了大部分IDC运营商或大中型企业的必备能力了~

由于对成本和技术两方面的考虑,因此需要针对不同的需求在数据可靠性及读写性能上做权衡,制定出各自不同的合适方案,目前已有的RAID硬盘组的方案至少有十几种,而刘遄老师接下来会逐个讲解下RAID0RAID1RAID5RAID10的四种最常见的方案。首先是RAID0硬盘组,这项技术是把多块物理硬盘设备通过硬件或软件的方式串联在一起,成为一个大的卷组,将数据依次分别写入到各个物理硬盘中,这样最理想的状态会使得读写性能提升数倍,但若任意一块硬盘故障则会让整个系统的数据都受到破坏。通俗来说RAID0硬盘组技术至少需要两块物理硬盘设备,能够有效的提高硬盘的性能和吞吐量,但没有数据的冗余和错误修复能力,就像如图7-1所示,数据被分别写入到不同的硬盘设备中。

图7-1 RAID0硬盘组技术示例图

RAID0硬盘组技术虽然很大程度上提高了存储设备的IO读写速度,但仔细研究图7-1中所描述的数据存放结构就会不难发现数据是被分开存放的,也就是说假设任何其中的一块硬盘出现了问题都会破坏数据的完整性。因此在生产环境中如果需求不是增加存储设备的读写速度,而是追求数据安全性的时候就比较推荐使用RAID1硬盘组技术了,如图7-2所示,RAID1硬盘组技术是把两块以上的存储设备进行绑定,目的是让数据被多块硬盘同时写入,类似于把数据再制作出多份备份的镜像,当有某一块硬盘损坏后一般可以立即通过热交换方式来恢复数据的正常使用,RAID1硬盘组技术虽然十分注重数据的安全性,但因为是把多块硬盘中写入相同的数据,也就是说理论上硬盘空间的真实可用率只有50%,因此会明显的提高硬盘组整体的成本,同时因为需要把数据同时写入到两块以上的硬盘设备中,这无疑也会增加一定系统计算功能的负载。

图7-2 RAID1硬盘组技术示例图

那有没有RAID组合方案既考虑到存储设备的IO读写速度和数据安全性还能兼顾到成本问题呢?实际上单从数据安全和成本问题上来讲,就不可能在保持原有存储可用率同时还不增加新设备的情况下大幅提升数据的安全性,刘遄老师也没有必要忽悠同学们,待会讲的这种RAID5硬盘组技术虽然理论上是兼顾三者的,但实际上更像是一种对各个方面的“互相妥协”。如图7-3所示,RAID5硬盘组技术是把其它存储设备中的数据奇偶校验信息互相保存到硬盘设备中。RAID5硬盘组阵列有两项技术特色,第一,数据的奇偶校验信息并不是单独保存到某一块硬盘设备中的,而是分别互相存储到其它每一块硬盘设备上,这样的好处就是当其中任何一设备损坏后不至于出现致命缺陷。第二,图中parity(绿底白字)部分示例的就是保存数据的奇偶校验信息,换句话说就是RAID5硬盘组并不是备份真真正正的硬盘实际数据信息,而是当设备出现问题后通过奇偶校验信息来尝试重建损坏的数据,这样的技术特性“妥协”的兼顾了存储设备性能、数据安全性与存储成本问题。

图7-3 RAID5硬盘组技术示例图

由于RAID5硬盘组技术是因为成本问题对存储读写速度和安全性能而有了一定的妥协,但绝大部分情况下企业相比硬盘的价格,一定更加在乎数据的价值,生产环境中主要则是使用的RAID10硬盘组技术,顾名思义,这样技术就是对RAID1+RAID0硬盘组技术的一个“组合体”。如图7-4所示,RAID10硬盘组需要至少4块硬盘来组建,其中先分别两两制作成RAID1硬盘组,保证数据的安全性,然后再对两个RAID1硬盘组实施RAID0技术,进一步的提高存储设备的读写速度,这样理论上只要坏的不是同一组中的所有硬盘,那么最多可以损坏50%的硬盘设备而不丢失数据,因此RAID10硬盘组技术继承了RAID0更高的读写速度和RAID1更安全的数据保障,在不考虑成本的情况下RAID10在读写速度和数据保障性方面都超过了RAID5,是较为广泛使用的存储技术。

raid10

图7-4 RAID10硬盘组技术示例图

7.1.1 部署磁盘阵列组

有了前面第6章对于Linux系统中管理硬盘设备的基础学习,咱们接下来再来部署RAID和LVM就变得十分轻松啦。首先需要为虚拟机中添加4块硬盘设备来制作一个RAID10磁盘阵列组,如图7-5所示,这几块硬盘设备是模拟出来的,不需要特意去买几块真实的物理硬盘插到电脑上,但请注意在虚拟机中添加硬盘的操作一定要记得关闭系统之后再做,否则有时因同学们的电脑架构不同会导致虚拟机系统识别不到硬盘设备。

虚拟机添加硬盘

图7-5 为虚拟机系统模拟添加4块硬盘设备

mdadm命令用于管理系统软件RAID硬盘阵列,格式为:"mdadm [模式] <RAID设备名称> [选项] [成员设备名称]"。

在现在生产环境中的服务器一般都会配备有RAID阵列卡,价格也是越来越廉价,但没有必要让同学们为了做一个实验而单独去买一台服务器,mdadm命令能够在Linux系统中创建和管理软件RAID磁盘阵列组,对于其中的理论知识和操作过程是与生产环境保持一致的~mdadm命令的常用参数包括有:

参数 作用
-a 检测设备名称
-n 指定设备数量
-l 指定raid级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止阵列

第1步:使用mdadm命令创建RAID10,名称为"/dev/md0"

第6章中讲到过udev是Linux系统内核中用来给硬件命名的服务,命名规则也非常的简单,可以猜测到第二个SCSI存储设备的名称会是为/dev/sdb,然后以此类推。使用硬盘设备做RAID磁盘阵列组很像几个同学组成一个班级,但班级的名称总不能叫做/dev/sdbsdcsddsde吧,这样虽然可以一眼看出是由那些元素组成的,但明显非常的不利于记忆和阅读吧,更何况如果是用10、50、100个硬盘组成的设备呢?因此需要用-C参数代表创建一个RAID阵列卡,-v参数来显示出创建的过程,同时就在后面追加一个设备名称,这样以后/dev/md0就是创建出RAID磁盘阵列组的名称啦,-a yes参数代表自动创建设备文件,-n 4参数代表使用4块硬盘来制作这个RAID磁盘阵列组,而-l 10参数则代表RAID10方案,最后面再加上4块硬盘设备的名称就搞定啦:

[root@linuxprobe ~]# 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 20954624K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

第2步:把制作好的RAID磁盘阵列组格式化为ext4格式:

[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477312 blocks
523865 blocks (5.00%) reserved for the super user
First data block=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: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

第3步:创建挂载点然后把存储设备进行挂载操作,挂载成功后可看到可用空间为40G:

[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# mount /dev/md0 /RAID
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 84K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/md0 40G 49M 38G 1% /RAID

第4步:查看/dev/md0磁盘阵列设备组详细信息,并把挂载信息写入到配置文件中永久生效:

[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue May 5 07:43:26 2017
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue May 5 07:46:59 2017
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : cc9a87d4:1e89e175:5383e1e8:a78ec62c
Events : 17
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
7.1.2 损坏磁盘阵列及修复

咱们在生产环境中部署RAID10磁盘阵列组目的就是为了提高存储设备的IO读写速度及数据的安全性,但因为这次是在本机电脑上模拟出来的硬盘设备所以对于读写速度的改善可能并不直观,因此刘遄老师决定给同学们讲解下RAID磁盘阵列组损坏后的处理方法,这样以后步入了运维岗位后不会因为突发事件而手忙脚乱。首先确认有一块物理硬盘设备出现损坏不能再继续正常使用后,应该使用mdadm命令来予以移除之后查看下RAID磁盘阵列组的状态已经被改变:

[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 08:11:00 2017
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 08:27:18 2017
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : f2993bbd:99c1eb63:bd61d4d4:3f06c3b0
Events : 21
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
0 8 16 - faulty /dev/sdb

因为RAID10级别的磁盘阵列组允许一组RAID1硬盘组中存在一个故障盘而不影响使用,所以同学们此时可以尝试下在/RAID目录中正常的创建或删除文件都是不受影响的。当购买了新的硬盘存储设备后再使用mdadm命令来予以恢复即可,但因为虚拟机模拟硬盘的原因需要重启后才把新的硬盘添加到RAID磁盘阵列组中。

[root@linuxprobe ~]# umount /RAID
[root@linuxprobe ~]# mdadm /dev/md0 -a /dev/sdb
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
 Version : 1.2
 Creation Time : Mon Jan 30 00:08:56 2017
 Raid Level : raid10
 Array Size : 41909248 (39.97 GiB 42.92 GB)
 Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
 Raid Devices : 4
 Total Devices : 4
 Persistence : Superblock is persistent
 Update Time : Mon Jan 30 00:19:53 2017
 State : clean 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
 Spare Devices : 0
 Layout : near=2
 Chunk Size : 512K
 Name : localhost.localdomain:0 (local to host localhost.localdomain)
 UUID : d3491c05:cfc81ca0:32489f04:716a2cf0
 Events : 56
 Number Major Minor RaidDevice State
 4 8 16 0 active sync /dev/sdb
 1 8 32 1 active sync /dev/sdc
 2 8 48 2 active sync /dev/sdd
 3 8 64 3 active sync /dev/sde
[root@linuxprobe ~]# mount -a
7.1.3 磁盘阵列组+备份盘

同学们有没有想到还有一种极端情况,RAID10最多允许损坏50%的硬盘设备,但如果同一组中的设备同时全部损坏也会导致数据丢失,换句话说,如果当RAID10磁盘阵列组中某一块硬盘出现了故障,而咱们正在前往修复它的路上,恰巧此时同RAID1组中的另一块硬盘设备也出现故障,那么数据就被彻底损坏了。哈哈,刘遄老师可不是乌鸦嘴,这种同时损坏的情况还真的在我的学生中出现过,那这样情况该怎么办呢?其实就可以使用RAID备份盘技术来预防这类事故,顾名思义就是准备一块足够大的硬盘,这块硬盘设备平时是闲置状态不用工作,一旦RAID磁盘阵列组中有硬盘出现故障后则会马上自动顶替上去,这样很棒吧!

为了避免多个实验之间产生冲突,咱们需要保证每个实验之间的相对独立性,因此请同学们自行还原下虚拟机到最初始状态吧。另外因为刚刚已经给同学们演示了RAID10磁盘阵列组的部署方法,所以现在换一个RAID5来看看效果吧,RAID5磁盘阵列组技术至少需要3块盘来做,加上1块备份盘,总共是需要向虚拟机中模拟4块硬盘设备,如前面图7-5所示。

第7章 使用RAID与LVM磁盘阵列技术。第7章 使用RAID与LVM磁盘阵列技术。

图7-5 为虚拟机系统模拟添加4块硬盘设备

咱们现在来创建一个RAID5磁盘阵列组+备份盘吧,-n 3参数代表创建这个RAID5所需的硬盘个数,-l 5参数代表RAID磁盘阵列的级别,而-x 1参数则代表有1块备份盘,当查看/dev/md0磁盘阵列组的时候就能看到有一块备份盘在等待中了。

[root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 20954624K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 09:20:35 2017
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 09:22:22 2017
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 44b1a152:3f1809d3:1d234916:4ac70481
Events : 18
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
3 8 64 - spare /dev/sde

把这块制作的RAID5磁盘阵列组格式化为ext4文件格式后挂载到目录上吧,这样就可以使用啦~

[root@linuxprobe ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477312 blocks
523865 blocks (5.00%) reserved for the super user
First data block=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: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@linuxprobe ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
[root@linuxprobe ~]# mkdir /RAID
[root@linuxprobe ~]# mount -a

最后就是见证奇迹的时刻啦,咱们再次把硬盘设备/dev/sdb移出磁盘阵列组,这样快速看下/dev/md0磁盘阵列组的状态就会发现备份盘已经被自动顶替上去,这是非常实用的,在RAID磁盘阵列组数据安全保证的基础上进一步提高数据可靠性,所以如果您的公司不差钱的话还是再买上一块备份盘以防万一吧。

[root@linuxprobe ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@linuxprobe ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 09:20:35 2017
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 09:23:51 2017
State : active, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 0% complete
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 44b1a152:3f1809d3:1d234916:4ac70481
Events : 21
Number Major Minor RaidDevice State
3 8 64 0 spare rebuilding /dev/sde
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

7.2 LVM逻辑卷管理器

咱们已经用了整整两个章节来逐步学习管理Linux系统中的硬盘和数据,还有一项非常普及的硬盘设备资源管理技术——LVM逻辑卷管理器(Logical Volume Manager)。在前面学习的硬盘设备管理技术虽然能够有效的提高存储设备的读写速度并能够很好的提高数据安全性,但似乎一旦把硬盘分区或RAID磁盘阵列组部署后再想修改空间大小就不容易啦。换句话说,当用户想要随着实际需求的变化不断对硬盘分区进行增大或减小等调整时经常会受到硬盘“灵活性”的限制,有时真的很不方便,而LVM逻辑卷管理器技术就是为了满足用户对硬盘资源动态调整的期望。

LVM逻辑卷管理器是一项理论性较强的技术,它是Linux系统中对硬盘分区进行管理的一种机制,开创这项技术的初衷是为了解决传统硬盘分区创建后不易更改其大小的弱点,对于传统硬盘分区进行强制扩容和缩小技术理论上虽然是可行的,但却有可能造成数据的丢失,LVM逻辑卷管理器技术能够把多块硬盘进行卷组合并,让用户不必关心设备底层的架构和布局,拿来即用。LVM逻辑卷管理器是在磁盘分区和文件系统之间添加的逻辑层,它提供了一个抽象的卷组,可以使得多块硬盘进行卷组合并,让用户不必关心物理硬盘设备的底层结构,从而实现对分区的灵活动态调整。

LVM逻辑卷管理器的技术结构如图7-6所示,刘遄老师来举个吃货的例子帮助同学们理解吧,比如家里想吃馒头但面粉不够了,妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,蒸出馒头后大家一起来吃,首先需要把这些面粉(物理卷PVPhysical Volume)合并成一个大面团(卷组VG,Volume Group),然后把这一大团面再分割成一个个小馒头(逻辑卷LVLogical Volume),每个小馒头的重量必须是每勺面粉(基本单元PEPhysical Extent)的倍数。物理卷是处于逻辑卷管理器中最底层的资源,可以理解成是物理硬盘、硬盘分区或者RAID磁盘阵列组都可以,而卷组是建立在物理卷之上的,一个卷组中可以包含多个物理卷,当然在卷组创建之后也可以继续向其中添加新的物理卷,而逻辑卷是建立于卷组之上的,把卷组中空闲的资源建立出新的逻辑卷,并且逻辑卷建立后可以动态的扩展或缩小空间,这也就是LVM逻辑卷管理器的核心理念。

逻辑卷

图7-6逻辑卷管理器的技术结构

7.2.1 部署逻辑卷

很多时候最初咱们都不能够精准的评估和分配每个硬盘分区以后的使用情况,有可能会随着业务量的增加导致数据库目录的体积也增加,也有可能需要分析用户行为而做记录导致日志目录的体积不断变大,或者有些较小概率还要对原先错误分配过大的分区进行精简,那么这些知识都属于这个章节的学习范畴。并且如刚刚提到过的,LVM逻辑卷管理器是对Linux系统中对存储资源进行管理的一种机制,部署LVM逻辑卷管理器需要依次对对物理卷、卷组和逻辑卷的逐个配置,常见的命令分别包括有:

功能/命令 物理卷管理 卷组管理 逻辑卷管理
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展 vgextend lvextend
缩小 vgreduce lvreduce

为避免实验之间互相冲突,请您自行还原虚拟机到最初始状态,并在虚拟机中添加两块新硬盘设备后开机,如图7-7所示:

图7-7 在虚拟机中添加一块新的硬盘设备

在虚拟机中添加两块新硬盘设备的目的是为了更好的向同学们演示LVM逻辑卷管理器对于让用户无需关心底层物理硬盘设备的特性,咱们将会对这两块新的硬盘先进行创建物理卷操作,可以简单理解成让硬盘设备支持了LVM技术,然后对两块硬盘进行卷组合并,卷组的名称可以由您来自定义,接下来是把合并后的卷组根据需求再切割出一个约为150M的逻辑卷设备,最后把这个逻辑卷设备格式化成ext4文件系统后挂载使用。现在知道大致的流程后就可以,刘遄老师还会对下面每一个步骤再做一些简单的描述。

第1步:让新添加的两块硬盘设备支持LVM逻辑卷管理器技术:

[root@linuxprobe ~]# pvcreate /dev/sdb /dev/sdc
 Physical volume "/dev/sdb" successfully created
 Physical volume "/dev/sdc" successfully created

第2步:把两块硬盘设备都加入到storage卷组中,然后查看下卷组的状态:

[root@linuxprobe ~]# vgcreate storage /dev/sdb /dev/sdc
 Volume group "storage" successfully created
[root@linuxprobe ~]# vgdisplay
--- Volume group ---
 VG Name storage
 System ID 
 Format lvm2
 Metadata Areas 2
 Metadata Sequence No 1
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 0
 Open LV 0
 Max PV 0
 Cur PV 2
 Act PV 2
 VG Size 39.99 GiB
 PE Size 4.00 MiB
 Total PE 10238
 Alloc PE / Size 0 / 0  Free PE / Size 10238 / 39.99 GiB
 VG UUID KUeAMF-qMLh-XjQy-ArUo-LCQI-YF0o-pScxm1
………………省略部分输出信息………………

第3步:切割出一个约为150M的逻辑卷设备:

同学们需要注意下切割单位的问题,在LVM逻辑卷管理器对LV逻辑卷的切割上面有两种计量单位,第一种是常见以-L参数来以容量单位为对象,例如使用-L 150M来生成一个大小为150M的逻辑卷,还可以使用-l参数来指定要使用PE基本单元的个数,默认每个PE的大小为4M,因此允许使用-l 37来生成一个大小为37*4M=148M的逻辑卷:

[root@linuxprobe ~]# lvcreate -n vo -l 37 storage
 Logical volume "vo" created
[root@linuxprobe ~]# lvdisplay 
 --- Logical volume ---
 LV Path /dev/storage/vo
 LV Name vo
 VG Name storage
 LV UUID D09HYI-BHBl-iXGr-X2n4-HEzo-FAQH-HRcM2I
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 01:22:54 -0500
 LV Status available
 # open 0
 LV Size 148.00 MiB
 Current LE 37
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:2
………………省略部分输出信息………………

第4步:把生成好的逻辑卷格式化后挂载使用:

Linux系统会把LVM逻辑卷管理器中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接,但读者们无需关心),同时会以卷组的名称来建立一个目录,其中保存有逻辑卷的设备映射文件(即/dev/卷组名称/逻辑卷名称)。

[root@linuxprobe ~]# mkfs.ext4 /dev/storage/vo 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks: 
 8193, 24577, 40961, 57345, 73729
Allocating group tables: done 
Writing inode tables: done 
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@linuxprobe ~]# mkdir /linuxprobe
[root@linuxprobe ~]# mount /dev/storage/vo /linuxprobe

第5步:查看挂载状态,并写入到配置文件永久生效:

[root@linuxprobe ~]# df -h
 Filesystem Size Used Avail Use% Mounted on
 /dev/mapper/rhel-root 18G 3.0G 15G 17% /
 devtmpfs 905M 0 905M 0% /dev
 tmpfs 914M 140K 914M 1% /dev/shm
 tmpfs 914M 8.8M 905M 1% /run
 tmpfs 914M 0 914M 0% /sys/fs/cgroup
 /dev/sr0 3.5G 3.5G 0 100% /media/cdrom
 /dev/sda1 497M 119M 379M 24% /boot
 /dev/mapper/storage-vo 145M 7.6M 138M 6% /linuxprobe
 [root@linuxprobe ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab
7.2.2 扩容逻辑卷

虽然卷组是由两块硬盘设备共同组成的,但用户使用存储资源时感知不到底层硬盘的结构,也不用关心底层是由多少块硬盘组成的,只要卷组中的资源足够就可以一直为逻辑卷扩容,扩展前请一定要记得卸载设备和挂载点的关联。

[root@linuxprobe ~]# umount /linuxprobe

第1步:把上个实验中的逻辑卷vo扩展至290M:

[root@linuxprobe ~]# lvextend -L 290M /dev/storage/vo
 Rounding size to boundary between physical extents: 292.00 MiB
 Extending logical volume vo to 292.00 MiB
 Logical volume vo successfully resized

第2步:检查磁盘完整性,重置硬盘容量:

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/38000 files (0.0% non-contiguous), 10453/151552 blocks
[root@linuxprobe ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
The filesystem on /dev/storage/vo is now 299008 blocks long.

第3步:重新挂载硬盘设备并查看挂载状态:

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/mapper/storage-vo 279M 2.1M 259M 1% /linuxprobe
7.2.3 缩小逻辑卷

相比于扩容逻辑卷来讲,对逻辑卷的缩小操作存在着更高丢失数据的风险,所以在生产环境中同学们一定要留心记得提前备份好数据,另外Linux系统规定对LVM逻辑卷的缩小操作需要先检查文件系统的完整性,当然这也是在保证咱们的数据安全,操作前记得先把文件系统卸载掉:

[root@linuxprobe ~]# umount /linuxprobe

第1步:检查文件系统的完整性:

[root@linuxprobe ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/74000 files (0.0% non-contiguous), 15507/299008 blocks

第2步:把LV逻辑卷的容量减小到120M:

[root@linuxprobe ~]# resize2fs /dev/storage/vo 120M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
The filesystem on /dev/storage/vo is now 122880 blocks long.
[root@linuxprobe ~]# lvreduce -L 120M /dev/storage/vo
 WARNING: Reducing active logical volume to 120.00 MiB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y
 Reducing logical volume vo to 120.00 MiB
 Logical volume vo successfully resized

第3步:把文件系统重新挂载并查看系统状态:

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/mapper/storage-vo 113M 1.6M 103M 2% /linuxprobe
7.2.4 逻辑卷快照

除此之外LVM逻辑卷管理器还具备有“快照卷”的功能,这项功能很类似于虚拟机软件的还原时间点功能。例如可以对某一个LV逻辑卷设备做一次快照,如果今后发现数据被改错了,咱们可以把之前做好的快照卷进行覆盖还原,LVM逻辑卷管理器的快照功能有两项特点,第一是快照卷的大小应该尽量等同于LV逻辑卷的容量,第二是快照功能仅一次有效,一旦被还原后则会被自动立即删除,首先应当查看下卷组的信息:

[root@linuxprobe ~]# vgdisplay
 --- Volume group ---
 VG Name storage
 System ID 
 Format lvm2
 Metadata Areas 2
 Metadata Sequence No 4
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 1
 Max PV 0
 Cur PV 2
 Act PV 2
 VG Size 39.99 GiB
 PE Size 4.00 MiB
 Total PE 10238
 Alloc PE / Size 30 / 120.00 MiB Free PE / Size 10208 / 39.88 GiB
 VG UUID CTaHAK-0TQv-Abdb-R83O-RU6V-YYkx-8o2R0e
………………省略部分输出信息………………

通过卷组的输出信息可以很清晰的看到卷组中已用120M,空闲资源有39.88G,接下来往逻辑卷设备所挂载的目录中用重定向写入一个文件吧:

[root@linuxprobe ~]# echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt
[root@linuxprobe ~]# ls -l /linuxprobe
total 14
drwx------. 2 root root 12288 Feb 1 07:18 lost+found
-rw-r--r--. 1 root root 26 Feb 1 07:38 readme.txt

第1步:使用-s参数来生成一个快照卷,使用-L参数来指定切割的大小,另外要记得在后面写上这个快照是针对那个LV逻辑卷设备做的。

[root@linuxprobe ~]#  lvcreate -L 120M -s -n SNAP /dev/storage/vo
 Logical volume "SNAP" created
[root@linuxprobe ~]# lvdisplay
--- Logical volume ---
 LV Path /dev/storage/SNAP
 LV Name SNAP
 VG Name storage
 LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 LV snapshot status active destination for vo
 LV Status available
 # open 0
 LV Size 120.00 MiB
 Current LE 30
 COW-table size 120.00 MiB
 COW-table LE 30
 Allocated to snapshot 0.01%
 Snapshot chunk size 4.00 KiB
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:3
………………省略部分输出信息………………

第2步:在LV设备卷所挂载的目录中创建一个100M的垃圾文件,这样再来看快照卷的状态就会发现使用率上升了:

[root@linuxprobe ~]# dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 3.35432 s, 31.3 MB/s
[root@linuxprobe ~]# lvdisplay
 --- Logical volume ---
 LV Path /dev/storage/SNAP
 LV Name SNAP
 VG Name storage
 LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 LV snapshot status active destination for vo
 LV Status available
 # open 0
 LV Size 120.00 MiB
 Current LE 30
 COW-table size 120.00 MiB
 COW-table LE 30
 Allocated to snapshot 83.71%
 Snapshot chunk size 4.00 KiB
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:3

第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照合并还原操作,在这之前记得先卸载掉逻辑卷设备与目录的挂载~

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP
 Merging of volume SNAP started.
 vo: Merged: 21.4%
 vo: Merged: 100.0%
 Merge of snapshot into logical volume vo has finished.
 Logical volume "SNAP" successfully removed

第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被快照后再创建出来的100M垃圾文件也被清除了:

[root@linuxprobe ~]# mount -a
[root@linuxprobe ~]# ls /linuxprobe/
lost+found readme.txt
7.2.5 删除逻辑卷

当生产环境中想要重新部署或者不需要再继续使用LVM逻辑卷管理器了,除了提前备份好重要数据信息,还必须依次删除LV逻辑卷、VG卷组后再移除PV物理卷设备,这样的顺序不可颠倒。

第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。

[root@linuxprobe ~]# umount /linuxprobe
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Feb 19 22:08:59 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=50591e35-d47a-4aeb-a0ca-1b4e8336d9b1 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/storage/vo /linuxprobe ext4 defaults 0 0

第2步:把LV逻辑卷设备删除,需要手工输入y来确认操作:

[root@linuxprobe ~]# lvremove /dev/storage/vo 
Do you really want to remove active logical volume vo? [y/n]: y
 Logical volume "vo" successfully removed

第3步:把VG卷组删除,此处只需写卷组名称即可,而无需设备完整绝对路径:

[root@linuxprobe ~]# vgremove storage
 Volume group "storage" successfully removed

第4步:把PV物理卷设备移除:

[root@linuxprobe ~]# pvremove /dev/sdb /dev/sdc
 Labels on physical volume "/dev/sdb" successfully wiped
 Labels on physical volume "/dev/sdc" successfully wiped

执行以上操作后同学们可以再分别执行下lvdisplay、vgdisplay、pvdisplay命令来查看逻辑卷管理器信息,操作正确则会不能再看到逻辑卷设备信息了。

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1:RAID磁盘阵列组技术主要是为了解决什么问题呢?

答案:RAID技术可以解决存储设备吞吐量及数据冗余备份的问题。

2:相比较来讲RAID0和RAID5,那个更安全?

答案:RAID0方案并没有数据冗余功能,因此RAID5更加安全。

3:4块硬盘做的RAID10方案+1块热备盘,最乐观的情况允许几块硬盘同时损坏呢?

答案:最乐观的情况允许5块硬盘设备中3块设备同时损坏。

4:LVM逻辑卷管理器中最底层的是PV物理卷还是VG卷组?

答案:最底层的是PV物理卷,然后通过PV物理卷组成的VG卷组。

5:LVM逻辑卷管理器中对LV逻辑卷的扩容和缩小操作上有何共同点和区别呢?

答案:扩容和缩小操作都需要先取消LV逻辑卷和目录的挂载关联,扩容操作是先扩容后检查文件系统完整性,但缩小操作为了保证数据安全是需要先检查文件系统完整性后再缩小。

6:LVM逻辑卷管理器中的快照卷能够使用几次?

答案:只可用一次,使用后即自动删除。

7:LVM逻辑卷管理器的删除操作顺序是怎么样的?

答案:依次移除LV逻辑卷、VG卷组和PV物理卷。