首頁 > 軟體

OpenStack虛擬機器器快照和增量備份實現方法

2022-04-04 13:00:36

1 快照的概念

一般對快照的理解就是能夠將系統還原到某個瞬間,這就是快照的作用。
快照針對要儲存的資料分為記憶體快照和磁碟快照,記憶體快照就是儲存當前記憶體的資料,磁碟快照就是儲存硬碟的資料。
快照針對儲存方式又分為內部快照和外部快照。
內部快照:是指快照資訊和虛擬機器器存在同一個qcow2映象中,使用單個的 qcow2 的檔案來儲存快照和快照之後的改動。這種快照是 libvirt 的預設行為,現在的支援很完善(建立、回滾和刪除),但是隻能針對 qcow2 格式的磁碟映象檔案,而且其過程較慢等。
外部快照:是指做快照時原虛擬機器器的disk將變為readonly的模板映象,然後會新建一個qcow2檔案來記錄與原模板映象的差異資料,外部快照的結果是形成一個qcow2檔案鏈:original <- snap1 <- snap2 <- snap3

2 主流libvirt快照實現介紹

2.1 libvirt的內部快照操作

以下是利用libvirt的virsh工具來建立一些內建快照:
建立虛擬機器器快照:

virsh snapshot-create-as --name test001 --description 'abc' instance-00000001

列出虛擬機器器的快照:

virsh snapshot-list instance-00000001

檢視某個快照資訊:

virsh snapshot-dumpxml instance-00000001 test001

回滾到某個快照:

virsh snapshot-revert instance-00000001 test001

刪除某個快照:

virsh snapshot-delete instance-00000001 test001

其實這些其實現的本質是在映象內做一些標記,記憶體狀態資料則儲存到某一個磁碟映象檔案內,使用以下命令可以看到在該映象做的標記:

qemu-img info /var/lib/nova/instances/87985777-f83d-4fff-9723-025c2b889895/disk

2.2 libvirt的外部快照操作

可以使用 “--memspec” 和 “--diskspec” 引數來給記憶體和磁碟外部快照。這時候,在獲取記憶體狀態之前需要 Pause 虛機,就會產生服務的 downtime。
比如:virsh snapshot-create-as instance-00000001 livesnap2 --memspec /home/livesnap2mem,snapshot=external --diskspec vda,snapshot=external
virsh snapshot-dumpxml instance-00000001 livesnap2可以看到具體外接存放位置資訊
但是libvirt現在還不支援回滾和刪除外接快照,如下
virsh snapshot-revert instance-00000001 livesnap2
error: unsupported configuration: revert to external snapshot not supported yet

3 OpenStack原生虛擬機器器快照和備份

OpenStack中對虛擬機器器的快照其實是生成一個完整的映象,儲存在glance服務中,並且可以利用這個快照映象生成新的虛擬機器器,與原本的虛擬機器器並沒有什麼關係。而比較主流的快照實現應該是有快照鏈的,且包含記憶體快照和磁碟快照。
OpenStack中的備份其實跟快照沒啥區別,呼叫的都是同一個生成映象的介面,更多的備份是cinder對磁碟的備份,沒有對整個虛擬機器器進行備份的介面。

4 使用ceph實現OpenStack虛擬機器器快照功能

(1)首先是設定OpenStack的儲存環境是Ceph儲存,因為我們要藉助ceph的一些特性來實現快照


(2)從上面我們可以知道做快照,主要是對磁碟做快照和對記憶體資料進行儲存,如果是ceph環境,那麼OpenStack虛擬機器器的根磁碟和磁碟在ceph下就是一個塊裝置,比如根磁碟一般就是儲存在vms池中,其路徑是vms/<instance_id>_disk,而磁碟一般就是儲存在volumes池中,其路徑是volumes/volume-<volume_id>;對於塊裝置,ceph可以使用rbd命令來對塊裝置做快照,比如我們對虛擬機器器根磁碟做快照:

rbd snap create vms/<instance_id>_disk@<snapshot_name>

snapshot_name是快照名
回滾時則執行:

rbd snap rollback vms/<instance_id>_disk@<snapshot_name>

這其實可以理解為是塊裝置的內部快照方式

(3)對於記憶體資料,我們可以使用libvirt的save介面將記憶體狀態資料儲存到一個檔案中,為了儲存到塊裝置中,我們可以這樣做:
<1>新建一個塊裝置(這裡假設在snapshots池中建立1G大小的名為test的塊裝置):

rbd create --size 1024 snapshos/test

<2>將塊裝置map到物理主機中

rbd map snapshos/test
/dev/rbd0

可以看到會輸出一個磁碟裝置符,使用lsblk命令則能看到該裝置

<3>格式化該裝置並掛載到某個目錄下

mkfs.xfs /dev/rbd0
mkdir test_dir
mount /dev/rbd0 test_dir

然後我們就可以向save介面傳入test_dir目錄下的一個檔名,其會將記憶體狀態資料儲存到該檔案中,接著umount掉該塊裝置:

umount -f /dev/rbd0
rbd unmap /dev/rbd0

這樣記憶體資料也一樣儲存到塊裝置中了,要使用時再掛載該塊裝置存取即可,回滾記憶體對應的是向libvirt的restore介面傳入該記憶體資料檔案

注意點:
(1)libvirt的save介面呼叫儲存完記憶體狀態資料後,虛擬機器器會關閉,這時可以執行restore介面虛擬機器器回滾回去
(2)回滾虛擬機器器時,先將該虛擬機器器的vm_state狀態置為ACTIVE,否則回滾會不成功

5 使用ceph實現OpenStack虛擬機器器增量備份功能

這裡說兩個備份名詞,全量備份和增量備份。
全量備份:儲存的是整個虛擬機器器的完整的資料
增量備份:儲存的只是跟上一次相比有改動的資料
需要先做一次全量備份後,後續才能做增量備份

5.1 建立備份

這裡以虛擬機器器的根磁碟 vms/<instance_id>_disk為例子做增量備份的操作演示:
(1)做一次全量備份
先對該塊裝置做一次快照:

rbd snap create vms/<instance_id>_disk@time1

然後匯出差異資料:

rbd export-diff vms/<instance_id>_disk@time1 time1_diff_file

(2)再做一次增量備份
先對該塊裝置做一次快照:

rbd snap create vms/<instance_id>_disk@time2 

匯出time1到time2之間這段時間該磁碟的差異資料:

rbd export-diff vms/<instance_id>_disk@time2 --from-snap vms/<instance_id>_disk@time1 time2_diff_file

5.2 恢復備份

(1)如果該磁碟還存在,則直接用rbd snap rollback回滾就可以了,比如要回滾到time1這個時間點:

rbd snap rollback vms/<instance_id>_disk@time1 

(2)該磁碟已經被刪掉了,要恢復該磁碟到time2的時間點:
<1>建立一個塊裝置(大小跟刪除的那塊一樣大小,這裡以1G為例子)

rbd create --size 1024 vms/restore_disk

<2>匯入差異資料,注意這裡的匯入順序,先恢復到time1,再恢復到time2

rbd import-diff time1_diff_file vms/restore_disk
rbd import-diff time2_diff_file vms/restore_disk

這時這塊塊裝置就恢復回time2的狀態了

友情經驗點:
(1)上面的操作都是自己建立一個塊裝置然後進行回滾,那怎麼把這塊給到OpenStack的虛擬機器器使用呢?在OpenStack中新增一個磁碟是先呼叫api.cinder.volume_create介面建立一個卷,然後呼叫api.nova.instance_volume_attach將該卷連線到虛擬機器器中,其實我們只要將它建立的塊裝置替換成我們的就可以了,比如它生成的是volumes/volume-123,我們自己回滾好的是volumes/restore_disk,則先刪掉它的塊裝置,然後重新命名我們的塊裝置:

rbd rm volumes/volume-123
rbd rename volumes/restore_disk volumes/volume-123

(2)同理,如果我們要從備份檔案中恢復到一個新的虛擬機器器,那麼就先建立一個虛擬機器器,然後將它的根磁碟替換為我們恢復過資料的根磁碟,然後接著是替換硬碟,這樣我們便從備份檔案中恢復到一個新的虛擬機器器了

到此這篇關於OpenStack虛擬機器器快照和增量備份實現的文章就介紹到這了,更多相關OpenStack快照和增量備份內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com