跳到主要内容

存储扩容实战

问题

业务数据持续增长,存储空间不足,需要进行在线扩容,如何操作?

答案

场景一:LVM 逻辑卷扩容

# 前提:VG 中还有剩余空间,或者新增了物理磁盘

# 1. 查看当前状态
df -h /data
lvs
vgs # 查看 VG 剩余空间(VFree)

# 2. 如果 VG 空间不足,先添加新磁盘到 VG
pvcreate /dev/sdc # 创建 PV
vgextend data-vg /dev/sdc # 扩展 VG

# 3. 扩展 LV(在线操作,无需卸载)
lvextend -L +100G /dev/data-vg/data-lv # 增加 100G
# 或
lvextend -l +100%FREE /dev/data-vg/data-lv # 使用所有剩余空间

# 4. 扩展文件系统(在线操作)
# ext4 文件系统
resize2fs /dev/data-vg/data-lv

# xfs 文件系统
xfs_growfs /data

# 5. 验证
df -h /data
LVM 在线扩容

ext4 和 xfs 都支持在线扩容(不需要卸载挂载点)。但 xfs 不支持缩容,ext4 支持离线缩容。

场景二:云磁盘扩容

# AWS EBS 扩容示例

# 1. 在控制台或 CLI 扩容 EBS 卷
aws ec2 modify-volume --volume-id vol-xxx --size 500

# 2. 等待卷状态变为 optimizing 或 completed
aws ec2 describe-volumes-modifications --volume-id vol-xxx

# 3. 在服务器上扩展分区
# 查看磁盘
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# nvme0n1 259:0 0 500G 0 disk ← 磁盘已 500G
# └─nvme0n1p1 259:1 0 200G 0 part / ← 分区还是 200G

# 扩展分区
growpart /dev/nvme0n1 1

# 扩展文件系统
resize2fs /dev/nvme0n1p1 # ext4
# 或
xfs_growfs / # xfs

# 4. 验证
df -h /

场景三:Kubernetes PVC 扩容

# 前提:StorageClass 必须支持扩容
# allowVolumeExpansion: true

# 1. 查看当前 PVC
# kubectl get pvc -n production

# 2. 修改 PVC 大小
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
namespace: production
spec:
resources:
requests:
storage: 200Gi # 从 100Gi 改为 200Gi
# 应用变更
kubectl apply -f pvc.yaml

# 查看扩容状态
kubectl get pvc data-pvc -n production
# 如果 CONDITIONS 显示 FileSystemResizePending
# Pod 需要重建才能完成文件系统扩容

# 重建 Pod(删除后自动重建)
kubectl delete pod <pod-name> -n production

常见面试问题

Q1: 数据库磁盘即将满了,如何在不停机的情况下扩容?

答案

  1. LVM 环境:直接 lvextend + resize2fs,全程在线,数据库无感知
  2. 云环境:控制台扩容磁盘 → growpart 扩展分区 → resize2fs 扩展文件系统
  3. 非 LVM 且无法在线扩
    • 添加新磁盘挂载到新目录
    • MySQL 用软链接将数据目录指向新磁盘
    • 或者使用主从切换 + 在从库上扩容

注意:扩容前确认文件系统类型、是否使用 LVM、云服务商是否支持在线扩容。

相关链接