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
# 等待完成后再执行快照
常见问题与排查清单#
- 快照失败:检查快照空间、底层存储可用空间。
- 快照恢复异常:确认快照创建时点已完成应用刷盘。
- 性能下降:缩短快照保留时间;避免高写入期进行快照。
- 备份不可用:做恢复演练并进行校验(
sha256sum)。
练习#
- 使用 LVM 创建 10G 卷,写入 1G 文件,创建快照并验证快照内容一致性。
- 使用 Btrfs 创建子卷与只读快照,并用
send/receive进行增量复制。 - 使用 ZFS 创建 zpool、dataset,创建两次快照并执行增量发送。
- 在 MySQL 数据目录上模拟一致性快照流程,记录每一步作用与输出。