磁盘管理与 LVM 在线扩容实战

磁盘告警(/ 使用率 90%)是运维半夜被叫醒的高频原因。给磁盘规划做对了两件事——用 LVM、留扩容路径——大多数告警都能在业务无感的情况下解决。这篇是磁盘管理的完整实战。

一、分区表:MBR vs GPT

对比项 MBR GPT
最大容量 2TB 大得多
主分区数 最多 4 个 128 个
工具 fdisk parted / gdisk
场景 小于 2T 的盘 大于 2T 的盘必须 GPT

一条判断记住:小于 2T 用 fdisk(MBR),大于 2T 用 parted(GPT)

二、RAID 选型:一句话对比

级别 最少磁盘 可用容量 容错 特点 典型场景
RAID0 1 100% 最快最脆,坏一块全丢 缓存/临时数据,生产几乎不用
RAID1 2 50% 1 块 完全镜像,安全但写慢 系统盘、关键小数据
RAID5 3 (n-1)/n 1 块 均衡,坏 1 块靠校验重建 通用业务盘(非数据库)
RAID10 4 50% 每组 1 块 先镜像再条带,快且安全 数据库等高 IO 关键业务

生产选型就记一条:数据库上 RAID10,通用数据 RAID5,系统盘 RAID1——不追求理论极致,追求”故障时能扛住”。

三、LVM:为什么磁盘规划一定要用它

直接分区 + 格式化虽然简单,但空间不够时只能换更大盘、迁移数据,停机时间长。LVM 的核心价值一句话:不停止服务、不卸载目录,在线扩容

LVM 三层概念:PV(物理卷,把盘擦干净打标记)→ VG(卷组,把 PV 收进一个池)→ LV(逻辑卷,从池里切出来用)。

初始化流程

1
2
3
4
5
6
7
8
9
# 1. PV:把新盘变成物理卷
pvcreate /dev/sdb
# 2. VG:建卷组(池)
vgcreate data_vg /dev/sdb
# 3. LV:从池里切 100G 给逻辑卷
lvcreate -L 100G -n data_lv data_vg
# 4. 格式化并挂载(写入 /etc/fstab 开机自动挂载)
mkfs.xfs /dev/data_vg/data_lv
mkdir /data && mount /dev/data_vg/data_lv /data

在线扩容(四层,一步都不能少)

场景:/data 只剩 10% 空间,新买了一块 200G 云盘 /dev/sdc,不停机扩到 300G。

1
2
3
4
5
6
7
8
9
10
11
# 1. 物理层面:新盘变成 PV
pvcreate /dev/sdc
# 2. 卷组层面:新 PV 并入 VG(池变大了)
vgextend data_vg /dev/sdc
# 3. 逻辑层面:池里空间全部给 LV
lvextend -l +100%FREE /dev/data_vg/data_lv
# 4. 文件系统层面:让文件系统"感知"变大(关键!)
# ext4:
resize2fs /dev/data_vg/data_lv
# xfs(CentOS 7+ 默认,注意 xfs 要传挂载点而不是设备名):
xfs_growfs /data

完成后 df -h 立刻看到 300G,全程业务无中断。踩坑点:xfs 用 xfs_growfs /data(挂载点),ext4 用 resize2fs(设备名),混用会报错。

扩容后必做的巡检项

  • pvs / vgs / lvs 三连确认三层状态一致
  • 新盘没在 fstab 里重复挂载(避免重启后两个挂载点打架)
  • 告警阈值(如 80% 告警、90% 危险)在监控里同步更新

四、swap 扩容

内存吃紧时给系统加 swap 是最快的临时缓解:

1
2
3
4
5
6
7
8
9
10
11
12
free -h                                  # 先看现状

# 1. 生成 4G 空文件
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
# 2. 权限必须 600,否则 mkswap 报"不安全"
chmod 600 /swapfile
# 3. 格式化为 swap
mkswap /swapfile
# 4. 启用
swapon /swapfile
# 5. 写入 fstab 永久生效
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

注意:swap 是缓解不是根治,长期还是看应用内存优化或扩容内存。

五、一次深夜磁盘告警实录

凌晨 2 点收到 / 使用率 92% 告警。处理链路:

  1. df -h 确认告警真实性(92%,确实是根分区);
  2. du -h --max-depth=1 -x / | sort -hr | head -10 定位大头目录(-x 不扫挂载点,防止 NFS 卡死)→ 是 /data/logs 应用日志;
  3. 查 logrotate 配置——新上线的服务没配轮转,大日志一直在涨;
  4. 手工 logrotate -f 触发一次轮转 + 临时清理,空间回到 60%;
  5. 补上该服务的 logrotate 规则,事件闭环。

磁盘管理的核心就三句话:初始化用 LVM、扩容走四层、日志交给 logrotate——做到这三点,磁盘类故障基本都能”白天处理、晚间无感”。