快照原理
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可以給我們提供驅動、監控等。