PVE 存储管理与备份策略

PVE 存储管理与备份策略 本文系统介绍 PVE 的存储管理方案,涵盖硬盘管理、ZFS 配置、自动化备份、异地同步等核心内容,帮助读者构建可靠的数据保护体系。 PVE 存储架构概览 PVE 支持多种存储类型: 存储类型 适用场景 特点 Local (LVM) 系统盘、小容量 简单、性能好 Local

PVE 存储管理与备份策略

本文系统介绍 PVE 的存储管理方案,涵盖硬盘管理、ZFS 配置、自动化备份、异地同步等核心内容,帮助读者构建可靠的数据保护体系。

PVE 存储架构概览

PVE 支持多种存储类型:

存储类型 适用场景 特点
Local (LVM) 系统盘、小容量 简单、性能好
Local-ZFS 大容量、数据安全 快照、压缩、去重
Ceph 分布式、多节点 高可用、扩展性强
NFS 共享存储、备份 易于共享
iSCSI SAN 环境 块设备共享

ZFS 存储池配置

ZFS 基础概念

ZFS 是 PVE 推荐的高级文件系统,提供:

  • 写时复制 (Copy-on-Write):保证数据一致性
  • 快照:瞬时创建,空间高效
  • 压缩:节省存储空间
  • 去重:消除重复数据块
  • 校验和:自动检测数据损坏

创建 ZFS 存储池

# 查看可用磁盘
lsblk

# 单盘 ZFS(简单,无冗余)
zpool create tank /dev/sdb

# 镜像模式(RAID1,推荐)
zpool create tank mirror /dev/sdb /dev/sdc

# RAIDZ1(RAID5,单盘冗余)
zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd

# RAIDZ2(RAID6,双盘冗余)
zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

ZFS 数据集管理

# 创建数据集(类似分区)
zfs create tank/vm-storage
zfs create tank/backup

# 启用压缩
zfs set compression=lz4 tank/vm-storage

# 设置配额
zfs set quota=500G tank/vm-storage

# 查看存储池状态
zpool status
zfs list

ZFS 快照管理

# 创建快照
zfs snapshot tank/vm-storage@2024-01-01

# 查看快照
zfs list -t snapshot

# 回滚快照
zfs rollback tank/vm-storage@2024-01-01

# 删除快照
zfs destroy tank/vm-storage@2024-01-01

# 快照自动清理(保留最近 7 天)
zfs set com.sun:auto-snapshot=true tank/vm-storage

PVE 备份策略

内置备份功能

PVE 提供 vzdump 工具进行虚拟机备份:

# 备份单个虚拟机
vzdump 100 --compress zstd --mode snapshot

# 备份多个虚拟机
vzdump 100 101 102 --compress zstd

# 备份到指定目录
vzdump 100 --dumpdir /mnt/backup --compress zstd

# 排除临时文件
vzdump 100 --exclude-path /tmp --exclude-path /var/cache

备份模式

  • snapshot:快照模式,不影响运行(推荐)
  • suspend:暂停模式,短暂中断
  • stop:停机模式,完全关机后备份

自动化备份脚本

cat > /usr/local/bin/pve-backup.sh <<'EOF'
#!/bin/bash

# PVE 自动备份脚本
BACKUP_DIR="/mnt/backup/pve"
RETENTION_DAYS=7
LOG_FILE="/var/log/pve-backup.log"
DATE=$(date +%Y%m%d_%H%M%S)

# 需要备份的 VMID 列表
VM_LIST="100 101 102 103"

# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE}

# 备份日志
echo "[$(date)] 开始备份" >> ${LOG_FILE}

# 逐个备份虚拟机
for VMID in ${VM_LIST}
do
    echo "[$(date)] 备份 VM ${VMID}..." >> ${LOG_FILE}
    vzdump ${VMID} \
        --dumpdir ${BACKUP_DIR}/${DATE} \
        --mode snapshot \
        --compress zstd \
        --quiet 1
    
    if [ $? -eq 0 ]; then
        echo "[$(date)] VM ${VMID} 备份成功" >> ${LOG_FILE}
    else
        echo "[$(date)] VM ${VMID} 备份失败" >> ${LOG_FILE}
    fi
done

# 清理旧备份
echo "[$(date)] 清理 ${RETENTION_DAYS} 天前的备份" >> ${LOG_FILE}
find ${BACKUP_DIR} -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;

echo "[$(date)] 备份完成" >> ${LOG_FILE}
EOF

chmod +x /usr/local/bin/pve-backup.sh

定时任务配置

# 编辑 crontab
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /usr/local/bin/pve-backup.sh

# 每周日全量备份
0 3 * * 0 /usr/local/bin/pve-backup.sh full

异地备份方案

方案1:Rsync 同步

cat > /usr/local/bin/sync-offsite.sh <<'EOF'
#!/bin/bash

# 本地备份目录
LOCAL_DIR="/mnt/backup/pve"
# 远程备份服务器
REMOTE_HOST="backup.example.com"
REMOTE_DIR="/backup/pve"
REMOTE_USER="backup"

# Rsync 同步
rsync -avz --delete \
    -e "ssh -i /root/.ssh/backup_key" \
    ${LOCAL_DIR}/ \
    ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/

# 检查同步结果
if [ $? -eq 0 ]; then
    echo "[$(date)] 异地同步成功" >> /var/log/pve-sync.log
else
    echo "[$(date)] 异地同步失败" >> /var/log/pve-sync.log
fi
EOF

chmod +x /usr/local/bin/sync-offsite.sh

方案2:BorgBackup 加密备份

# 安装 borgbackup
apt install borgbackup

# 初始化仓库
export BORG_REPO="ssh://backup@backup.example.com/backup/pve-borg"
export BORG_PASSPHRASE="your-passphrase"
borg init --encryption=repokey-blake2

# 创建备份脚本
cat > /usr/local/bin/borg-backup.sh <<'EOF'
#!/bin/bash

export BORG_REPO="ssh://backup@backup.example.com/backup/pve-borg"
export BORG_PASSPHRASE="your-passphrase"

# 创建备份
borg create \
    --compression lz4 \
    ::{hostname}-{now:%Y-%m-%d-%H%M%S} \
    /etc/pve \
    /mnt/backup/pve

# 清理旧备份(保留策略)
borg prune \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6

# 检查备份完整性
borg check
EOF

chmod +x /usr/local/bin/borg-backup.sh

文件级备份工具

Syncthing 双向同步

适用于文档、配置等需要双向同步的场景:

# 安装 Syncthing
curl -s https://syncthing.net/release-key.txt | apt-key add -
echo "deb https://apt.syncthing.net/ syncthing stable" | tee /etc/apt/sources.list.d/syncthing.list
apt update && apt install syncthing

# 配置自启动
systemctl enable syncthing@root.service
systemctl start syncthing@root.service

Rclone 云存储备份

# 安装 rclone
curl https://rclone.org/install.sh | bash

# 配置云存储
rclone config

# 备份脚本
cat > /usr/local/bin/rclone-backup.sh <<'EOF'
#!/bin/bash

# 同步到对象存储
rclone sync /mnt/backup/pve remote:pve-backup \
    --progress \
    --transfers=4 \
    --checkers=8
EOF

chmod +x /usr/local/bin/rclone-backup.sh

备份恢复流程

虚拟机恢复

# 从备份恢复虚拟机
qmrestore /mnt/backup/vzdump-qemu-100-2024_01_01-00_00_00.vma.zst 100

# 恢复到新 ID
qmrestore /path/to/backup.vma.zst 200

# 恢复到其他存储
qmrestore /path/to/backup.vma.zst 100 --storage local-zfs

配置文件恢复

# PVE 配置文件位置
/etc/pve/

# 恢复节点配置
# 从备份中恢复 /etc/pve/nodes/{node}/qemu-server/ 下的文件

# 恢复网络配置
# 从备份中恢复 /etc/network/interfaces

存储性能优化

ZFS 调优

# ARC 缓存大小(建议内存的 50-75%)
echo "options zfs zfs_arc_max=8589934592" >> /etc/modprobe.d/zfs.conf
# 8GB = 8 * 1024 * 1024 * 1024 = 8589934592

# 禁用 ZFS 预读(SSD 建议禁用)
zfs set primarycache=metadata tank

# 启用 TRIM(SSD 必需)
zpool set autotrim=on tank

磁盘调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 设置为 mq-deadline(SSD 推荐)
echo mq-deadline > /sys/block/sda/queue/scheduler

# 永久设置
echo 'ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/scheduler}="mq-deadline"' > /etc/udev/rules.d/99-iosched.rules

小结

本文介绍了 PVE 的存储管理与备份策略:

  1. ZFS 存储:写时复制、快照、压缩、去重
  2. 备份策略:本地备份 + 异地备份 + 加密
  3. 自动化:定时任务 + 自动清理
  4. 恢复流程:快速恢复,减少 RTO

建议采用 3-2-1 备份原则:

  • 3 份数据副本
  • 2 种不同存储介质
  • 1 份异地备份

参考资料

LICENSED UNDER CC BY-NC-SA 4.0
Comment