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備份或其他備份操作,這樣既不會影響原始數據也能夠達到備份的需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM