工作笔记-应用磁盘无感扩容

概述

笔者在工作中,遇到了一个由于数据库系统宕机,造成的应用服务无法使用的故障。但幸运的是,数据库服务器本身还是可以通过SSH进行远程访问的。经过简单的检查,发现数据库服务停机的原因是由于其所在的服务器磁盘空间已经被占满了。

系统是一个虚拟机系统,所使用的磁盘空间,也是配套分配的虚拟磁盘,所以容量也不是特别大,考虑到需要支持数据库系统的运行和相关的维护操作,分配了100G的空间。从应用需求的角度而言,是比较充足的。但经过了几年的运行之后,还是遇到了磁盘空间不足的问题。

再经过进一步的检查和分析,发现应用数据库本身并没有占用很大的空间,而是数据库运行中的日志不断增长,将磁盘空间占满了。此外,笔者还发现,原有的数据库系统对磁盘空间的规划和使用并不是很合理。比如原来按照默认的安装方式,将虚拟机提供的100G的虚拟磁盘,划分成为两个分区用于根目录和用户主目录。数据库系统的数据文件,存储在根路径之下,这样用户主目录的50G就没有有效的利用到。

幸运的是,在系统上线的时候,其实还为这个系统分配了第二个虚拟磁盘,也是100G。但不知道是什么原因,在使用的时候,原来的部署并没有使用这个磁盘。但就是这个没有使用的磁盘,就为这次的调整,提供了一个很好的条件。此外,笔者还看到,原有的数据库系统使用了CentOS操作系统,并使用LVM来管理磁盘和分区。这样,我们就可以在不增加额外的配置,不需要重新启动和长时间中断的情况下,可以快速的恢复系统服务。

所以,针对现有的情况和条件,我们对于此次系统故障,可以采取的解决方案就是:

  • 检查当前的磁盘占用情况,明确数据库系统如何使用磁盘空间,以及相关的配置信息
  • 将空余的磁盘加入现有的LVM卷组
  • 为数据库系统数据和日志所在的分区,进行LVM扩容
  • 重新启动数据库服务,并检查应用程序的连接和配置
  • 合理调整和规划日志文件的存储和维护方式,减缓其增长造成的磁盘空间消耗的问题

这些步骤的核心,其实就是将一个可用的磁盘加入LVM卷组,并且使用这些扩展的磁盘空间来扩展数据分区。这时,对于应用系统而言,所有的配置都不需要修改,实现透明和动态的存储空间扩展。

理解LVM

前面我们已经了解到如何进行磁盘空间的一般过程。提到了这其中的关键是CentOS操作系统使用LVM技术来管理存储从而实现分区空间的动态扩容。所以,在具体操作之前,笔者认为有必要先来了解一下这个技术,从而帮助读者更清楚的理解之后的过程和操作。

LVM(Logical Volume Manager)就是逻辑卷管理程序。是一个Linux下的高级磁盘和存储管理工具。它的目的是通过将物理存储设备(硬盘、分区等)抽象成为逻辑卷来进行管理,从而能够提供更强大灵活的存储空间管理能力,如提供动态可扩展的分区和存储容量,并支持不同类型的文件系统,提供快照和迁移等功能。最典型的例子是,通过LVM,我们可以将很多磁盘,在操作系统(逻辑和应用)层面合并成为一个更大的存储分区和空间,从而突破单一磁盘存储容量不够的局限。而且这个过程可以是动态的,比如如果新加入了一块磁盘,就可以在不影响系统运行的情况下,将这个磁盘加入LVM存储,来扩展当前系统的存储容量。

在Linux系统中,LVM的技术实现涉及一系列逻辑概念。它们包括:

  • Physic Volume(PV) 物理卷

指实际的磁盘或者分区。LVM可以使用分区,也可以直接使用整个磁盘,在这种情况下,甚至不需要对磁盘进行分区。但在加入LVM前,需要先将其指定为PV。

  • Volume Group(VG) 卷组

卷组是由一个或多个PV组成的存储空间,VG的容量是所有PV的总和。

  • Logical Volume(LV) 逻辑卷

对于操作系统和应用程序而言,它们是通过逻辑卷(LV)配合文件系统来进行实际的文件操作的。LV是从VG中划分出来的逻辑空间,它可以动态调整大小,并挂载到文件系统来使用。在配置好逻辑卷之后,它会作为一个标准的操作系统设备出现在设备列表中,就和普通的磁盘和分区一样,可以挂载到系统文件夹中进行使用。

在Linux操作系统中,我们可以在系统设备列表(/dev)中,看到这几个类型的设备:

shell 复制代码
## 物理硬盘设备
/dev/vda
/dev/vda1
/dev/vdb

## 卷组(这里的卷组名称为centos, 可以通过vgdisplay命令检查这个名称)
/dev/centos

## 逻辑卷
/dev/centos/root
/dev/centos/home
/dev/centos/swap

## 分区挂载(使用映射方式)
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,attr2,inode64,noquota)

可以看到,通过这三层逻辑结构的设计,LVM在操作系统中,将真实的物理磁盘和逻辑的文件系统分区进行了隔离和分配,从而达到将存储空间逻辑化管理的目的。

当然,LVM并不是Linux系统内置和默认的功能和特性,需要先进行安装和配置,但一般情况下,如果在安装操作系统时,选择使用LVM来管理磁盘,相关的软件和模块也是默认安装的。作为主要和重要的系统基本模块,所有的主流Linux系统都支持LVM的安装。在安装完成之后,就可以通过其提供的一系列相关的程序和命令来进行操作了,主要包括:

  • lvm 是一个LVM管理的交互式环境,包括所有相关的管理命令
  • pvdisplay 显示当前物理卷信息,包括其相关设备和卷组
  • pvcreate 将存储设备转换为物理卷
  • vgdisplay 显示当前卷组信息,包括存储池容量
  • vgextend 卷组扩展(将物理卷加入卷组)
  • lvdisplay 查看当前的逻辑卷,包括了逻辑卷名称,大小,状态等信息
  • lvcreate 创建逻辑卷
  • lvextend 对逻辑卷进行扩展

上面是日常管理工作中,主要使用的工具和命令。除此之外,LVM还提供了很多其他功能和选项,读者有兴趣的话,可以通过lvm help命令和相关技术文档来进行查询,这里不再展开讨论。

在了解了LVM的基本概念和技术之后,下面我们来讨论以下在笔者的环境中,实际的操作步骤和命令的使用。

扩容步骤

本次调整和扩容的基本步骤如下:

检查当前系统配置

在开始之前,需要先明确当前系统磁盘的使用情况,包括使用以下一些命令:

  • lsblk

检查当前可用磁盘和挂载情况。

  • df -h

检查当前已挂载磁盘分区的使用情况。

  • du -h -d 1

检查某个文件夹(包括根目录)的空间使用情况。

检查新增磁盘

使用lsblk命令,我们可以看到没有使用的新磁盘 (vdc)和其容量,但由于没有进行任何初始化的配置和操作,可以看到它没有挂载位置。

磁盘分区

如果将整个空白磁盘作为扩展的存储空间,其实是可以不进行分区的。所以这里就保留这个磁盘的初始状态。

物理卷和卷组

使用下面的命令,可以基于此空白空间创建物理卷,并将其加入系统中已有的卷组中:

shell 复制代码
// 创建物理卷
pvcreate /dev/sdc

// 检查物理卷
pvdisplay
...

// 检查当前逻辑卷, 获取当前的卷组名称,如 centos
vgdisplay 
...

// 加入当前逻辑卷
vgextend centos /dev/vdc

// 再次检查卷组容量,确认其已经扩展
vgdisplay

扩展逻辑卷

在笔者当前的配置中,数据库数据表空间和日志文件,分别存放在不同的分区中,这两个分区的挂载路径分别是根路径(/)和用户主路径(/home),所以,需要将其作为扩展的目标。使用下列命令可以检查相关的逻辑卷配置和进行扩展:

shell 复制代码
// 查看逻辑卷
lvdisplay
... 

// 扩展逻辑卷 
lvextend -L +10G /dev/centos/home
lvextend -L +10G /dev/centos/root

这里由于只需要扩展磁盘空间到已有的逻辑卷,并没有新建立逻辑卷。如果确实需要,可以使用lvcreate命令来创建新的逻辑卷了。创建新的逻辑卷,需要指定其名称、初始容量和所使用的卷组。此外在创建新逻辑卷后,一般还需要为其指定文件系统,格式化和挂载到操作系统当中。

扩展文件系统大小

虽然,可以使用逻辑卷对磁盘分区进行扩展,但这个扩展是无法立即直接反映到操作系统和应用程序的,还需要执行文件系统的扩展命令,才能够真正的扩大可用的磁盘空间。不同的文件系统类型,所使用的扩展命令可能不一样。笔者的环境中,原来的文件系统使用的是xfs,所以对于的文件系统扩展命令是 xfs_growfs(如果是ext4文件系统,需要使用resize2fs)。

shell 复制代码
// 扩展
xfs_growfs /home 

// 检查扩展后的空间
lsblk 

至此,在检查和确认文件系统已经扩展,并具有了更大的空余空间后,系统空间扩容的工作就基本上完成了。这时可以直接重新启动数据库服务,如果基本配置没有改变,是不需要做其他的调整的。

小结

本文作为工作笔记和记录,通过一次在工作中遇到的由于磁盘空间不足造成的数据库系统宕机故障和排除的操作过程,探讨了如何使用LVM进行磁盘无感扩容,包括了LVM的基本概念,具体操作过程和需要注意的问题等等。

相关推荐
剑神一笑43 分钟前
Linux pgrep 命令详解:按名称查找进程 PID 的高效方法
linux·运维·chrome
剑神一笑1 小时前
Linux killall 命令详解:按进程名批量终止进程的原理与实践
linux·运维·chrome
红尘散仙1 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记3 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆3 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪3 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6164 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364574 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao4 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒5 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端