1. 程式人生 > >cinder-backup詳細介紹

cinder-backup詳細介紹

更改 eight 數據壓縮 containe 條件 load 目錄 臨時 區塊

首先介紹Snapshot

snapshot可以為volume創建快照,快照中保存了volume當前的狀態,此後可以通過snapshot回溯

主要采用了Copy On Write算法。進行快照時,不牽涉到任何檔案復制動作,它所作的只是通知服務器將目前有數據的磁盤區塊全部保留起來,不被覆寫。接下來檔案修改或任何新增、刪除動作,均不會覆寫原本數據所在的磁盤區塊,而是將修改部分寫入其它可用的磁盤區塊中。

COW技術在很多場景都有應用,下圖為編程中創建子進程時采用COW技術的場景(思想一致):

只讀情況:

技術分享

針對上述場景,當父子進程中有更改相應段的行為發生時,再為子進程相應的段分配物理空間,如下:

寫情況:

技術分享

資源的復制只有在需要寫入的時候才進行,此前,是以只讀方式共享,使實際的拷貝被推遲到實際發生寫入的時候。

再回到volume的snapshot中,根據上述其它場景的例子,此處的volume即對應上述的物理空間,而snapshot相當於指向虛擬空間的指針,是依賴於volume的,無法獨立存在。

Backup相關

Backup與Snapshot區別

1. snapshot依賴源volume,不能獨立存在;而backup不依賴vilume,即便源volume不存在了,仍可以restroe。

2. snapsot與源volume通常存放在一起,由同一個volume provider管理;backup存放在獨立的備份設備中,有自己的備份方案和實現。

3. backup具有容災功能;而snapshot則提供volume provider內便捷的回溯功能。

分析backup創建流程

以NFS為backend時:

1. 啟動backup操作,mount NFS

2. 創建volume的臨時快照

3. 創建存放backup的container目錄

4. 對臨時快照數據壓縮並保存到container目錄中

5. 創建保存sha256(加密)文件和metadata文件

6. 刪除臨時快照

以LVM為backend時:

1. 創建volume的臨時快照

2. 創建一個設備new_lv

3. 依據快照將數據從源卷拷貝到new_lv中

4. 刪除臨時快照

以ceph為backend時:

1. 判斷源卷是否為RBD卷,如果源卷為RBD卷,則使用增量備份,否則使用全量備份。

Ceph作為backend

按照cinder-volume所用的backend分兩種情況介紹:一種是使用非RBD作為backend,另一種是使用RBD作為backend。

1. cinder-volume使用非RBD作為backend

這種情況下比較簡單,並且僅支持全量備份。在創建備份時,首先創建一個base backup image,然後每次從源卷讀入chunk_size(即backup_ceph_chunk_size,默認是128MB)大小的數據,寫入到backup image,直到把整個源卷都復制完。註意,這裏不支持對chunk的壓縮。因為volume上的數據都會寫入到創建的這個backup image上去,也就是說volume和backup是一對一的,因此也不需要metadata文件。

2. cinder-volume使用RBD作為backend

在這種情況下,即cinder-volume和cinder-backup都是用rbd作為backend,是支持增量備份的。增量備份的實現完全依賴於ceph處理差量文件的特性,所謂ceph處理差量文件的能力,即ceph可以將某個rbd image不同時刻的狀態進行比較,並且將其差量導出成文件。另外,ceph也可以將這個差量文件導入到某個image中。

差量文件的生成與導入

生成差量文件的三種方式

技術分享

三種方式對應命令及簡要描述:

rdb export-diff volumes/image1 diff1 image1創建時到此時的diff
rbd export-diff volumes/image1@snap1 diff2 image1創建時與snap1的diff
rbd export-diff volumes/image1-from-snap snap1 diff3

image1此時(snap2)與snap1的diff

導入差量文件的三種方式(前提,先創建一個image2,然後將diff文件導入image2):

rbd import-diff diff1 volumes/image2 image2和生成diff1時的image1相同
rbd import-diff diff2 volumes/image2 image2和創建snap1時的image1相同
rbd import-diff diff3 volumes/image2 image2和創建snap1後(創建snap2時)的image1相同

備份的實現

依據上述差量文件的生成與導入的操作特性實現備份,這裏主要說明ceph增量備份的實現:

技術分享

技術分享

備份的恢復

diff方式的恢復

利用ceph的特性,首先找到第一次備份時創建的base image和所選備份的snapshot,利用上述第二種生成差量文件的方式生成diff文件,將diff文件導入到新的volume即完成volume恢復。

1)獲取恢復備份的起點

2)如果能則進行增量恢復

這裏進行增量恢復的條件如下

a. 要恢復的卷必須是rbd

b. 要恢復的卷必須沒有任何內容

c. 備份卷必須存在

d. 備份卷的恢復點(快照)必須存在

e. 要恢復的卷和備份卷的源卷是不同的

3)如果不能,則進行全量恢復

非diff方式的恢復

全量恢復,每次從備份讀入chunk_size的數據,寫入到對應的volume中,直到復制完整個備份。沒有metadata文件,也不支持解壓。

cinder-backup詳細介紹