LVM文件系统快照实测

文件系统快照是一种非常好的在线备份方法。支持快照的文件系统能够瞬间创建用来备份的内容一致的镜像。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

你可能感兴趣的:(MYSQL,LINUX)