linux入门系列13--磁盘管理之RAID、LVM技术

前一篇文章学习了磁盘分区、格式化、挂载等相关知识,本文将讲解RAID和LVM技术。

磁盘管理操作主要是运维人员用的较多,如果只是单纯的开发人员,可以先略过本文。但是在很多小公司里往往都是一人多用,运维、开发通常都是同一个人,因此对个人的技能要求更高。即便不是如此,多了解下相关概念也是有利而无害的。

本文将先讲解RAID技术方案相关理论知识并通过案例演示RAID操作,然后演示LVM技术以解决存储资源动态调整问题。

一、独立冗余磁盘阵列(RAID)

RAID(Redundant Array of Independent Disk)技术把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,利用分散读写技术提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。

简单说就是通过RAID技术可以提升磁盘读写性能,同时可以冗余备份数据保证数据可靠性。但是性能和可靠性不可能同时满足的非常好,因此在二者之间作出权衡就产生了不同的RAID方案。

1.1 RAID方案及特点

据说目前RAID磁盘阵列的方案至少有十几种,然而万变不离其宗,都是在读写性能和可靠性之间权衡,因此只介绍几种比较有代表性的方案。

方案 特点
RAID0 磁盘读写性能高,但数据可靠性低
RAID1 磁盘设备利用率低,但数据可靠性高
RAID5 兼顾成本、读写性能和数据安全的折中方案
RAID10 相对于成本,更看重数据安全可靠
1.1.1 RAID0

把多块物理硬盘设备通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。

最理想情况下,磁盘读写性能将提高数倍,但如果其中任意一块磁盘损坏将导致整个系统数据被破坏。也就是说虽然RAID0有效提高磁盘数据的吞吐速度,但是不具备数据备份和错误修复能力。

其示意图如下:

linux入门系列13--磁盘管理之RAID、LVM技术

1.1.2 RAID1

如上所述,虽然RAID0提升了磁盘读写速度,但是由于它将数据依次写入各个磁盘中,把数据分开存储,如果其中一块磁盘发生故障将会导致整个系统数据损坏。因此如果对数据要求性要求较高,但对磁盘读写速度没有要求的话,这种方案就不合适,需要用到RAID1方案。

RAID1示意图如下:

linux入门系列13--磁盘管理之RAID、LVM技术

RAID1是把多块硬盘绑定,数据同时写入多块磁盘,这样就会有多份数据副本,当其中某一块硬盘发生故障后,立即自动以热交换的方式来恢复数据的正常使用。

虽然通过副本的形式保证了数据的安全性,但是磁盘设备利用率不高,从示意图可以看出,如果是2块磁盘则利用率只有50%,因此增加了成本开销。

1.1.3 RAID5

前面两种方案分别偏向于磁盘速度和数据安全,而RAID5则是在读写性能、数据安全和成本之间的一个相互妥协方案。

示意图如下:

linux入门系列13--磁盘管理之RAID、LVM技术

RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。这样的好处是其中任何一设备损坏后不至于出现致命缺陷,图中的parity部分存放的就是数据的奇偶校验信息。

简单说就是RAID5方案实际上没有备份硬盘中的真实数据信息(数据只有一份),而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。

这种方案兼顾了了硬盘设备的读写速度、数据安全性与存储成本问题。

1.1.4 RAID10

虽然RAID5看起来在成本问题、磁盘读写以及数据安全性有了一个相互妥协的方案,但实际上很多企业,尤其是金融企业数据本身的价值远比磁盘价格高,因此成本并不是第一考虑要素,在这种场景下,一般是采用RAID10技术。

RAID10方案实际就是把RAID0和RAID1两种方案进行组合而来,示意图如下:

linux入门系列13--磁盘管理之RAID、LVM技术

如图所示,需要至少4块硬盘来组建RAID10,先两两组合制作为RAID1确保数据有副本来保证安全性,然后在将组合后的两个RAID1采用RAID0进行组合,进一步提高设备的读写速度。

从理论上讲,只要同一组中的硬盘不全坏掉,那么最多可以损坏50%的硬盘设备而不丢失数据。

由于RAID10方案继承了RAID0的高读写速度和RAID1的数据安全性,在不考虑成本的情况下RAID10的性能都超过了RAID5,因此当前成 为广泛使用的一种存储技术。

说明:由于篇幅所限,其他的方案就不一一列出,需要说明的是应该按照实际需求去考虑成本、磁盘性能、数据安全性等因素,按需选择最合适需求场景的方案。

1.2 mdadm命令

通过上一篇文章“linux入门系列12--磁盘管理之分区、格式化与挂载”的讲解,已经学会了磁盘设备管理之后,再来部署RAID就会非常简单,因此如果还没掌握的话,建议先返回去看上一篇文章。

在正式操作RAID之前,我们先看一下在linux中RAID磁盘阵列的管理命令mdadm。

语法格式:

​ mdadm [模式参数] RAID名称 [选项] [成员磁盘列表]

参数选项:

参数 作用
-a 检查设备名称
-n 指定设备数量
-l level,指定 RAID 级别
-C 创建RAID
-v 显示详细过程
-f 模拟设备损坏
-r remove,移除设备
-D 查看详细信息

1.3 实例1-RAID10部署

1.3.1 环境准备

我们直接在虚拟机中模拟添加多块磁盘来演示RAID的操作,生产环境中采用的命令和步骤都是一致的。

为了避免实验之间的干扰,我们先克隆一台新的Centos虚拟机进行演示

linux入门系列13--磁盘管理之RAID、LVM技术

点击“克隆”后,弹出虚拟机向导

linux入门系列13--磁盘管理之RAID、LVM技术

点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

保存默认选择“虚拟机中的当前状态”,点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

选择“创建完整的克隆”,点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

按需修改虚拟机名称已经存放的位置,点击“完成”按钮

linux入门系列13--磁盘管理之RAID、LVM技术

等待克隆完成(根据不同机器的性能,克隆时间不同)

linux入门系列13--磁盘管理之RAID、LVM技术

这样新的虚拟机就准备好了。

1.3.2 创建RAID10

如前所述,RAID10至少需要4块磁盘,因此我们先添加4块磁盘。

(1)添加磁盘

选择刚才克隆的虚拟机,点击“编辑虚拟机设置”

linux入门系列13--磁盘管理之RAID、LVM技术

在弹出的“虚拟机设置”窗口中,点击“添加”

linux入门系列13--磁盘管理之RAID、LVM技术

在弹出的“添加硬件向导”中选择“硬盘”,然后点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

磁盘类型保存默认“SCSI”,点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

磁盘类型保持默认的“创建新虚拟机磁盘”,点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

根据需要设置磁盘大小,此处设置为1G,点击“下一步”

linux入门系列13--磁盘管理之RAID、LVM技术

选择磁盘文件存放路径,点击“完成”按钮

linux入门系列13--磁盘管理之RAID、LVM技术

即可看到刚才添加的一块磁盘已经成功。

linux入门系列13--磁盘管理之RAID、LVM技术

在上边界面中点击“添加”按钮,用相同的方法再添加3块磁盘,总共新添加4块磁盘。

linux入门系列13--磁盘管理之RAID、LVM技术

(2)创建RAID10磁盘阵列

启动刚才添加磁盘的虚拟机,并用之前讲解的lsblk或fdisk查看磁盘设备

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sdd               8:48   0    1G  0 disk 
sde               8:64   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# fdisk -l
Disk /dev/sde: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...省略部分内容
[root@origin ~]# 

可以看到刚才添加的磁盘:sdb、sdc、sdd、sde,设备名称名称分别为:/dev/sdb,/dev/sdc,/dev/sdd,/dev/sde

接下来用mdadm命令创建RAID10

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

C参数代表创建一个RAID阵列卡;-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID 磁盘阵列的名称;-a yes 参数代表自动创建设备文件;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID10方案。

创建磁盘阵列成功之后,下一步就是格式化

1.3.3 格式化RAID

用mkfs命令格式化RAID磁盘阵列

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
1.3.4 挂载磁盘阵列

创建目录并挂载磁盘阵列

[root@origin ~]# mkdir /raid
[root@origin ~]# mount /dev/md0 /raid
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 

咦,细心的朋友可能就有疑问了,甚至开始怀疑是不是自己操作错了,前面明明添加了4块磁盘,每个磁盘为1G,总量应该为4G,但此处却看到/dev/md0大小为2G?

是的,你没看错,根据前面讲解的RAID10方案,容量会减少。此处可以看到4块磁盘的情况下,可用容量会减少一半。

我们还需要把挂载信息写入到配置文件中,使其永久生效

[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0">>/etc/fstab
[root@origin ~]# cat /etc/fstab 
...省略部分内容
/dev/md0 /raid ext4 defaults 0 0
[root@origin ~]# 

这样就把磁盘阵列挂载到了raid目录。

1.3.5 查看磁盘阵列信息

查看磁盘阵列信息

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    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@origin ~]#

可以看到4块磁盘阵列中的4块磁盘均已正常工作。

至此,RAID10方案部署完成。由此可见,整个操作流程给添加硬盘一致,都是需要创建、格式化、挂载等步骤,非常简单。

1.4 实例2-修复RAID10中坏掉的磁盘

此实验模拟刚才的磁盘阵列中某块硬盘坏掉后的替换操作,因此在前边的环境中继续执行以下操作。

1.4.1 模拟设备损坏

使用mdadm命令的-f参数模拟设备损坏

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    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
[root@origin ~]#

在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,使用mdadm命令将其移除,然后查看RAID磁盘阵列的状态,发现/dev/sdb磁盘的状态已经改变。

在RAID10级别的磁盘阵列中,当RAID1磁盘阵列中存在一个故障盘时并不影响RAID10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令来予以替换即可,在此期间我们可以在/RAID目录中正常地创建或删除文件。

由于我们是在虚拟机中模拟的,为了更真实,先重启系统,之后再继续后边的操作。

重启之后发现损坏的盘已经不再磁盘阵列中了

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    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
[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
sda               8:0    0   20G  0 disk   
├─sda1            8:1    0  500M  0 part   /boot
└─sda2            8:2    0 19.5G  0 part   
  ├─centos-swap 253:0    0    2G  0 lvm    [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm    /
sdb               8:16   0    1G  0 disk   
sdc               8:32   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sdd               8:48   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sde               8:64   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sr0              11:0    1  3.9G  0 rom  
1.4.2 取消磁盘阵列目录挂载
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# umount /raid/
[root@origin ~]# df -h        
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# 

添加磁盘,需要先取消挂载

1.4.3 添加磁盘并加入磁盘阵列

取消挂载之后,我们再用mdadm命令的-a参数添加磁盘

[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    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@origin ~]# 

可以看到/dev/sdb设备加入磁盘阵列成功

1.4.4 重新挂载磁盘阵列
[root@origin ~]# mount -a
[root@origin ~]# df -h   
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid

可以看到磁盘阵列/dev/md0又成功挂载到/raid目录了。

由于之前/etc/fstab文件以及添加了记录,因此此处就无须再添加了。

至此就模拟出设备坏掉之后,重新用新磁盘修复的过程。

1.5 实例3-RAID5+备份盘方案

按上边的RAID10部署方案,最多允许 50%的硬盘设备发生故障。同一组中的磁盘只要不全坏都可以正常工作,但是在极端情况下如果同一个RAID1中的磁盘设备全部损坏,也会导致数据丢失。这种情况我们采用采用多加一块备份盘来解决,这块硬盘平时处于闲置状态,一旦RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。

同样为了避免干扰,重新克隆一个虚拟机,并采用RAID5方案来进行演示。

采用RAID5并没有什么特别之处,目的只是为了演示下RAID5的用法,因为前面示例1和2都是用的RAID10。

由于RAID5至少需要3块磁盘,另外此方案还需要一块备份盘,因此在虚拟机中克隆新机器后,添加4块硬盘。

1.5.1 创建RAID5

采用mdadm命令创建RAID5

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

参数-n 3代表创建这个RAID5磁盘阵列所需的硬盘数,参数-l 5代表RAID的级别,而参数-x 1则代表有一块备份盘。

[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分内容
    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

查看/dev/md0磁盘阵列看到有一块备份盘在等待中了(spare)。

1.5.2 格式RAID5磁盘阵列

用mkfs命令将磁盘阵列格式化为ext4文件格式

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 

1.5.3 挂载磁盘阵列到目录
[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]# mkdir /raid
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分内容
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 
1.5.4 模拟磁盘损坏

我们再次模拟把硬盘设备/dev/sdb 移出磁盘阵列

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]# 

迅速查看/dev/md0 磁盘阵列的状态,发现备份盘/dev/sde已经被自动顶替上去并开始了数据同步。

1.5.5 恢复损坏的磁盘

真实场景下,我们要保证随时有一块空闲的备份盘以防不测,因此需要替换或修复刚才坏掉的盘/dev/sdb,恢复后它又自动变为空闲的备份盘,一旦有设备坏掉又会自动顶上去,从而保证数据的安全性。

由于我们上边一个步骤是模拟的/dev/sdb设备坏点,虽然坏了但是还是在占用中,因此重启虚拟机(重启后发现/dev/sdb就没有了,不重启会提示/dev/sdd设备繁忙无法成功执行以下步骤),然后执行以下操作:

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
[root@origin ~]# umount /raid/
[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分内容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       5       8       16        -      spare   /dev/sdb
[root@origin ~]# 

可以看到,添加后/dev/sdb设备又自动变为备份盘了。这样就保证了数据的安全。

二、逻辑卷管理器(LVM)

前面讲解的用RAID磁盘阵列技术来管理磁盘设备,虽然能有效提供磁盘设备的读写性能以及数据的安全性,但是硬盘设备分区或部署RAID磁盘阵列后,硬盘分区大小就难以调整,而LVM(逻辑卷管理器)技术可以允许用户对硬盘资源进行动态调整。

2.1 LVM概述

LVM(Logical Volume Manager)是Linux系统用于对硬盘分区进行管理的一种机制,创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。

尽管对传统的硬盘分区进 行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。

LVM架构图如下:

linux入门系列13--磁盘管理之RAID、LVM技术

LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。

物理卷处于LVM中的最底层,可以理解为物理硬盘、硬盘分区或者RAID磁盘阵列。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。

在生产环境中无法精确地评估每个硬盘分区在日后的使用情况,因此会导致 原先分配的硬盘分区不够用。随着业务的增加磁盘不够用了需要扩容,或者业务缩减我们需要对磁盘分区进行精简缩容等等,这些都可以通过LVM来解决。

部署LVM时,需要逐个配置物理卷、卷组和逻辑卷。常用命令如下:

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

2.2 案例实操

为了避免干扰,重新克隆一个虚拟机,并添加2块磁盘(添加2块的目的是为了演示将磁盘添加到LVM的卷组中,实际情况可能会有更多的磁盘)。

大概步骤为:先对这两块新硬盘进行创建物理卷的操作,然后对这两块硬盘进行卷组合并,接下来根据需求把合并后的卷组切割出一个约为 150MB 的逻辑卷设备,最后把这个逻辑卷设备格式化成 EXT4 文件系统后挂载使用。

2.2.1 部署LVM

(1)让磁盘设备支持LVM

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@origin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  PV /dev/sdb                       lvm2 [1.00 GiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
[root@origin ~]#

查看刚才新家的2块设备为:sdb、sdc。将其创建物理卷,并通过pvscan命令查看以创建物理卷。

(2)磁盘设备加入卷组

[root@origin ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               EKcctk-C1nM-Y2W8-s7pS-1bq8-W9ie-UTJM8Z
...省略部分内容
[root@origin ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "storage" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@origin ~]# 

用vgcreate创建名称为storage的卷组,并通过vgdisplay或vgscan可以查看。

(3)创建逻辑卷

切割出一个约为 150MB 的逻辑卷设备。这里需要注意切割单位的问题,在对逻辑卷进行切割时有两种计量单位。第一种是以容 量为单位,所使用的参数为-L。例如,使用-L 150M生成一个大小为 150MB 的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为 4MB。例如,使用-l 37 可以生成一个大小为 37×4MB=148MB 的逻辑卷。

[root@origin ~]# lvcreate -n vo -l 37 storage
  Logical volume "vo" created
[root@origin ~]# lvscan 
  ACTIVE            '/dev/storage/vo' [148.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [17.51 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  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
...省略部分内容
[root@origin ~]# 

通过lvcreate创建名称为vo的逻辑卷后,通过lvdisplay可以查看/dev/storage/vo大小为刚设置的148M(LV Size 148.00 MiB)。

(4)格式化逻辑卷并挂载

[root@origin ~]# 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@origin ~]# mkdir /lvm
[root@origin ~]# mount /dev/storage/vo /lvm
[root@origin ~]# echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]#

格式化逻辑卷后挂载到lvm目录,并把挂载信息写入fstab文件使其开机自动生效。

(5)查看挂载状态

[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   140M  1.6M  128M   2% /lvm
[root@origin ~]# echo "test">/lvm/test.txt
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

通过df命令就可以查看挂载成功,并可以成功写入文件到lvm目录下。

2.2.2 LVM扩容

上一步创建的容量为148M,下面将演示将其扩展到300M

(1)卸载设备与挂载点的关联

[root@origin ~]# umount /lvm
[root@origin ~]#

(2)扩展逻辑卷

把上一个实验中的逻辑卷 vo 扩展至 300MB

[root@origin ~]# lvextend -L 300M /dev/storage/vo
  Extending logical volume vo to 300.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                300.00 MiB
 ...省略部分内容

可以看到扩展后/dev/storage/vo逻辑卷大小为300M。

(3)检查硬盘完整性并重置硬盘容量

[root@origin ~]# 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: 12/38000 files (0.0% non-contiguous), 10455/151552 blocks
[root@origin ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 blocks long.
[root@origin ~]# 

(4)重新挂载设备

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   287M  2.1M  266M   1% /lvm
[root@origin ~]# 

可以看到扩容后,lvm目录的大小为300M(上图实际显示为287M)。

这样就完成了逻辑卷的扩容。

2.2.3 LVM缩小容

相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大,所以在生产环境中一定要提前备份数据。

为了保证数据安全性,Linux系统规定,在对LVM逻辑卷进行缩容操作之前,要先检查文件系统的完整性。

上一步扩容后lvm容量为300M,本次演示将其缩容到100M,步骤如下:

(1)卸载文件系统

[root@origin ~]# umount /lvm
[root@origin ~]# 

(2)检查文件系统完整性

[root@origin ~]#  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: 12/76000 files (0.0% non-contiguous), 15761/307200 blocks
[root@origin ~]# 

(3)缩容逻辑卷

把逻辑卷 vo 的容量减小到 100MB

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

(4)重新挂载文件系统

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo    93M  1.6M   85M   2% /lvm
[root@origin ~]# 

可以看到lvm目录已经缩小到93M,这样就完成了逻辑卷的缩容操作。

2.2.4 LVM快照功能

逻辑卷快照功能就类似于还原操作系统,可以将逻辑卷状态还原到指定时间点。

LVM快照功能有2个特点:快照卷只能使用一次,一旦执行还原操作后立即自动删除;快照卷的容量必须等同于逻辑卷的容量防止数据丢失。

(1)查看当前卷组信息

[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       485 / 1.89 GiB
  ...省略部分内容

可以看到卷组中已经使用了100M,空闲容量还有1.89G。(Alloc PE / Size 25 / 100.00 MiB, Free PE / Size 485 / 1.89 GiB)

(2)生成快照卷

[root@origin ~]# lvcreate -L 100M -s -n SNAP /dev/storage/vo
  Logical volume "SNAP" created
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV snapshot status     source of
                         SNAP [active]
  LV Status              available
  '#' open                 1
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  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
 ...省略部分内容

通过lvcreate命令生成一个名为SNAP的快照逻辑卷。此时逻辑卷的存储空间占用量为0.01%。(Allocated to snapshot 0.01%)

(3)逻辑卷中添加文件,查看快照卷空间使用量

[root@origin ~]# dd if=/dev/zero of=/lvm/files count=1 bs=50M
1+0 records in
1+0 records out
52428800 bytes (52 MB) copied, 0.289668 s, 181 MB/s
[root@origin ~]# ls /lvm/
files  lost+found  test.txt
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分内容
/dev/mapper/storage-vo    93M   52M   35M  61% /lvm
[root@origin ~]# lvdisplay 
...省略部分内容
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  50.29%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
...省略部分内容

在逻辑卷所挂载的目录中创建一个50MB 的垃圾文件,然后再查看快照卷/dev/storage/SNAP和逻辑卷/dev/storage/vo的状态。可以发现存储空间的占用量都上升了,快照卷占用量为:Allocated to snapshot 50.29%。

(4)通过快照卷还原逻辑卷

通过刚才创建的/dev/storage/SNAP快照卷,还原逻辑卷/dev/storage/vo的状态。

还原之前先取消目录挂载

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

可以看到还原逻辑卷后,快照卷自动删除了,通过lvdisplay命令查看也不会再有/dev/storage/SNAP 。

(5)重新挂载逻辑卷并查看文件

[root@origin ~]# mount -a
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

可以看到,还原之后刚才创建files文件不见了,这样就把逻辑卷还原到了创建快照时的状态。

2.2.5 删除逻辑卷

当生产环境中想要重新部署LVM或者不再需要使用 LVM 时,可以删除LVM。

需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,顺序不可颠倒。

(1)取消挂载

[root@origin ~]# umount /lvm/

取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数,找到之前添加在/etc/fstab文件中的一行“/dev/storage/vo /lvm ext4 defaults 0 0”并删除。

(2)删除逻辑卷

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

(3)删除卷组

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

只写卷组名称即可,不需要设备的绝对路径。

(4)删除物理卷

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

在上述操作执行完毕之后,再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信 息时就不会再看到信息了,说明删除成功。

通过上文和本文的演示,基本掌握了centos7下磁盘管理相关操作,如果非运维人员不一定要掌握的非常深刻,理解即可。

本文讲了很多磁盘相关的命令,需要多敲几篇自然就熟悉了。下一篇文章再补充讲解下SSH服务相关的知识,然后就开始讲解应用服务的部署和使用了(如apache、邮件系统、mysql、动态网站部署等)。

上一篇:Spring Boot后端与Angular前端进行timestamp的交互


下一篇:Mybatis3中@SelectProvider传递参数