RHEL6 snapshot快照原理及實驗
LVM對lv提供了快照“snapshot”備份功能,這種功能也只對LVM 有效。snapshot有多種實現方法,這里只談談“寫時復制COW”,不是奶牛哦,是“Copy-On-Write”
當一個 snapshot創(chuàng)建的時候,僅拷貝原始卷里的源數據,這不是物理上的數據拷貝,因此snapshot的創(chuàng)建特別快,當原始卷里的數據有寫入時,備份卷開 始記錄原始卷哪些數據發(fā)生了變化,然后在原始卷新數據覆蓋舊數據時,將舊數據拷貝到snapshot的預留空間里,起到備份數據的作用,就保證了所有數據 和創(chuàng)建備份卷之前的數據一致性。
而對于snapshot的讀操作,如果是讀取數據塊是沒有修改過的,那么會將讀操作直接重定向到原始卷上,如果是要讀取已經修改過的塊,那么就讀取拷貝到snapshot中的塊。所以當原始卷破壞了之后還能用snapshot備份的數據還原。
參考一份51CTO 【asram先生】的解釋吧:
【鏡像分 離,是為了讓鏡像卷保持拆分一瞬間的狀態(tài),而不再繼續(xù)被寫入數據。而拆分之后,主卷所做的所有寫IO動作,會以bitmap的方式記錄下來。bitmap 就是一份位圖文件,文件中每個位都表示卷上的一個塊(扇區(qū),或者由多個扇區(qū)組成的邏輯塊),如果這個塊在鏡像分離之后,被寫入了數據,則程序就將 bitmap文件中對應的位從0變成1。待備份完成之后,可以將鏡像關系恢復,此時主卷和鏡像卷上的數據是不一致的,需要重新做同步。程序搜索 bitmap中所有為1的位,對應到卷上的塊,然后將這些塊上的數據,同步到鏡像卷,從而恢復實時鏡像關系。
改變塊(changed block)
快照創(chuàng)建成功后,源和快照共享同一份物理數據拷貝,直到數據發(fā)生寫操作,此時源上老數據或者新增數據將被寫向新的存儲空間。為了記錄和追蹤塊的變化和復制 信息,需要一個位圖(bitmap),它用于確定實際拷貝數據的位置,以及確定從源還是目標來獲取數據。
并發(fā)(concurrent)
它與改變塊非常相似,但它總是物理地拷貝數據。當即時拷貝執(zhí)行時,沒有數據被復制。取而代之,它創(chuàng)建一個位圖來記錄數據的復制情況,并在后臺進行真正的數據物理復制。
寫時復制快 照在快照時間點之后,沒有物理數據復制發(fā)生,僅僅復制了原始數據物理位置的元數據。因此,快照創(chuàng)建非??欤梢运查g完成。然后,快照副本跟蹤原始卷的數據 變化(即原始卷寫操作),一旦原始卷數據塊發(fā)生寫操作,則先將原始卷數據塊讀出并寫入快照卷,然后用新數據塊覆蓋原始卷。這樣我們訪問快照卷上的數據仍舊 是寫操作前的,可以保證我們備份數據的一致性。】
檢驗一下snapshot的特點吧:
采取COW實現方式時,snapshot的大小并不需要和原始卷一樣大。那設置成多大呢?第一、根據原始卷數據的改變大小范圍來設置;第二、根據 原始卷數據的更新頻率來定。一旦 snapshot的空間記錄滿了原始卷塊變換的信息,那么這個snapshot就無法使用了。當然,如果你的snapshot大小和原始卷一樣大,甚至還 要大,那snapshot備份就絕對的不會崩潰啦。
下面就開始吧!
一、新建lv分區(qū),裝上一個系統(tǒng)(可以不用裝,其實這里只需要說明他是一個我們要備份的數據卷而已)
--->先查看一下vg空閑空間吧
[root@desktop21 /]# vgs
VG #PV #LV #SN Attr VSize VFree
vol0 2 4 1 wz--n- 55.22g 26.22g
--->還有26.22G,建一個3G的lv來裝系統(tǒng)吧,lv名稱syslv
[root@desktop21 /]# lvcreate -L 3G -n syslv vol0
Logical volume "syslv" created
[root@desktop21 /]# lvdisplay /dev/vol0/syslv
--- Logical volume ---
LV Name /dev/vol0/syslv
VG Name vol0
LV UUID xQXHqK-N3Oj-y9Z1-TBU6-hAsI-ek3V-PkmVmL
LV Write Access read/write
LV Status available
# open 0
LV Size 3.00 GiB (lv大小3G)
Current LE 96
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:6
--->ok,創(chuàng)建成功,接下來我就裝一個linux的簡易版吧,我就不上圖了,自己要測試的自己去試試
【注意:這個lv建立起來若作為安裝系統(tǒng)用的話就一定不能格式化了,它是作為硬盤用了哦,誰見過把硬盤拿來格式化了在裝系統(tǒng)的?他會警告無法識別的硬盤~】
。
。
。
二、創(chuàng)建snapshot
終于裝好了,我們來創(chuàng)建一個snapshot備份吧,和lv創(chuàng)建方法差不多,就多加一個參數-s
[root@desktop21 /]# lvcreate -s -n snapsyslv -L 50M /dev/vol0/syslv
Rounding up size to full physical extent 64.00 MiB
Logical volume "snapsyslv" created
[root@desktop21 /]# lvdisplay /dev/vol0/snapsyslv
--- Logical volume ---
LV Name /dev/vol0/snapsyslv
VG Name vol0
LV UUID snoXql-gI1Q-TSsF-F3LN-SyRI-HInY-8cZM3r
LV Write Access read/write
LV snapshot status active destination for /dev/vol0/syslv
LV Status available
# open 0
LV Size 3.00 GiB
Current LE 96
COW-table size 64.00 MiB (我的PE為32M,創(chuàng)建的只能是32的倍數)
COW-table LE 2
Allocated to snapshot 0.03% (使用率為0.03%)
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:7
--->ok,snapsyslv創(chuàng)建好了,64M,查看一下snapsyslv的詳細信息吧:
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 swi-a- 64.00m syslv 0.07
--->我們需要關心的就是上面的使用率0.07%,達到100%就釋放,snapshot就壞了,就沒用了。
三、改變原始卷的數據,查看備份卷的變化
1、登錄到syslv所在的系統(tǒng),新建文件測試
desktop64 login: root
Password:
[root@desktop64 ~]# dd if=/dev/zero of=testfile bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.0329396 s, 637 MB/s
--->好了,到我們的機子上看看快照的變化吧,刷新幾下看看
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 swi-a- 64.00m syslv 0.07
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 swi-a- 64.00m syslv 33.81
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 swi-a- 64.00m syslv 33.83
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 swi-a- 64.00m syslv 33.83
--->看到嗎?使用率為33.83%了,快照大小為64M,原始卷新建20M的文件,看是不是使用率為33%左右呢?^_^
2、新建大小為50M的吧,加上之前的20M,看看快照的變化呢
[root@desktop64 ~]# dd if=/dev/zero of=testfile bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.132893 s, 395 MB/s
--->刷新一下,看看快照變化吧
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 Swi-I- 64.00m syslv 100.00
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 Swi-I- 64.00m syslv 100.00
[root@desktop21 /]# lvs /dev/vol0/snapsyslv
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
snapsyslv vol0 Swi-I- 64.00m syslv 100.00
--->100%啦,查看一下快照的狀態(tài)?
[root@desktop21 /]# lvdisplay /dev/vol0/snapsyslv
--- Logical volume ---
LV Name /dev/vol0/snapsyslv
VG Name vol0
LV UUID snoXql-gI1Q-TSsF-F3LN-SyRI-HInY-8cZM3r
LV Write Access read/write
LV snapshot status INACTIVE destination for /dev/vol0/syslv (掛了)
LV Status available
# open 0
LV Size 3.00 GiB
Current LE 96
COW-table size 64.00 MiB
COW-table LE 2
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:7
--->看到嗎,INACTIVE(沒激活了),我們把它激活看看
[root@desktop21 /]# lvchange -ay /dev/vol0/snapsyslv
Can't change snapshot logical volume "snapsyslv"
--->Can't,不能激活了,快照不能用了哦,把它移除吧
[root@desktop21 /]# lvremove /dev/vol0/snapsyslv
Do you really want to remove active logical volume snapsyslv? [y/n]: y
Logical volume "snapsyslv" successfully removed
--->ok,已經移除了,現在可以再繼續(xù)創(chuàng)建快照了額^_^