3.8.4 快照与一致性:LVM/Btrfs/ZFS

3.8.4 快照与一致性:LVM/Btrfs/ZFS#

快照用于在短时间内冻结数据视图,便于快速回滚或备份。关键在一致性:确保文件系统与应用数据处于同一时间点的可恢复状态。常见流程为“应用刷盘/锁定 → 文件系统冻结 → 快照 → 解冻”。

文章图片

一致性类型与处理方式
- 崩溃一致性:类似突然断电后的状态;风险高但实现简单。
- 文件系统一致性:使用 fsfreeze 或挂载选项,保证元数据一致。
- 应用一致性:应用刷盘/锁定后再快照,恢复可靠性最高。


LVM 快照(块级 CoW)#

安装与准备

# 安装 LVM 工具
yum install -y lvm2
# 或
apt-get install -y lvm2

# 示例:创建PV/VG/LV
pvcreate /dev/sdb
vgcreate vg_data /dev/sdb
lvcreate -L 10G -n lv_data vg_data
mkfs.xfs /dev/vg_data/lv_data
mkdir -p /data
mount /dev/vg_data/lv_data /data

一致性快照流程(含命令解释)

# 1) 冻结文件系统,阻止写入,保证一致性
fsfreeze -f /data

# 2) 创建快照(-s 为快照,-L 为快照空间,-n 为快照名)
lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data

# 3) 解冻文件系统
fsfreeze -u /data

# 4) 挂载快照进行备份(只读)
mkdir -p /mnt/snap
mount -o ro /dev/vg_data/lv_data_snap /mnt/snap
tar -czf /backup/data_$(date +%F).tgz -C /mnt/snap .
umount /mnt/snap

排错要点
- 快照空间不足会失效:lvs 查看 COW 使用率。
- 快照影响性能:写入量大时及时删除快照。

# 查看快照状态与COW使用
lvs -o +seg_monitor,seg_size,seg_pe_ranges,origin,data_percent,metadata_percent

# 删除快照
lvremove /dev/vg_data/lv_data_snap

Btrfs 快照(原生子卷)#

安装与格式化

yum install -y btrfs-progs
# 或
apt-get install -y btrfs-progs

mkfs.btrfs /dev/sdc
mount /dev/sdc /btrfs

子卷与只读快照

# 创建子卷
btrfs subvolume create /btrfs/data

# 创建只读快照
btrfs subvolume snapshot -r /btrfs/data /btrfs/snap/data_$(date +%F)

# 查看子卷
btrfs subvolume list /btrfs

增量备份(send/receive)

# 首次全量发送
btrfs send /btrfs/snap/data_2024-01-01 | btrfs receive /backup/btrfs

# 增量发送(基于上一次快照)
btrfs send -p /btrfs/snap/data_2024-01-01 /btrfs/snap/data_2024-01-02 \
  | btrfs receive /backup/btrfs

排错要点

# 检查文件系统与设备信息
btrfs filesystem show
btrfs check /dev/sdc

# 常见问题:空间不足
btrfs filesystem df /btrfs

ZFS 快照(原子一致性)#

安装与创建存储池

# CentOS/RHEL(示例:通过EPEL或官方仓库)
yum install -y zfs

# Ubuntu
apt-get install -y zfsutils-linux

# 创建 zpool 与 dataset
zpool create tank /dev/sdd
zfs create tank/data

快照与增量复制

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

# 增量发送/接收
zfs snapshot tank/data@2024-01-02
zfs send -i tank/data@2024-01-01 tank/data@2024-01-02 | zfs recv backup/data

排错要点

# 查看池健康状态
zpool status
# 查看数据集与快照
zfs list -t snapshot

与数据库一致性协同(示例)#

MySQL(示例命令解释)

# 1) 锁表并刷盘
mysql -e "FLUSH TABLES WITH READ LOCK;"

# 2) 文件系统快照
fsfreeze -f /data && lvcreate -L 5G -s -n lv_mysql_snap /dev/vg_data/lv_data && fsfreeze -u /data

# 3) 解除锁
mysql -e "UNLOCK TABLES;"

Redis

# 触发 RDB 保存,确保一致性
redis-cli BGSAVE
# 等待完成后再执行快照

常见问题与排查清单#

  1. 快照失败:检查快照空间、底层存储可用空间。
  2. 快照恢复异常:确认快照创建时点已完成应用刷盘。
  3. 性能下降:缩短快照保留时间;避免高写入期进行快照。
  4. 备份不可用:做恢复演练并进行校验(sha256sum)。

练习#

  1. 使用 LVM 创建 10G 卷,写入 1G 文件,创建快照并验证快照内容一致性。
  2. 使用 Btrfs 创建子卷与只读快照,并用 send/receive 进行增量复制。
  3. 使用 ZFS 创建 zpool、dataset,创建两次快照并执行增量发送。
  4. 在 MySQL 数据目录上模拟一致性快照流程,记录每一步作用与输出。