lvm详解


难度 中等

lvm是什么

LVM(Logical Volume Manager)逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。它提供了一种灵活的方式来管理和操作磁盘空间,使管理员能够动态地创建、调整大小、合并和移动逻辑卷,而无需中断系统。

LVM的主要目标是将物理存储设备(如硬盘、SSD等)抽象为逻辑卷(Logical Volume),屏蔽了物理磁盘和分区的细节,使用户和系统能够以逻辑上的方式管理存储空间。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。

lvm其实跟ext4这样的文件系统类似,抽象成一个个分区后,将这些分区挂载到某个目录下,就可以像操作目录一样操作磁盘了。

lvm与ext4这样的文件系统最大的区别是,ext4针对是某个磁盘的一部分的抽象,而lvm则是针对一个或多个磁盘的一部分或者整体的抽象,lvm能够将多个磁盘抽象成同一个逻辑卷。

关键术语

  • 物理存储介质(The physical media):其实就是硬盘或者ssd,LVM存储介质,可以是硬盘分区、整个硬盘、raid阵列或SAN硬盘。设备必须初始化为LVM物理卷,才能与LVM结合使用。
  • 物理卷PV(physical volume):物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质比较却包含与LVM相关的管理参数,创建物理卷可以用硬盘分区,也可以用硬盘本身。
  • 卷组VG(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,一个卷组VG由一个或多个物理卷PV组成。可以在卷组VG上建立逻辑卷LV。
  • 逻辑卷LV(logical volume):类似于非LVM系统中的硬盘分区,逻辑卷LV建立在卷组VG之上。在逻辑卷LV之上建立文件系统。

lvm的搭建流程

graph TB a(磁盘/分区)-->b(创建物理卷pv)-->c(创建逻辑卷vg,vg可以有多个pv组成)-->d(创建逻辑卷lv)-->e(格式化并挂载)

lvm有什么用

  1. 卷组VG可以使多个硬盘空间看起来像是一个大硬盘。

  2. 逻辑卷LV可以创建跨多个硬盘空间的分区。

  3. 在使用逻辑卷LV时,可以在空间不足时动态调整大小,不需要考虑逻辑卷LV在硬盘上的位置,不用担心没有可用的连续的空间。

  4. 可以在线对卷组VG、逻辑卷LV进行创建、删除、调整大小等操作。但LVM上的文件系统也需要重新调整大小。

  5. LVM允许创建快照,用来保存文件系统的备份。

如何使用lvm

  1. 使用lsblk查看磁盘分区,确定要使用的磁盘或者分区,可以是没有创建过分区的物理磁盘,也可以已经创建出来的分区;

  2. 选择磁盘或者分区利用pvcreate创建物理卷PV,创建完成后可以使用pvs查看pv

pvcreate /dev/sda
pvs

创建完成后,使用lsblk -f查看文件系统类型时已经变更为了LVM2_member.

(base) ➜  ~ lsblk -f
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda                                                                      
└─sda1          LVM2_member       6xxxxxxxxxxxxxxxx

可以使用pvdisplay查看pv的详细情况。

pvdisplay /dev/sda1
  1. 创建vg

使用vgcreate创建vg,命令如下:

# 这里的vg_data就是vg的名称
vgcreate vg_data /dev/sda1

创建完成后使用如下命令查看vg的详细情况:

vgs
vgdisplay vg_data
  1. 创建逻辑卷lv
lvcreate -n lvname -L lvsize(M,G) vgname
lvcreate -n lv_data -L 64M vg_data
  1. 格式化分区,并将其挂载
mkfs.ext4 /dev/vg/lv_data
mkdir /data
mount /dev/vg/lv_data /data
  1. lv扩容

lvm最重要的功能就是动态调整分区大小,如果之前创建的vg还有剩余的空间,则可以直接在原有lv的基础上扩容,使用如下命令扩展:

lvextend -L +100M /dev/vg/lv_data
resize2fs /dev/vg/lv_data

如果vg里的所有空间都已经分配完了,则需要先扩展vg,再扩展lv。

缩容则采用如下命令:

lvreduce -L 100M  /dev/vg/lv_data
resize2fs /dev/vg/lv_data
  1. 扩展vg

扩展vg一般是增加了一块磁盘,这个时候就可以把这块磁盘扩展到vg里,比如sdb。

pvcreate /dev/sdb
vgextend vg_data /dev/sdb

关于lvm的一些疑问

lvm创建的文件是如何分配到具体的物理磁盘上的

lvm创建的文件分配到磁盘上有多个策略,具体如下:

  1. 线性分配(linear)

这是默认的分配策略,无需特别设置,数据按顺序依次放到各个物理磁盘上,一个物理磁盘放满后才会放在另外一个物理磁盘。

  1. 条带分配(striped)

需要在使用lvcreate时用-i指定条带数,存储文件时会将数据均匀地存储在各个磁盘上。比如有两个物理磁盘,创建lv时使用如下命令:

lvcreate -n lv_data -L 64M vg_data -i 2
  1. 镜像分配(mirrored)

每一份数据都会有多个镜像副本存储,提高数据容错性。需要在使用lvcreate时用-m指定镜像数。

lvcreate -n lv_data -L 64M vg_data -m 2
  1. 条带镜像分配

这个是条带分配和镜像分配的结合,需要使用lvcreate时用-m指定镜像数,用-i指定条带数

lvcreate -n lv_data -L 64M vg_data -i 2 -m 2

若要查看lvm当前的磁盘分配策略,可以使用如下命令查看:

lvdisplay type

比如下面的就是linear

--- Segments ---
 Logical extents 0 to 12800:
   Type                linear
   Physical volume     /dev/nvme0n1p3
   Physical extents    475271 to 488071
  
 Logical extents 12801 to 537087:
   Type                linear
   Physical volume     /dev/sda1
   Physical extents    0 to 524286
  • 线性方式(linear):以一块盘为基础进行读写。当数据写入到一个物理卷(盘)时,写满后才会开始写入下一个物理卷。这种方式的性能较低,因为它无法充分利用多个盘的并行读写能力。

  • 条带方式(striped):以多块盘并行读写数据。数据被分成大小相等的条带,然后同时写入到多个物理卷中的相应条带位置。这样可以充分利用多个盘的并行读写能力,从而提高读写性能。

一般来说,随机读写比较多的场景下,条带方式通常比线性方式具有更高的性能。顺序读写且文件较大的场景下,线性方式通常比条带方式具有更高的性能。

是否可以将lvm的磁盘空间回收,创建新的lvm

如果lvm创建时使用的是整块磁盘,那无法将未使用的空间回收回来重新重建vg,进而创建lv。
因而在创建pv时尽量先创建分区,不要一开始就使用整个磁盘,后面再按需进行添加和扩展。

当使用条带方式(striped)存储策略时,若某个物理盘损坏是否会影响数据可读性

当使用 Striped(条带化)方式在多个物理磁盘上分配数据时,如果其中一块物理磁盘发生故障,将会影响全量数据的可用性和完整性。 这是因为条带化将数据分割成多个块,并将这些块分散存储在各个物理磁盘上。如果某个物理磁盘发生故障,相应的数据块将无法访问。这可能导致条带化卷中所有的数据块都变得不完整,从而影响到全量数据的可用性。具体影响程度将取决于使用的条带大小、故障磁盘的位置以及卷的冗余配置。

要减少物理磁盘损坏对全局数据的影响,可采取如下措施:

  • 冗余备份
  • 定期备份

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔2 AI27 算法1 计算机基础13 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库34 数据库深入80 DPDK26 Docker11 Elasticsearch4 编辑工具4 FAQ1 Go Web1 hometown2 编程语言16 网络9 OPC1 Linux38 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 成长之路1 stock1 存储5 工具20 VPP18 视频作品1 Vue13 Web1 代码示例11 数据库15 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
13 逻辑复制深入
数据库深入🔥 1570
2
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
3
一文读懂openguass dcf网络模块
集群🔥 1420
4
逻辑复制源码分析
数据库深入🔥 1327
5
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094
6
applyparallelworker.c 之 LA 端源码深度解析:Leader Apply Worker 的指挥中枢
数据库深入🔥 1082
7
PostgreSQL Background Worker 全解:从 `RegisterBackgroundWorker` 到逻辑复制 4 类 worker 的全生命周期
数据库🔥 1078
8
PostgreSQL的后台进程walsender分析 - 关系型数据库 - 亿速云
PostgreSQL🔥 1033
9
PostgreSQL 逻辑复制的监控:六张视图 + 一组可执行 SQL,把 publisher/subscriber 的速率与健康度彻底看透
数据库🔥 1032
10
PostgreSQL 逻辑复制支持 DDL 之后:DDL 与 DML 的时序难题(重点:分区表)
数据库🔥 999
11
reorderbuffer.c 源码深度解析:PostgreSQL 逻辑复制的"事务重组引擎
数据库深入🔥 953
12
PostgreSQL 内核开发:读取一张表的 9 步标准流程与缓存全景
数据库🔥 938
13
从 `postgres` 二进制到生产级守护 —— PostgreSQL 最外层模块与启动全流程拆解
数据库🔥 936
14
支持逻辑复制同步 DDL 适配 SQL Server 方案
数据库深入🔥 934
15
PostgreSQL 逻辑复制的 ReorderBuffer 与事务机制:从一行 WAL 到一致性变更流的全链路绑定
数据库🔥 913
16
DDL同步架构(美化版)
数据库深入🔥 908
17
PostgreSQL Latch 机制详解:从一行 SetLatch 到 epoll 的内核之旅
数据库🔥 871
18
pgbench 源码全解:一个 C 文件如何撑起 PostgreSQL 官方压测工具
数据库🔥 860
19
PostgreSQL libpq 机制与缓冲区详解
数据库🔥 850
20
PostgreSQL 逻辑复制 spill 文件深度剖析:从 `xid-*.spill` 到 TPC-C 的增长方程
数据库🔥 845