文件系统快照是一种非常好的在线备份方法。支持快照的文件系统能够瞬间创建用来备份的内容一致的镜像。Linux的逻辑卷管理(LVM)是其中支持快照文件系统的一种,其它支持文件系统快照的还有FreeBSD文件系统,ZFS文件系统等。
下面我们就先来了解下原理:
LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里, 也就是对原始卷进行修改时,会将原始数据复制到快照预留区域。注意:采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效(这个影响就像拔出一个外部设备:任何从设备上读的备份工 作都会因I/O错误而失效),所以非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。
开始做个测试:
前提:lvm快照所在的vg必须和备份源(也就是/dev/vg_group/data1)是同一个,因此我们需要确认vg_image的剩余空间,若不足需扩展。
[root@qht131 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 vg_group lvm2 a-- 1016.00m 0
/dev/sdb1 vg_group lvm2 a-- 1016.00m 4.00m
/dev/sdd1 lvm2 a-- 1019.72m 1019.72m
可以看到还剩余4M的剩余空间,显然不够。一般建议是快照预留区的空间是原始卷的10%。
必须得增大vg的空间:
[root@qht131 ~]# vgextend vg_group /dev/sdd1
Volume group "vg_group" successfully extended
[root@qht131 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 vg_group lvm2 a-- 1016.00m 0
/dev/sdb1 vg_group lvm2 a-- 1016.00m 4.00m
/dev/sdd1 vg_group lvm2 a-- 1016.00m 1016.00m
[root@qht131 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
data1 vg_group -wi-ao-- 1.98g
[root@qht131 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_group 3 1 0 wz--n- 2.98g 1020.00m --vg现在有了1020M的空间
[root@qht131 ~]# mount /dev/vg_group/data1 /data1
[root@qht131 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc3 20G 5.9G 13G 33% /
tmpfs 499M 100K 499M 1% /dev/shm
/dev/sdc1 97M 28M 65M 31% /boot
/dev/mapper/vg_group-data1
2.0G 616M 1.3G 33% /data1一
下一步准备创建lvn快照,计划的快照保留区域是300M(以目前lv上面已使用的空间616M小,以便于测试快照区域用完后的异常情况)。
注意:需要对mysql数据库进行备份的话,在创建快照前需要使用一个全局的读锁(flush tables with read lock;show master status;)获取快照之后再用Unlock tables或直接关闭连接来释放锁,保证数据一致性。
[root@qht131 ~]# lvcreate -L 300M -s -n backup_data1 /dev/vg_group/data1
Logical volume "backup_data1" created
[root@qht131 ~]# mkdir -p /backup/data1
[root@qht131 ~]# mount /dev/vg_group/backup_data1 /backup/data1
[root@qht131 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc3 20G 5.9G 13G 33% /
tmpfs 499M 100K 499M 1% /dev/shm
/dev/sdc1 97M 28M 65M 31% /boot
/dev/mapper/vg_group-data1
2.0G 616M 1.3G 33% /data1
/dev/mapper/vg_group-backup_data1
2.0G 616M 1.3G 33% /backup/data1
[root@qht131 ~]#
mount之后就可以对这个lv进行备份,不过速度要快些,以免Data%满了导致快照失效。
[root@qht131 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
backup_data1 vg_group swi-aos- 300.00m data1 0.00
data1 vg_group owi-aos- 1.98g
查看逻辑卷的信息,可以发现快照的逻辑卷Origin和Data%有了数据,要注意Data%不能满了,否则这个快照就失效了,下面继续测试将Data%填满。
复制一个613M的文件在这个lv,原本以为对逻辑卷新增数据不会增大快照区域,结果测试的结果不是我想的这样。所以对原始卷进行的任何操作,在快照卷都会记录原始的数据,哪怕原始数据是空。
[root@qht131 data1]# ls -lth
total 613M
-rw-r--r--. 1 root root 613M Apr 17 18:55 mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
drwx------. 2 root root 16K Apr 17 18:54 lost+found
[root@qht131 data1]# cp mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz_bak
[root@qht131 data1]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc3 20G 5.9G 13G 33% /
tmpfs 499M 100K 499M 1% /dev/shm
/dev/sdc1 97M 28M 65M 31% /boot
/dev/mapper/vg_group-data1
2.0G 1.2G 667M 65% /data1
复制完成后查看lv的状态,快照区域已失效,出现IO错误。
[root@qht131 data1]# lvs
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126446592: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126503936: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 4096: Input/output error
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
backup_data1 vg_group Swi-I-s- 300.00m data1 100.00
data1 vg_group owi-aos- 1.98g
[root@qht131 data1]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc3 20G 5.9G 13G 33% /
tmpfs 499M 100K 499M 1% /dev/shm
/dev/sdc1 97M 28M 65M 31% /boot
/dev/mapper/vg_group-data1
2.0G 1.2G 667M 65% /data1
[root@qht131 data1]# lvdisplay -v backup_data1
Using logical volume(s) on command line
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126446592: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126503936: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 4096: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126446592: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126503936: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 4096: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
Volume group "backup_data1" not found
Skipping volume group backup_data1
lvm快照失效后只能删除了,已失去了使用的意义
删除快照卷以及回收vg空间
[root@qht131 data1]# lvremove /dev/vg_group/backup_data1
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126446592: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 2126503936: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg_group/backup_data1: read failed after 0 of 4096 at 4096: Input/output error
Do you really want to remove active logical volume backup_data1? [y/n]: y
Logical volume "backup_data1" successfully removed
[root@qht131 data1]# vgreduce vg_group /dev/sdd1
Removed "/dev/sdd1" from volume group "vg_group"
[root@qht131 data1]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_group 2 1 0 wz--n- 1.98g 4.00m
至此测试结束!
参考:https://blog.csdn.net/yanggd1987/article/details/50124997