欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenStack虛擬機快照和增量備份實現(xiàn)方法

 更新時間:2022年04月04日 09:36:26   作者:luohaixian  
快照針對要保存的數(shù)據(jù)分為內(nèi)存快照和磁盤快照,內(nèi)存快照就是保存當(dāng)前內(nèi)存的數(shù)據(jù),磁盤快照就是保存硬盤的數(shù)據(jù),這篇文章主要介紹了OpenStack虛擬機快照和增量備份實現(xiàn),需要的朋友可以參考下

1 快照的概念

一般對快照的理解就是能夠?qū)⑾到y(tǒng)還原到某個瞬間,這就是快照的作用。
快照針對要保存的數(shù)據(jù)分為內(nèi)存快照和磁盤快照,內(nèi)存快照就是保存當(dāng)前內(nèi)存的數(shù)據(jù),磁盤快照就是保存硬盤的數(shù)據(jù)。
快照針對保存方式又分為內(nèi)部快照和外部快照。
內(nèi)部快照:是指快照信息和虛擬機存在同一個qcow2鏡像中,使用單個的 qcow2 的文件來保存快照和快照之后的改動。這種快照是 libvirt 的默認行為,現(xiàn)在的支持很完善(創(chuàng)建、回滾和刪除),但是只能針對 qcow2 格式的磁盤鏡像文件,而且其過程較慢等。
外部快照:是指做快照時原虛擬機的disk將變?yōu)閞eadonly的模板鏡像,然后會新建一個qcow2文件來記錄與原模板鏡像的差異數(shù)據(jù),外部快照的結(jié)果是形成一個qcow2文件鏈:original <- snap1 <- snap2 <- snap3

2 主流libvirt快照實現(xiàn)介紹

2.1 libvirt的內(nèi)部快照操作

以下是利用libvirt的virsh工具來創(chuàng)建一些內(nèi)置快照:
創(chuàng)建虛擬機快照:

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

其實這些其實現(xiàn)的本質(zhì)是在鏡像內(nèi)做一些標記,內(nèi)存狀態(tài)數(shù)據(jù)則保存到某一個磁盤鏡像文件內(nèi),使用以下命令可以看到在該鏡像做的標記:

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

2.2 libvirt的外部快照操作

可以使用 “--memspec” 和 “--diskspec” 參數(shù)來給內(nèi)存和磁盤外部快照。這時候,在獲取內(nèi)存狀態(tài)之前需要 Pause 虛機,就會產(chǎn)生服務(wù)的 downtime。
比如:virsh snapshot-create-as instance-00000001 livesnap2 --memspec /home/livesnap2mem,snapshot=external --diskspec vda,snapshot=external
virsh snapshot-dumpxml instance-00000001 livesnap2可以看到具體外置存放位置信息
但是libvirt現(xiàn)在還不支持回滾和刪除外置快照,如下
virsh snapshot-revert instance-00000001 livesnap2
error: unsupported configuration: revert to external snapshot not supported yet

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

OpenStack中對虛擬機的快照其實是生成一個完整的鏡像,保存在glance服務(wù)中,并且可以利用這個快照鏡像生成新的虛擬機,與原本的虛擬機并沒有什么關(guān)系。而比較主流的快照實現(xiàn)應(yīng)該是有快照鏈的,且包含內(nèi)存快照和磁盤快照。
OpenStack中的備份其實跟快照沒啥區(qū)別,調(diào)用的都是同一個生成鏡像的接口,更多的備份是cinder對磁盤的備份,沒有對整個虛擬機進行備份的接口。

4 使用ceph實現(xiàn)OpenStack虛擬機快照功能

(1)首先是配置OpenStack的存儲環(huán)境是Ceph存儲,因為我們要借助ceph的一些特性來實現(xiàn)快照


(2)從上面我們可以知道做快照,主要是對磁盤做快照和對內(nèi)存數(shù)據(jù)進行保存,如果是ceph環(huán)境,那么OpenStack虛擬機的根磁盤和磁盤在ceph下就是一個塊設(shè)備,比如根磁盤一般就是保存在vms池中,其路徑是vms/<instance_id>_disk,而磁盤一般就是保存在volumes池中,其路徑是volumes/volume-<volume_id>;對于塊設(shè)備,ceph可以使用rbd命令來對塊設(shè)備做快照,比如我們對虛擬機根磁盤做快照:

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

snapshot_name是快照名
回滾時則執(zhí)行:

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

這其實可以理解為是塊設(shè)備的內(nèi)部快照方式

(3)對于內(nèi)存數(shù)據(jù),我們可以使用libvirt的save接口將內(nèi)存狀態(tài)數(shù)據(jù)保存到一個文件中,為了保存到塊設(shè)備中,我們可以這樣做:
<1>新建一個塊設(shè)備(這里假設(shè)在snapshots池中創(chuàng)建1G大小的名為test的塊設(shè)備):

rbd create --size 1024 snapshos/test

<2>將塊設(shè)備map到物理主機中

rbd map snapshos/test
/dev/rbd0

可以看到會輸出一個磁盤設(shè)備符,使用lsblk命令則能看到該設(shè)備

<3>格式化該設(shè)備并掛載到某個目錄下

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

然后我們就可以向save接口傳入test_dir目錄下的一個文件名,其會將內(nèi)存狀態(tài)數(shù)據(jù)保存到該文件中,接著umount掉該塊設(shè)備:

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

這樣內(nèi)存數(shù)據(jù)也一樣保存到塊設(shè)備中了,要使用時再掛載該塊設(shè)備訪問即可,回滾內(nèi)存對應(yīng)的是向libvirt的restore接口傳入該內(nèi)存數(shù)據(jù)文件

注意點:
(1)libvirt的save接口調(diào)用保存完內(nèi)存狀態(tài)數(shù)據(jù)后,虛擬機會關(guān)閉,這時可以執(zhí)行restore接口虛擬機回滾回去
(2)回滾虛擬機時,先將該虛擬機的vm_state狀態(tài)置為ACTIVE,否則回滾會不成功

5 使用ceph實現(xiàn)OpenStack虛擬機增量備份功能

這里說兩個備份名詞,全量備份和增量備份。
全量備份:保存的是整個虛擬機的完整的數(shù)據(jù)
增量備份:保存的只是跟上一次相比有改動的數(shù)據(jù)
需要先做一次全量備份后,后續(xù)才能做增量備份

5.1 創(chuàng)建備份

這里以虛擬機的根磁盤 vms/<instance_id>_disk為例子做增量備份的操作演示:
(1)做一次全量備份
先對該塊設(shè)備做一次快照:

rbd snap create vms/<instance_id>_disk@time1

然后導(dǎo)出差異數(shù)據(jù):

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

(2)再做一次增量備份
先對該塊設(shè)備做一次快照:

rbd snap create vms/<instance_id>_disk@time2 

導(dǎo)出time1到time2之間這段時間該磁盤的差異數(shù)據(jù):

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

5.2 恢復(fù)備份

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

rbd snap rollback vms/<instance_id>_disk@time1 

(2)該磁盤已經(jīng)被刪掉了,要恢復(fù)該磁盤到time2的時間點:
<1>創(chuàng)建一個塊設(shè)備(大小跟刪除的那塊一樣大小,這里以1G為例子)

rbd create --size 1024 vms/restore_disk

<2>導(dǎo)入差異數(shù)據(jù),注意這里的導(dǎo)入順序,先恢復(fù)到time1,再恢復(fù)到time2

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

這時這塊塊設(shè)備就恢復(fù)回time2的狀態(tài)了

友情經(jīng)驗點:
(1)上面的操作都是自己創(chuàng)建一個塊設(shè)備然后進行回滾,那怎么把這塊給到OpenStack的虛擬機使用呢?在OpenStack中添加一個磁盤是先調(diào)用api.cinder.volume_create接口創(chuàng)建一個卷,然后調(diào)用api.nova.instance_volume_attach將該卷連接到虛擬機中,其實我們只要將它創(chuàng)建的塊設(shè)備替換成我們的就可以了,比如它生成的是volumes/volume-123,我們自己回滾好的是volumes/restore_disk,則先刪掉它的塊設(shè)備,然后重命名我們的塊設(shè)備:

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

(2)同理,如果我們要從備份文件中恢復(fù)到一個新的虛擬機,那么就先創(chuàng)建一個虛擬機,然后將它的根磁盤替換為我們恢復(fù)過數(shù)據(jù)的根磁盤,然后接著是替換硬盤,這樣我們便從備份文件中恢復(fù)到一個新的虛擬機了

到此這篇關(guān)于OpenStack虛擬機快照和增量備份實現(xiàn)的文章就介紹到這了,更多相關(guān)OpenStack快照和增量備份內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論