1. 程式人生 > 其它 >快照和備份的區別、快照原理(一)——COW技術

快照和備份的區別、快照原理(一)——COW技術

快照原理

1、快照和備份的區別

快照和備份是有區別的,在講他們之前我們首先要知道邏輯錯誤和物理錯誤。

邏輯錯誤:人為通過一些命令或者操作,導致資料丟失或者檔案損壞的。如果這時候有備份,沒有快照,我們此時的解決辦法是通過備份進行還原操作。但是如果我們僅僅只是丟失了一個不重要的檔案,這時候通過備份來恢復的話,有點大動干戈,甚至可能還會對業務造成影響。 備份相對於快照來說是一個重量級的操作;如果這時候有快照的話,我們就可以通過快照直接還原,速度快且影響小。 

物理錯誤:硬碟損壞、磁碟壞道、主機板損壞等物理介質損壞。物理錯誤造成的資料丟失等通過快照是沒辦法恢復的。

所以備份可以解決邏輯錯誤和物理錯誤所產生的問題,快照只能解決邏輯錯誤產生得問題。備份業務比較大,所消耗的時間週期比較長,相對來說是重量級的,快照相對來說是輕量級的,這就是備份和快照的區別。

 

2、COW和ROW技術

提到快照,我們需要知道快照裡邊有兩種技術:cow 和 row

cow:copy on write.。寫時複製。cow技術主要應用在儲存LUN、裸裝置等儲存裝置。

row:  redirect on write。寫時重定向。row技術主要應用在我們的fusioncompute、vmware中。

 

3、COW技術

cow:寫時複製。寫的時候,去提前複製。

在說這個之前。我們需要先了解一些別的知識。我們知道我們的記憶體底層是資料塊,一個數據塊的預設大小是4K,一個數據塊有兩部分組成,header和body。heder部分儲存的是元資料,元資料就是描述資料的資料,例如資料的位置,id等,舉個例子,我們的個人資訊表就是我們的元資料,我們本身這個人就是資料。所以header中儲存的是元資料,body中儲存的是真實資料,header和body是一一指向關係。如下圖所示:

 

知道了資料塊之後我們在說檔案,檔案在系統中也分為兩部分,一部分叫inode,一部分叫block。inode: index node。索引node資訊,這裡邊存的也是元資料,block裡邊存的則是真實資料。他們之間也是指向關係。如下圖所示:

 

 

知道這個之後,我們再來說cow快照。如下圖所示,假設這就是我們的磁碟,左邊上邊是我們的inode,裡邊有12345,下邊是block,裡邊也有12345,因為inode和block是指向關係,所以12345之間是指向的,如圖左邊所示。如果這個時候我們來拍快照,我們拍的是什麼的?如圖右邊所示,這時候我們拍的只是inode,相當於複製了inode,假設這個快照叫snapshot 01,裡邊同樣的也有12345,它和block之間也會有一一指向關係。我們通常拍快照的過程很快,快照很快就拍好了,就是因為拍快照的過程我們只是複製了當前時間點的inode元資料(索引資料),並沒有複製真正的資料。

 

拍完照之後,資料發生改變,資料改變包括刪除、更改、新增三種情況:

刪除:我們把inode中的資料刪掉了,會發生什麼情況呢?如下圖所示,假設我們刪除inode中的5,快照會怎麼辦呢?當我們刪除inode中的資料5時,快照什麼都不做,因為snapshot1中的inode和block還是一一對應關係,什麼都沒有改變,所以快照什麼都不用做。

 

更改: 如果我們把inode中的5改成6呢?如下圖所示,它會把原來bolck中的5先複製出來,然後在block中的對應位置寫入6,覆蓋之前的5(這個過程就是寫時複製),最後更改snapshot1中的索引指標指向5。那麼把5複製出來是複製到什麼地方呢?當我們在拍快照的時候,它會預設生成一個cow區域,每拍一個快照,就會生成一個cow區域,5就是複製到了cow區域中,可以說cow區域就是用來存放快照中的索引所對應的改變的資料的。另外整個snapshot1快照其實也是存在於cow區域中的。最後結果就是如下圖所示。那麼如果我們繼續修改呢?比如把6在改成7,這個時候快照會有變化嗎?答案是不會的,cow只關注snapshot中的索引資料,snapshot中有什麼,cow才會做什麼,所以因為沒有6,即使6在怎麼修改,快照也不會有任何變化。

 

  

新增:如果我們新增了資料應該怎麼辦呢?假設我們新增了資料7,8,inode中寫入7,8,如下圖所示。因為inode和block是一一對應關係,所以這時候block中會產生兩個空塊,然後snapshot1會把這兩個空快拷貝到cow區域,然後在往這兩個空快中寫入7,8。空快的作用是,到時候還原快照時,因為是沒有78資料的,所以空塊可以直接把block中的78覆蓋掉。

 

 

 這裡要注意的是,當我們沒有快照時,我們平常所說的刪除檔案是把索引和底層block中的資料都刪了,但是當有快照存在時,我們所說的刪除資料只是刪除了索引資料,真正底層block中的資料是不會被刪除的。

 

 

4、COW實驗

下面我們進行一個實驗來演示COW快照技術

(1)我們建立一個3G的LV,把它掛載在data目錄下,這個LV使用了240M的空間。然後我們用 lvcreat -L 32M -s -n snap data /dev/vg0/data為這個data目錄建立一個32M大小的快照。我們可以看到,雖然data目錄有3個G,且有240M的資料,我們僅用32M小的空間來建立快照也能建立成功。這就是我們前邊說的快照只是對索引元資料做了快照,並沒有對底層的block資料做快照。

 (2)然後我們用lvdisplay /dev/vg0/snap_data命令來檢視這個快照lv的情況。我們可以看到COW區域是32M,即我們建立快照時給它的大小,而快照的大小隻佔COW的0.04%。我們前邊說到,每建立一個快照,就會生成一個COW區,而快照本身也是存在於COW區裡邊,就是這個意思。所以說快照也是cow區的一部分,快照只佔很小的一部分。

 

 (3)我們把這個快照lv也掛載到一個目錄下邊,之後我們再用df -Th命令檢視。我們可以看到快照lv掛載的目錄snap和我們做快照的data目錄大小和使用率都是一模一樣的,進去看裡邊的檔案內容也一模一樣。

 

(4)還原快照。假設我們把data目錄裡邊的檔案刪除了一部分,我們需要通過snap快照來還原。該怎麼做呢。這裡我們需要使用dump命令,需要提前安裝dump相關的包。我們輸入命令:dump -0 -f /tmp/snapdata.dump  /snap/ 先將快照建立成一個dump檔案。

 

然後我們輸入restore -rf /tmp/snapdata.dump命令來還原快照。

 

 5、cow技術總結

cow快照技術寫效能不怎麼好,因為他要寫兩次,比如更改資料的時候,先複製一次,在寫入一次,這就寫了兩次,所以cow快照寫效能不好。而且快照越多,效能越差,因為快照越多,COW區域就越多,自然而然效能就會變差。

那麼ROW技術是怎樣的呢?我們下一篇在給大家講解ROW技術。

 

 

 

 

 

 

 

 

 

#########################################################################################################題外話

FC平臺虛擬機器中Tools的作用:

沒有tools的話,虛擬機器連網絡卡都沒有。我們也沒辦法在介面上看到虛擬機器的CPU、記憶體資訊等情況。也沒辦法做一致性快照,我們可以看到tools的重要性。

tools可以給我們提供驅動、監控等。