• LVM快照备份与恢复


    简介

      最近在做数据备份方面的工作,用到两个工具,一个是dd,而另一个是lvm的快照(snapshot)。由于数据比较大,直接是用dd非常耗时,而lvm的快照可以在几秒内轻松搞定,而且可以达到实时的效果,但是使用lvm快照的代价就是以空间换取时间。 
    下面我们就先来了解下原理: 
    LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里。

      注意:采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。

    实例

    需求

    lvm创建过程在此就不详述,以下是我现有的lvm,其中lv_image就是我们需要备份的逻辑卷。

    [root@test ~]# lvs
      LV           VG            Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
      lv_image     vg_image      -wi-ao----   8.00t                                                                                                                                 
      LogVol00     vg_test -wi-ao----   7.81g                                             
      LogVol01     vg_test -wi-ao---- 101.70g   
    • 1
    • 2
    • 3
    • 4
    • 5

    实现

    前提:lvm快照所在的vg必须和备份源(也就是lv_image)是同一个,因此我们需要确认vg_image的剩余空间,若不足需扩展。

    1.确认vg_image空间

    [root@test ~]# vgs
      VG            #PV #LV #SN Attr   VSize   VFree  
      vg_image        2   1   0 wz--n-   8.29t 4.00m
      vg_test         1   2   0 wz--n- 109.51g      0 
    • 1
    • 2
    • 3
    • 4

    由以上看出vg_image的剩余空间(VFree)为4m,显然空间不够。

    2.vg空间扩展

    此处,你可能有一个问题“vg需要扩展多大的空间?”前面提到过cow的原理,snapshot越大,我们在snapshot的周期内做的就越多,但是我们空间有限,因此我们一般使用snapshot的空间是原始卷的10%左右。

    现在我们有个2T大小的备份盘/dev/sdf1使用。

    [root@test ~]# vgextend vg_image /dev/sdf1
      Volume group "vg_image" successfully extended
    [root@test ~]# pvs
      PV         VG            Fmt  Attr PSize   PFree  
      /dev/sda2  vg_test       lvm2 a--  109.51g      0 
      /dev/sdc1  vg_image      lvm2 a--    8.00t   4.00m
      /dev/sdf1  vg_image      lvm2 a--    2.00t   2.00t
    [root@test ~]# vgs
      VG            #PV #LV #SN Attr   VSize   VFree  
      vg_image        2   1   0 wz--n-   2.00t   2.00t
      vg_picture118   1   2   0 wz--n- 109.51g      0 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.创建快照

    [root@test ~]# lvcreate -L 300GB -s -n lv_image_snap /dev/vg_image/lv_image 
    • 1

    其中: 
    -L 300G 表示此次创建快照大小 
    -s 表示创建快照 
    -n lv_image_snap 表示新的快照名为lv_image_snap 
    /dev/vg_image/lv_image 为要创建快照的逻辑卷

    [root@test ~]# lvs
      LV           VG            Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
      lv_image     vg_image      -wi-ao----   8.00t                                                                                        
      lv_image_snap vg_image     -swi-a---- 300.00g   lv_image  0                                        
      LogVol00     vg_test -wi-ao----   7.81g                                             
      LogVol01     vg_test -wi-ao---- 101.70g   
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    至此,我们的快照已经创建完毕,只需将其挂载即可。 
    mount /dev/vg_image/lv_image_snap /mnt 
    另,“Data%”部分的数据会随着源逻辑卷的数据增大而增大,达到100%后快照将无法使用,需要进行扩展。在创建快照前,最好将源逻辑卷挂载成只读。

    4.删除逻辑卷 
    lvremove /dev/vg_image/lv_image_snap 
    vgreduce vg_image /dev/sdf1 
    pvremove /dev/sdf1

    快照还原

    在此以上述备份为基础:

    #确保/data拥有足够的空间
    dd if=/dev/vg_image/lv_image_snap of=/data/recover.img
    dd if=/data/recover.img of=/dev/vg_new/lv_new
    rm /data/recover.img
    lvremove /dev/vg_image/lv_image_snap
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:虽然snapshot小,但是通过snapshot备份出来的空间一定要足够大,因为它的数据和源lvm的数据一样大。

    总结

      通过使用lvm的快照我们可以轻松的备份数据,由于snapshot和源lvm的关系,snapshot只能够临时使用,不能脱离源lvm而存在;因此做到数据的万无一失,我们可以在snapshot的基础上进行dd备份或其他备份操作,这样既不会影响原始数据也能够达到备份的需求。

  • 相关阅读:
    动手动脑及类的创建
    动手动脑-Java重载
    方法的动手动脑
    文本单词数测试
    动手动脑
    springmvc使用fastjson
    springmvc之发送json数据自动转Java对象接收
    springmvc之拦截器
    基于xml配置springmvc案例
    springmvc之异常处理
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/9363409.html
Copyright © 2020-2023  润新知