1、快照的工做原理html
所谓快照就是将当时的系统数据记录下来,在将来如有数据变更,则会将变动前的数据放入快照区进行保存。咱们可理解为快照就是给系统拍了一张照片,记录当时系统在拍快照的状态。只不过现实生活中的照片是没有办法将如今的生活还原到照片的时候,而Linux系统里LVM快照是能够的。从上面的阐述能够了解到,被作快照的逻辑卷是分红了两个部分,一部分是数据没有改动前的和数据变动后的。它是怎么工做的呢?在咱们给系统作快照的前提是,系统上基于LVM管理的,且快照和逻辑卷必须是在同一卷组上;在咱们给LVM管理的系统上作快照卷的时候,快照不能够给多个逻辑卷一块儿作,它是一个逻辑卷对应一个快照卷,不能够多个逻辑卷对应一个快照卷。快照是一次性使用,还原了快照,随之快照就失效,消失。接下来讲说原理吧。快照是特殊的逻辑卷,它之因此要和被作快照的逻辑卷一个卷组是由于它在生成快照时,它是和LV共享不少PE的区块,所以快照必须同LV同一个卷组中。之因此叫快照,就是由于它快嘛,它为何快,这就要和它的工做原理有密切的关系了,快照生成时,实际上它不是去拷贝原LV里的数据,它只是分配咱们指定大小的空间,在原LV上的数据发生变化时,这个时候快照会把发生改变的数据先拷贝到快照区,这样一来快照就只是存放着被修改以前的数据。这样就起到了备份修改数据的做用,修改后的数据就存放在原LV上。若是有一天咱们须要还原快照,这个时候快照就会和先有的LV作合并,快照里面存放修改以前的数据,快照和现有LV作合并时,快照上的数据会覆盖现有LV上数据,这样一来就实现了把数据还原到拍快照当时的状态。这里须要注意一点的是快照只是覆盖改变后的数据,没有作改变的数据它是不会去覆盖的。因此快照使用事后它就没有任何意义,它不能够再次记录恢复后数据的变化前的数据。在作快照的时候咱们还须要注意其快照的大小,快照指定的空间大小不要过小,过小可能装不小变化前的数据,致使快照失效,固然空间也不宜太大,太大浪费空间没有意义,空间超过原LV大小,其实也是没有意义的,它最大空间就是和原LV大小相等,因此在作快照时,咱们须要评估大概有多少的数据在发生变化,避免空间太小致使快照失效。node
2、快照的实现sql
1)查看现有逻辑卷所在卷组空间是否足够建立快照centos
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]# vgdisplay test --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]#
说明:这是已经建立好逻辑卷的系统上查看的,有关逻辑卷的管理请参考http://www.javashuo.com/article/p-udlkdzkr-m.html,能够看到还有17个G处于空闲状态bash
2)针对现有逻辑卷建立快照服务器
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls hellodb_innodb.sql test [root@test-centos7-node1 ~]# [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# vgdisplay --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]# lvcreate -L 1G -n lv_xxx_snap -p r -s /dev/test/xxx Logical volume "lv_xxx_snap" created. [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-aos--- 12.00g [root@test-centos7-node1 ~]#
说明:建立快照和建立其余逻辑卷的命令是同样的,都是用lvcreate 其中-s就是指定建立的逻辑卷为快照 -p 指定其快照属性 r 表示只读属性 最后要跟上对那个逻辑卷作快照,固然咱们指定被作快照的逻辑对应设备的路径,系统就可以分辨出快照该建立到那个VG上,因此咱们这里是可不指定VG的名称的app
[root@test-centos7-node1 ~]# lvdisplay /dev/test/lv_xxx_snap --- Logical volume --- LV Path /dev/test/lv_xxx_snap LV Name lv_xxx_snap VG Name test LV UUID ZjBpYF-2fg6-n6Wz-ehJd-Zagv-lg3y-HFmHjz LV Write Access read only LV Creation host, time test-centos7-node1, 2020-01-11 03:18:29 -0500 LV snapshot status active destination for xxx LV Status available # open 0 LV Size 12.00 GiB Current LE 1536 COW-table size 1.00 GiB COW-table LE 128 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 [root@test-centos7-node1 ~]#
说明:咱们建立好快照,可用lvdisplay 指定快照对应设备路径来查看快照的详情,这个同查看逻辑卷的详情用法一致。能够看到该快照是用于xxx 逻辑卷的快照性能
3)建立挂载目录挂载快照ui
[root@test-centos7-node1 ~]# mkdir /snap [root@test-centos7-node1 ~]# mount /dev/test/lv_xxx_snap /snap mount: /dev/mapper/test-lv_xxx_snap is write-protected, mounting read-only [root@test-centos7-node1 ~]# ls /snap/ fstab inittab lost+found [root@test-centos7-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 46G 1.6G 45G 4% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.7M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 2.0G 135M 1.9G 7% /boot tmpfs 378M 0 378M 0% /run/user/0 /dev/mapper/test-xxx 9.8G 37M 9.2G 1% /mnt /dev/mapper/test-lv_xxx_snap 9.8G 37M 9.2G 1% /snap [root@test-centos7-node1 ~]#
说明:挂载上快照,咱们发现快照的大小和被作快照的大小是一致的,使用量什么的都是一致的,上面不是说快照里面存放的是被修改前的数据吗,怎么有数据了呢,这是由于咱们看到快照里面的数据不是快照自己的数据,是共享其原LV里的数据,因此咱们是能够看到的,之因此能看到是系统把原有的LV数据镜像到快照里,让咱们感受里面是有东西的,就是告诉咱们快照作好了,别担忧。这里须要注意一点,若是原LV的文件系统上xfs文件系统,挂载的时候可能出现挂载不上的状况,缘由是快照的UUID和原LV的UUID相同,xfs的文件系统默认挂载选项会检查UUID,若是冲突它会不让你挂载的,这个时候咱们挂载须要指定其选项不检查UUID ,用 mount -o 来指定其挂载选项 nouuid 表示挂载不检查uuid;本人是把LV的文件系统格式化成ext4,因此挂载的时候没有加选项是能够挂载上去的;若是建立快照时没有指定为只读属性,那么挂载的时候建议你们加上挂载选项为只读,这样挂载上的快照才能不被修改的可能。this
4)修改原LV里的文件,看看快照卷里的文件是否有更改
[root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# echo "this is test file " > /mnt/fstab [root@test-centos7-node1 ~]# cat /mnt/fstab this is test file [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
说明:发现没有咱们修改原LV里的数据后,快照里边的对应的文件内容没有发生变化,因此快照里边永远保存的是作快照那一刻的数据状态状况,中间怎么修改它都只保存最老的版本,LV里面保存最新版本的状态,这里须要提醒的是快照虽然有备份的效果,可是它不能代替备份,若是vg怀了,那么逻辑卷和快照都将失效。
3、快照还原
1) 取消逻辑卷和快照的挂载
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt /dev/mapper/test-lv_xxx_snap 10190100 36896 9612536 1% /snap [root@test-centos7-node1 ~]# umount /mnt [root@test-centos7-node1 ~]# umount /snap/ [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 [root@test-centos7-node1 ~]#
说明:还原就是把快照和原LV合并,因此二者都必须是处于非挂载的状态
2)合并逻辑卷和快照,进行数据还原
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-a-s--- 12.00g [root@test-centos7-node1 ~]# lvconvert --merge /dev/test/lv_xxx_snap Merging of volume test/lv_xxx_snap started. test/xxx: Merged: 100.00% [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]#
说明:合并快照和逻辑卷后,快照的的使命就完成了,固然快照也就没有存在的意义,系统会把快照给删除掉,在centos6上作合并是可看到删除快照成功的提示。咱们指定合并的快照就能够了,由于快照里记录了原LV是哪个,因此合并时不用在指定其原LV
3)挂载LV 查看数据
[root@test-centos7-node1 ~]# mount /dev/test/xxx /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
说明:能够看到fstab文件已经还原到被修改前的状态。这种方式是利用快照,还原到原有LV里,若是须要还原到其余LV里 这个时候就需先要把快照里的东西给备份出来,而后再复制给到其余LV里便可,固然这种方式就不是利用快照来还原,它的本质就是文件复制到另外的地方,和快照没有关系。快照只是记录快照生成时的数据状态,生产中建议利用快照来记录快照生成当时的数据状态,而后在把快照挂载到系统上,而后慢慢拷贝数据进行备份,拷贝完后删除快照。通常状况快照不易在系统上生存太长时间,时间越长,影响磁盘的I/O写入,可能影响服务器的性能。建议把快照里的数据拷完就删除快照。