cinder-backup詳細介紹
首先介紹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詳細介紹