一、背景
Linux运维过程中大家有没有想过生产环境服务器磁盘分区如果数据量越来越膨胀(这些都是重要数据,不能删除),那么此时如何来应对这个问题呢? 既要不影响正在运行的程序,同时也不能中断关机等操作。
这么一想就很蛋疼了。假设你运行的是kafka或者mysql数据库、或者其他有状态的服务,由于之前规划存在问题或者突然情况,导致数据增长速率超过你的预期,就会出现需要分区需要扩容的情况了。
LVM逻辑卷的机制是其中一种可以满足在线热扩容、对应用程序无关、安全的磁盘管理机制,也许可以满足你的需求。LVM(逻辑卷管理)是一种灵活的存储管理技术,允许用户将一个或多个物理硬盘的分区组合起来,形成一个物理卷集合,从而可以更灵活地管理和分配磁盘空间。
说白了就是,应用层只管对接抽象的数据结构,无须关心底层实现,底层实际容量变动对上层无感。 接下来让我们一起来看看,LVM逻辑卷该如何使用.
为了实现分区动态扩容机制,前期进行分区选型的时候,要根据情况判断,是否需要使用LVM方式划分分区方便后面应对动态扩容的需求,普通分区方式直接挂载,无法做到动态扩容。
二、LVM的整体实现原理
1、基本术语
-
PE(Physical Extent):物理扩展单元
- 定义:PE 是 LVM 中的基本分配单位,它是组成卷组(VG)的基本单元。
- 大小:PE 的大小通常是 4MB,默认情况下是固定的,但可以根据需要进行配置。
- 作用:PE 是物理卷(PV)上分配给逻辑卷(LV)的最小单位,逻辑卷由多个 PE 组成。
-
PV(Physical Volume):物理卷
- 定义:PV 是指用来创建卷组的一个或多个磁盘分区或整个磁盘。
- 作用:PV 是 LVM 的基础,它包含了用于 LVM 的存储空间。物理卷可以是硬盘上的一个分区或整个磁盘。
- 创建 :使用
pvcreate
命令将一个或多个磁盘分区或整个磁盘转换为物理卷。
-
VG(Volume Group):卷组
- 定义:VG 是由一个或多个物理卷组成的集合,它提供了一个可以划分成多个逻辑卷的空间池。
- 作用:VG 是 LVM 中的逻辑容器,它将多个物理卷组合在一起,提供了一个统一的存储池,可以在其中创建逻辑卷。
- 创建 :使用
vgcreate
命令创建卷组,并指定一个或多个物理卷作为成员。
-
LV(Logical Volume):逻辑卷
- 定义:LV 是在卷组内部定义的一个存储区域,它可以动态地调整大小,并且独立于底层物理存储设备。
- 作用:LV 类似于传统的文件系统,但是提供了更多的灵活性和可扩展性。逻辑卷可以跨越多个物理卷。
- 创建 :使用
lvcreate
命令创建逻辑卷,并指定卷组和大小。
2、关系图(PV、VG、LV、PE)
PV作为物理存储层,组成为VG抽象资源池,LV从VG中按需申请获取存储容量,不够则继续可以从VG中申请扩容,底层如何扩容,PV之间如果组织存储等等,应用层LV不需要关心、上层对下层变动无感、透明。
如果后期需要扩容,只需要继续往VG里面添加PV,VG存在足够容量,LV就能继续从VG资源池中拿到存储容量。从而实现,分区实时在线动态热扩容的目的。 再也不怕磁盘空间不足的问题了。
三、扩容实操
1、创建PV
存在一个空白的硬盘: /dev/sdb, 直接使用这个/dev/sdb全部转换为一个PV(切割PE的过程).
bash
pvcreate /dev/sdb
2、创建VG且添加PV
创建VG名称为: my-vg, 并且将/dev/sdb这个PV加入到VG资源池:
bash
vgcreate my-vg /dev/sdb
3、创建LV,从VG获取存储容量
创建LV名称为: my-lv, 并且从my-vg申请10G的存储空间.
bash
lvcreare -n my-lv -L 10G my-vg
4、格式化LV,创建文件系统
针对my-lv创建文件系统,文件系统类型是xfs.
bash
mkfs.xfs /dev/my-vg/my-lv
5、挂载LV卷到目录挂载点,实现文件写入/读取
挂载: mount /dev/my-vg/my-lv /data/, 测试写文件、读文件完全没问题.
bash
mount /dev/my-vg/my-lv /data/
6、扩容LV卷大小,实现动态扩容
假设此时我们的10G存储不够了,那么可以实现实时动态无感扩容,对上层进程无感扩容,不影响业务程序和服务。
1、LV扩容的前提那肯定是看VG资源池是否充足对吧, 巧妇难为无米之炊, VG没容量肯定申请不下来。
2、执行lvextend扩容命令: lvextend -L +8G /dev/my-vg/my-lv
bash
lvextend -L +10G /dev/my-vg/my-lv
3、扩容成功后,df -h /data/ 查看容量还是10G而不是18G? 先不慌, 虽然LV扩容了,但是之前创建的文件系统是针对10G的LV当时识别的。 需要重新识别的过程
bash
xfs_growfs /data/ #重新识别文件系统
最后df -h /data/查看,发现容量已经扩容为18G.
四、Centos7操作系统默认分区形式是LVM
安装Centos7操作系统,如果选择默认分区则就是使用LVM管理硬盘的.
查看操作系统的挂载情况和磁盘情况:
可以发现 / 根分区, 挂载的是一个LV不是普通分区。 这样我们的/分区可以动态扩容,只要再插入一台硬盘,将硬盘制作为PV, PV加入到这个VG, LV再从VG申请容量就可以完成/分区扩容的目的。 很方便,再也不怕/分区满了.
五、总结
1、涉及到的相关命令
1、PV
创建PV: pvcreate 例子: pvcreate /dev/sdb /dev/sdc
删除PV: pvremove
查看PV: pvs、pvdisplay(更加详细的信息)
2、VG
创建VG: vgcreate 例子: vgcreare myvg /dev/sdb /dev/sdc
删除VG: vgremove
查看VG: vgs、vgdisplay(更加详细的信息)
3、LV
创建LV: lvcreate 例子: lvcreate -n mylv -L 2G myvg
删除LV: lvremove
查看LV: lvs、lvdisplay(更加详细的信息)
扩容: lvextend 例子: lvextend -L +10G /dev/myvg/mylv
4、更新文件系统扩容信息
针对 EXT2、EXT3、EXT4文件系统类型: resize2fs /dev/myvg/mylv
针对XFS文件系统类型: xfs_growfs /data/
创建文件系统: mkfs.xfs /dev/myvg/mylv
2、LVM相关总结
记住一个原则就是,这种动态扩容存储相关的,大部分的核心思想就是将上层依赖的东西,依赖于一个抽象层而非实际存储层,因为依赖抽象层以后,抽象层可以不动,底层无论怎么变都是无感、透明的,这样扩展性强。 我的容量不够直接每次都加硬盘(PV)即可,我的容量可以一直扩下去。
包括像K8S的PV、PVC这些存储机制,大家想想是不是有异曲同工之妙。 后端PV存储类型、容量大小都不需要关心, 应用只需要申请PVC, 拿到存储空间就行,我管你后端是NFS还是Ceph、还是其它存储方式,我应用层能用就行,这个不归应用层管,对应用层透明的。