【运维实战】一文搞懂 Linux 卷管理:从 10 岁小孩能听懂的 LVM 原理到生产级云原生实践与快照备份演练

在现代企业级 Linux 运维与云原生架构中,LVM(Logical Volume Manager,逻辑卷管理) 是存储管理的核心技术之一。无论是搭建私有云(OpenStack / KVM)、管理公有云服务器,还是进行核心数据库的在线无感备份,LVM 都发挥着不可替代的作用。

本文将从最通俗易懂的日常比喻切入,逐步深入到企业云平台架构设计,并提供一套完全符合生产规范的 MySQL 数据库 LVM 快照在线备份与恢复演练方案。


一、 10 岁小孩也能听懂的 LVM 核心概念

如果我们把电脑里的文件和数据比作各种各样的玩具,传统的硬盘管理就像是一个固定大小的木盒子;而 LVM 则是一个神奇的积木融合与再切割系统。

+-------------------------------------------------------------+
|                  物理卷 Physical Volume (PV)                 |
|      [ 硬盘 A (/dev/sdb) ]        [ 硬盘 B (/dev/sdc) ]     |
+------------------------------+------------------------------+
                               | (加入)
                               v
+-------------------------------------------------------------+
|                    卷组 Volume Group (VG)                   |
|                  [ 统一的大资源池 / 存储池 ]                  |
+------------------------------+------------------------------+
                               | (切割划分)
                               v
+-------------------------------------------------------------+
|                  逻辑卷 Logical Volume (LV)                  |
|     [ 数据库 LV (/dev/vg/lv_db) ]   [ 业务 LV (/dev/vg/lv_app) ]|
+-------------------------------------------------------------+

1. 物理卷(Physical Volume,PV):实体大积木

  • 概念:这就是你从商店买回来的真实物理硬盘(如 /dev/sdb、/dev/sdc)或 RAID 阵列分区。它是看得见、摸得着的物理存储设备。

2. 卷组(Volume Group,VG):大融炉 / 存储资源池

  • 概念:把好几块“实体大积木”(PV)融合成一块超大号的存储池,这就是卷组。它抹平了不同物理硬盘的界限,把原本分散的容量整合到了一个统一的大池子里。

3. 逻辑卷(Logical Volume,LV):按需定制的小盒子

  • 概念:有了大资源池(VG)后,你可以根据业务需求,从池子里“切出”任意大小的虚拟硬盘(LV)。例如切出 80GB 给数据库,切出 50GB 给日志系统。对操作系统来说,逻辑卷用起来和普通物理硬盘没有任何区别。

二、 企业上云(OpenStack / 云服务器)的 LVM 最佳实践

在企业私有云(OpenStack / KVM)或日常云服务器的维护中,使用 LVM 的核心逻辑是自动化与解耦。

场景一:OpenStack 存储节点(Cinder Driver)

在 OpenStack 架构中,Cinder LVM Driver 是最典型的存储实现方式之一:

  1. 架构逻辑:

    • 物理盘/存储阵列 $
      ightarrow$ 初始化为 PV (/dev/sdb, /dev/sdc…)
    • 所有 PV 组合成名为 cinder-volumes 的专用 VG。
    • 用户在 OpenStack 控制台点击“创建 50G 云硬盘”时,Cinder 服务会自动在 cinder-volumes VG 中创建一个 50G 的 LV。
    • 通过 iSCSI / NVMe-oF 等协议将该 LV 挂载给虚拟机的云服务器使用。
  2. 存储节点初始化(管理员操作):

    # 1. 初始化物理卷
    pvcreate /dev/sdb /dev/sdc
    
    # 2. 创建 OpenStack Cinder 专有卷组
    vgcreate cinder-volumes /dev/sdb /dev/sdc
    

场景二:云服务器内部(VM OS)存储初始化

当云平台交付一台云服务器给业务团队后,强烈建议在 OS 内部使用 LVM 管理磁盘,为后续无缝扩容打下基础。

假设云平台为 VM 分配了一块 100GB 的额外云硬盘(设备名 /dev/vdb):

# 1. 将新云硬盘初始化为 PV
pvcreate /dev/vdb

# 2. 创建业务专用卷组(如 datavg)
vgcreate datavg /dev/vdb

# 3. 划出 80GB 给数据库逻辑卷 (db_lv)
lvcreate -L 80G -n db_lv datavg

# 4. 格式化为现代文件系统(强烈推荐 XFS)
mkfs.xfs /dev/datavg/db_lv

# 5. 持久化挂载配置 (写入 /etc/fstab)
mkdir -p /data/mysql
echo '/dev/datavg/db_lv /data/mysql xfs defaults 0 0' >> /etc/fstab
mount -a

场景三:业务无感在线扩容(核心优势)

当云服务器的磁盘容量告警时,可采取以下无感扩容方案(无需停机、无需 umount):

方案:直接在云平台拉大原云硬盘(最推荐)
# 1. 在云平台控制台将 /dev/vdb 从 100GB 扩容至 200GB
# 2. 在 VM 内部刷新设备容量并调整 PV 大小
echo 1 > /sys/class/block/vdb/device/rescan
pvresize /dev/vdb

# 3. 扩展 LV 及上层文件系统(使用 -r 参数一步到位)
lvextend -r -l +100%FREE /dev/datavg/db_lv

企业级 LVM 运维规约(Best Practices)

维度最佳实践建议原因 / 避坑说明
文件系统选择优先选择 XFS 或 EXT4XFS 具备优秀的并发性能与在线扩容能力(xfs_growfs)。注意:XFS 仅支持扩容,不支持在线缩容。
扩容命令统一使用 lvextend -r带 -r (--resizefs) 参数会自动联动扩展上层文件系统,避免漏做文件系统调整。
命名规范遵循统一的前缀命名VG 命名为 vg_<业务名>(如 vg_data),LV 命名为 lv_<应用名>(如 lv_mysql)。
容量预留VG 内时刻预留 15%~20% 自由空间必须留有缓冲空间,用于紧急扩容或创建临时 LVM 快照。

三、 生产环境 LVM 快照(Snapshot)在线备份与恢复演练

LVM 快照利用 写时复制(Copy-On-Write, COW) 机制,可以在毫秒级内冻结数据状态。配合数据库锁表,可实现零停机、微秒级锁表的物理备份。


1. 演练环境配置

  • 系统:Rocky Linux / CentOS
  • 数据目录:/data/mysql(挂载在逻辑卷 /dev/datavg/lv_mysql)
  • 文件系统:XFS
  • VG 空间:datavg 中留有至少 20G 未分配空间

2. 第一阶段:生产备份演练(Snapshot & Backup)

步骤 1:数据库刷盘与加锁
# 终端 Session 1:登录 MySQL 执行刷盘和全局读锁(保持会话不要关闭)
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK; SET GLOBAL innodb_fast_shutdown = 0;"
步骤 2:秒级创建 LVM 快照
# 终端 Session 2:创建名为 lv_mysql_snap 的快照卷(分配 20G COW 空间)
lvcreate -L 20G -s -n lv_mysql_snap /dev/datavg/lv_mysql
步骤 3:立即解锁数据库
# 回到终端 Session 1:释放读锁,恢复业务写入(全过程锁表时间 < 1s)
UNLOCK TABLES;
步骤 4:挂载快照并导出备份文件
# 1. 创建临时挂载点
mkdir -p /mnt/snapshot

# 2. 只读挂载快照(XFS 必须使用 -o nouuid 绕过重复 UUID 检查)
mount -o ro,nouuid /dev/datavg/lv_mysql_snap /mnt/snapshot

# 3. 将快照中的数据文件归档压缩
tar -czvf /backup/mysql_backup_$(date +%F).tar.gz -C /mnt/snapshot .

# 4. 备份完成后,立即卸载并删除快照(非常关键!)
umount /mnt/snapshot
lvremove -f /dev/datavg/lv_mysql_snap

⚠️ 生产警告:快照卷绝不能长期保留!快照会持续消耗 COW 空间,一旦写满会导致快照崩溃并严重影响原卷性能。备份完成后必须立即删除。


3. 第二阶段:生产灾难恢复演练(Recovery / Rollback)

方案 A:快照未删除时的“秒级回滚”(lvconvert --merge)

若误操作发生时快照尚未删除,可直接合并快照实现秒级还原:

  1. 停止数据库服务:
    systemctl stop mysqld
    
  2. 卸载原逻辑卷:
    umount /data/mysql
    
  3. 执行合并操作:
    lvconvert --merge /dev/datavg/lv_mysql_snap
    
    注:合并完成后快照卷会自动消失,原卷重组还原至拍快照时的状态。
  4. 重新挂载并启动服务:
    mount /dev/datavg/lv_mysql /data/mysql
    systemctl start mysqld
    

方案 B:利用异地归档备份包恢复

若快照已卸载删除,可利用打包好的物理备份文件还原:

# 1. 停止数据库服务
systemctl stop mysqld

# 2. 隔离故障数据目录
mv /data/mysql /data/mysql_corrupted_$(date +%Y%m%d)
mkdir -p /data/mysql

# 3. 解压备份包到数据目录
tar -xzvf /backup/mysql_backup_YYYY-MM-DD.tar.gz -C /data/mysql/

# 4. 修复权限并启动数据库
chown -R mysql:mysql /data/mysql
systemctl start mysqld

四、 总结

通过 LVM(物理卷 $
ightarrow$ 卷组 $
ightarrow$ 逻辑卷)的抽象架构,Linux 实现了存储资源的动态池化与按需分配。

在云计算与企业级运维中,掌握 LVM 的在线扩容(lvextend -r)与快照机制(COW),能够帮助我们在面对数据暴增与灾难恢复场景时做到游刃有余、业务无感。

更多推荐