Logical Volume Manager (LVM)提供了对任意一个Logical Volume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份。
在某一个状态下做备份的时候,可能有应用正在访问某一个文件或者数据库,这就是使得备份的时候文件处于一个状态,而备份完后,文件却处于另外一个状态,从而造成备份的非一致性,这种状态恢复数据库数据几乎不会成功。
状态的解决办法是将其分区挂载为只读,然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份,又不会影响服务器的可用性。
要提醒一点是,snapshot这种方法仅对LVM有效,对于非LVM文件系统无效。
LVM中snapshot的“写时复制”(copy on write) 的实现方法。快照不是用来备份的
当 一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建 几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留 的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
在写操作写入块之前,CoW讲原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的, 那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。
1. 创建快照 (EXT4)
[root@server0 ~]# lvcreate -L 128M -s -n lv2-snap /dev/vg1/lv2
[root@server0 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
lv1 vg1 -wi-ao—— 768.00m
lv2 vg1 owi-aos—- 512.00m
lv2-snap vg1 swi-aos—- 128.00m lv2 5.92
[root@server0 ~]# mount -o ro /dev/vg1/lv2-snap /mnt/lv2-snap/ 不希望破坏快照卷中的数据
[root@server0 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg1-lv2 ext4 488M 32M 429M 7% /mnt/lv2
/dev/mapper/vg1-lv2—snap ext4 488M 32M 429M 7% /mnt/lv2-snap
[root@server0 ~]# lvscan
ACTIVE ‘/dev/vg1/lv1’ [768.00 MiB] inherit
ACTIVE Original ‘/dev/vg1/lv2’ [512.00 MiB] inherit
ACTIVE Snapshot ‘/dev/vg1/lv2-snap’ [128.00 MiB] inherit
[root@server0 ~]# ls /mnt/lv2
etc lost+found
[root@server0 ~]# ls /mnt/lv2-snap/
etc lost+found
2. 修改原卷的数据
3. 观察Snapshot
[root@server0 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
lv1 vg1 -wi-ao—— 768.00m
lv2 vg1 owi-aos—- 512.00m
lv2-snap vg1 swi-aos—- 128.00m lv2 30.56
** XFS:**<br /> **[root@server0 ~]# mount -o nouuid,ro /dev/vg1/lv1-snap /mnt/lv1-snap/s**<br /> 挂载快照,尽量使用ro(只读)的方式,将不会破坏快照卷中的数据<br /> [root@server0 ~]# dmsetup ls --tree<br /> vg1-lv2--snap (252:5)<br /> ├─vg1-lv2--snap-cow (252:7)<br /> │ └─ (253:17)<br /> └─vg1-lv2-real (252:6)<br /> ├─ (253:17)<br /> └─ (253:18)<br /> vg1-lv2 (252:1)<br /> └─vg1-lv2-real (252:6)<br /> ├─ (253:17)<br /> └─ (253:18)<br /> 快照自动增长:<br /> [root@server0 ~]# vim /etc/lvm/lvm.conf<br /> snapshot_autoextend_threshold = 70<br /> snapshot_autoextend_percent = 20<br /> [root@server0 ~]# systemctl restart lvm2-monitor.service<br /> [root@server0 ~]# systemctl enable lvm2-lvmetad.service<br /> **注:快照卷 和 原卷 使用同一VG空间**<br />**
应用场景
数据一致性: 备份和恢复数据不一致
保证数据的一致性
MySQL数据放在LVM中
- mysql stop 优点:保证数据的一致性 缺点:业务的不可用性
- LV snapshot 优点:数据的一致性,业务的持续性
- 全局读锁
- LVM snapshot
- 释放锁
- mount -o snapshot
- 从snapshot卷中复制数据
- 卸载snapshot
- lvremove snapshot