楊皓森,胡曉勤,黃傳波
1(四川大學(xué) 計(jì)算機(jī)學(xué)院,成都 610065)
2(成都云祺科技有限公司,成都 610041)
近年來(lái),虛擬化與云計(jì)算的浪潮席卷了整個(gè)IT行業(yè),引領(lǐng)了IT基礎(chǔ)設(shè)施的發(fā)展以及產(chǎn)業(yè)的革新.OpenStack[1]是目前使用最為廣泛的開(kāi)源云計(jì)算平臺(tái),可幫助企業(yè)實(shí)現(xiàn)構(gòu)建自己的云基礎(chǔ)架構(gòu)服務(wù).OpenStack可利用多種虛擬化平臺(tái)提供虛擬機(jī)服務(wù),如Vmware、KVM[2]等,虛擬機(jī)在OpenStack中會(huì)作為云主機(jī)展示給用戶(hù).
Ceph[3]是一種性能優(yōu)秀、服務(wù)穩(wěn)定且可擴(kuò)展的開(kāi)源分布式存儲(chǔ)系統(tǒng),作為軟件定義存儲(chǔ)(SDS)[4]領(lǐng)域的代表,可以整合多種傳統(tǒng)存儲(chǔ)方式并進(jìn)行統(tǒng)一配置管理,與OpenStack形成了良好的搭配,也是其目前使用最普遍的塊存儲(chǔ)方式.
根據(jù)2017年4月的OpenStack用戶(hù)調(diào)查報(bào)告顯示,擁有的虛擬機(jī)數(shù)量100臺(tái)以上的環(huán)境比例高達(dá)74%[5].由于用戶(hù)大量的數(shù)據(jù)和業(yè)務(wù)運(yùn)行在虛擬機(jī)之上,保障虛擬機(jī)的數(shù)據(jù)安全成為了OpenStack面臨的迫切問(wèn)題[6].
虛擬機(jī)備份與簡(jiǎn)單的快照不同,它要求能保存虛擬機(jī)任意快照點(diǎn)的數(shù)據(jù)和狀態(tài),可在本地或異地存儲(chǔ)這些數(shù)據(jù),在生產(chǎn)環(huán)境發(fā)生災(zāi)難或者人工操作失誤時(shí),能夠利用原數(shù)據(jù)進(jìn)行恢復(fù),降低損失.其它大型虛擬化廠商,如 Vmware、Redhat、XenServer等,市面上都有針對(duì)自身產(chǎn)品的虛擬機(jī)備份方案,而OpenStack由于其作為云計(jì)算平臺(tái)的復(fù)雜性,并且沒(méi)有完善相應(yīng)的接口,因此在虛擬機(jī)備份功能上一直進(jìn)展緩慢,其快照備份功能,對(duì)于有具體環(huán)境備份需求的用戶(hù)來(lái)說(shuō),功能過(guò)于單一,且時(shí)間和存儲(chǔ)空間開(kāi)銷(xiāo)較大,因此在實(shí)際部署中并不適用.
為此,本文提出一種面向OpenStack/Ceph的虛擬機(jī)備份系統(tǒng),基于Ceph存儲(chǔ)快照,計(jì)算出虛擬機(jī)磁盤(pán)對(duì)象的有效數(shù)據(jù)或變化數(shù)據(jù)區(qū)域,讀取磁盤(pán)數(shù)據(jù)并按快照點(diǎn)的順序保存至備份服務(wù)器,同時(shí)保存原虛擬機(jī)的硬件配置、元數(shù)據(jù)等信息; 在恢復(fù)時(shí),創(chuàng)建一個(gè)配置相同的新虛擬機(jī)并將所選快照點(diǎn)的數(shù)據(jù)恢復(fù)到新的磁盤(pán).實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)比OpenStack的虛擬機(jī)快照備份功能,可有效降低備份時(shí)間,節(jié)省備份數(shù)據(jù)存儲(chǔ)空間,可以實(shí)現(xiàn)后者不具有的增量備份[7]等功能,同時(shí)滿(mǎn)足對(duì)虛擬機(jī)根磁盤(pán)、臨時(shí)磁盤(pán)、掛載云硬盤(pán)的數(shù)據(jù)備份.該方法不需修改OpenStack原生內(nèi)容,不會(huì)對(duì)用戶(hù)的生產(chǎn)環(huán)境造成影響.
OpenStack是基于多個(gè)模塊協(xié)同工作的云計(jì)算平臺(tái),其內(nèi)部接口參照亞馬遜AWS[8].OpenStack虛擬機(jī)的磁盤(pán)數(shù)據(jù)保存于根磁盤(pán)(Root Disk)、臨時(shí)磁盤(pán)(Ephemeral Disk)和掛載的云硬盤(pán)(Volumes).
OpenStack現(xiàn)有的的虛擬機(jī)快照備份功能是對(duì)虛擬機(jī)根磁盤(pán)進(jìn)行轉(zhuǎn)換和拷貝,不支持增量備份,備份時(shí)間長(zhǎng),冗余數(shù)據(jù)多,虛擬機(jī)的臨時(shí)磁盤(pán)、掛載的云硬盤(pán)無(wú)法得到有效備份.新的虛擬機(jī)只能利用上傳的根磁盤(pán)鏡像創(chuàng)建,一旦出現(xiàn)災(zāi)難或者人工失誤操作,容易造成大量數(shù)據(jù)丟失.而OpenStack提供的Cinder-backup服務(wù)目前只能實(shí)現(xiàn)對(duì)云硬盤(pán)的備份且有諸多限制條件,也無(wú)法滿(mǎn)足對(duì)虛擬機(jī)整機(jī)的有效保護(hù).
Ceph是一個(gè)多節(jié)點(diǎn)的分布式系統(tǒng),提供統(tǒng)一的存儲(chǔ)訪(fǎng)問(wèn)接口.Ceph的節(jié)點(diǎn)可分為Monitor節(jié)點(diǎn)與OSD節(jié)點(diǎn),OSD節(jié)點(diǎn)用于存儲(chǔ)和查詢(xún)對(duì)象,Monitor節(jié)點(diǎn)用于維護(hù)集群成員的狀態(tài).
按照模塊劃分,Ceph最底層模塊是RADOS (Reliable,Autonomic Distributed Object Store),通過(guò)CRUSH算法[9]保證數(shù)據(jù)均衡存儲(chǔ)于各個(gè)OSD節(jié)點(diǎn).在RADOS之上有多個(gè)模塊對(duì)其功能進(jìn)行了封裝與拓展,其中OpenStack主要使用到的模塊為Ceph RBD(Reliable Block Device),即Ceph的塊存儲(chǔ)服務(wù)[3].
以Ceph為塊存儲(chǔ)后端的OpenStack環(huán)境,每個(gè)磁盤(pán)均對(duì)應(yīng)一個(gè)RBD對(duì)象,磁盤(pán)格式采用RAW[10],RAW格式磁盤(pán)在Ceph中只保存已劃分空間部分,節(jié)省了存儲(chǔ)空間.Ceph RBD支持對(duì)塊設(shè)備生成快照[11],采用COW (Copy-On-Write)機(jī)制,即寫(xiě)時(shí)拷貝,可在任意時(shí)間點(diǎn)以秒級(jí)速度創(chuàng)建快照,不對(duì)塊設(shè)備的使用造成影響,使每個(gè)快照點(diǎn)的數(shù)據(jù)都能保存并且不會(huì)復(fù)制冗余數(shù)據(jù),其功能類(lèi)似于QCOW2磁盤(pán)的快照功能[12].
鑒于虛擬機(jī)備份對(duì)OpenStack環(huán)境的安全有著重要的作用,而其快照備份方法不能滿(mǎn)足備份的需要,本文提出一種面向OpenStack/Ceph的虛擬機(jī)備份系統(tǒng).系統(tǒng)分為服務(wù)端和代理端,包含6個(gè)模塊: 磁盤(pán)處理模塊、通信模塊、備份模塊、恢復(fù)模塊、數(shù)據(jù)存儲(chǔ)模塊、虛擬機(jī)管理模塊,如圖1所示,備份模塊和恢復(fù)模塊通過(guò)調(diào)用虛擬機(jī)管理模塊獲取原虛擬機(jī)配置信息、創(chuàng)建新虛擬機(jī)等,通過(guò)通信模塊與磁盤(pán)處理模塊通信,傳輸磁盤(pán)有效數(shù)據(jù)或增量數(shù)據(jù),然后調(diào)用數(shù)據(jù)存儲(chǔ)模塊寫(xiě)入或讀取備份數(shù)據(jù).其中代理端安裝在環(huán)境里每個(gè)計(jì)算節(jié)點(diǎn),服務(wù)端安裝在單獨(dú)的備份服務(wù)器上.
圖1 系統(tǒng)模塊圖
本文備份系統(tǒng)涉及到OpenStack環(huán)境的存儲(chǔ)、管理、公開(kāi)三種網(wǎng)絡(luò),如圖2所示.管理網(wǎng)絡(luò)用于服務(wù)端與OpenStack控制節(jié)點(diǎn)通信,管理控制OpenStack環(huán)境,管理網(wǎng)絡(luò)還用于獲取虛擬機(jī)信息、傳輸備份恢復(fù)數(shù)據(jù); 存儲(chǔ)網(wǎng)絡(luò)用于代理端讀取、寫(xiě)入、查詢(xún)存儲(chǔ)在Ceph環(huán)境中的磁盤(pán)數(shù)據(jù); 公開(kāi)網(wǎng)絡(luò)使用戶(hù)可以從外部訪(fǎng)問(wèn)備份服務(wù)器,控制備份和恢復(fù)任務(wù).
備份模塊通過(guò)調(diào)用其它基礎(chǔ)模塊,控制備份任務(wù)的流程.當(dāng)OpenStack環(huán)境加入到備份系統(tǒng)時(shí),會(huì)首先通過(guò)虛擬機(jī)管理模塊獲取所有虛擬機(jī)的狀態(tài)列表,用戶(hù)可以選擇某臺(tái)或多臺(tái)虛擬機(jī)創(chuàng)建備份任務(wù),備份任務(wù)可以分為全量備份、增量備份兩種方式,備份模塊有不同的處理方式.
任務(wù)創(chuàng)建完成后,后續(xù)流程均由備份模塊控制,用戶(hù)不需要再操作,備份的具體步驟如下.
1) 根據(jù)任務(wù)類(lèi)型和狀態(tài),如果是全量備份任務(wù),則直接執(zhí)行全量備份; 如果是增量備份任務(wù),第一個(gè)備份點(diǎn)也是全量備份,后續(xù)增量備份點(diǎn)均依賴(lài)于前一個(gè)備份點(diǎn)執(zhí)行;
2) 通過(guò)虛擬機(jī)管理模塊獲取虛擬機(jī)的詳細(xì)配置以及磁盤(pán)列表,包括根磁盤(pán)、臨時(shí)磁盤(pán)以及掛載的云硬盤(pán),獲取所有磁盤(pán)的存儲(chǔ)路徑;
3) 對(duì)于磁盤(pán)列表中的每一個(gè)磁盤(pán),根據(jù)磁盤(pán)路徑,調(diào)用磁盤(pán)處理模塊創(chuàng)建當(dāng)前時(shí)間點(diǎn)Tn的快照,記錄快照的ID等信息;
圖2 系統(tǒng)網(wǎng)絡(luò)拓?fù)?/p>
4) 通過(guò)磁盤(pán)處理模塊,如果是全量備份點(diǎn),根據(jù)Tn時(shí)刻的快照計(jì)算每個(gè)磁盤(pán)的全量數(shù)據(jù)Bitmap,如果是增量備份點(diǎn),結(jié)合Tn–1和Tn時(shí)刻的快照計(jì)算每個(gè)磁盤(pán)的增量數(shù)據(jù)Bitmap;
5) 根據(jù)備份任務(wù)類(lèi)型,選擇不同的Bitmap用于數(shù)據(jù)備份,調(diào)用通信模塊進(jìn)行傳輸,調(diào)用數(shù)據(jù)存儲(chǔ)模塊保存磁盤(pán)數(shù)據(jù);
6) 等待所有磁盤(pán)數(shù)據(jù)備份完成,將虛擬機(jī)的配置信息保存至數(shù)據(jù)庫(kù)或文件;
7) 如果是全量備份任務(wù),刪除Tn時(shí)刻的快照; 如果是增量備份任務(wù),刪除Tn–1時(shí)刻的快照,保留Tn時(shí)刻的快照,備份任務(wù)完成.
與備份模塊相似,恢復(fù)模塊也是通過(guò)調(diào)用其它模塊,控制恢復(fù)的流程.主要包含創(chuàng)建虛擬機(jī)、寫(xiě)磁盤(pán)數(shù)據(jù)兩部分.新虛擬機(jī)名、可用域和網(wǎng)絡(luò)等設(shè)置為可選項(xiàng).通過(guò)創(chuàng)建相同配置的新虛擬機(jī)并將備份數(shù)據(jù)寫(xiě)入覆蓋到新虛擬機(jī)的磁盤(pán),可以實(shí)現(xiàn)整機(jī)數(shù)據(jù)恢復(fù).數(shù)據(jù)恢復(fù)過(guò)程中虛擬機(jī)需要是關(guān)機(jī)狀態(tài),整個(gè)恢復(fù)的步驟如下.
1) 用戶(hù)選擇需要恢復(fù)哪臺(tái)虛擬機(jī)以及哪個(gè)時(shí)間點(diǎn);
2) 通過(guò)虛擬機(jī)管理模塊獲取可恢復(fù)到的環(huán)境和租戶(hù),驗(yàn)證用戶(hù)在該租戶(hù)內(nèi)是否有權(quán)限;
3) 獲取所選租戶(hù)內(nèi)可選網(wǎng)絡(luò)和可用域,允許用戶(hù)配置新虛擬機(jī)的名稱(chēng)、網(wǎng)絡(luò)和可用域等選項(xiàng);
4) 根據(jù)保存的原機(jī)云主機(jī)類(lèi)型和云硬盤(pán)掛載信息,調(diào)用虛擬機(jī)管理模塊創(chuàng)建與原虛擬機(jī)硬件配置相同的新虛擬機(jī),保證與原機(jī)磁盤(pán)數(shù)量、大小、掛載順序一致,然后獲取新虛擬機(jī)的磁盤(pán)列表和路徑信息;
5) 按照磁盤(pán)列表,將新虛擬機(jī)與原虛擬機(jī)的磁盤(pán)一一對(duì)應(yīng),針對(duì)每一對(duì)磁盤(pán),從數(shù)據(jù)存儲(chǔ)模塊,根據(jù)所選時(shí)間點(diǎn)原磁盤(pán)的Bitmap信息依次讀取有效數(shù)據(jù)塊,再調(diào)用磁盤(pán)處理模塊寫(xiě)入覆蓋新磁盤(pán)相同的偏移位置;
6) 等待所有磁盤(pán)數(shù)據(jù)恢復(fù)完成,任務(wù)成功.
通信模塊基于TCP/IP協(xié)議,提供備份服務(wù)器與計(jì)算節(jié)點(diǎn)的通信基礎(chǔ),負(fù)責(zé)備份服務(wù)器與不同計(jì)算節(jié)點(diǎn)之間通信數(shù)據(jù)包的轉(zhuǎn)發(fā)和分配,該模塊提供對(duì)三種數(shù)據(jù)的傳輸,分別是虛擬化平臺(tái)的命令和返回信息、磁盤(pán)操作的處理和回饋、備份恢復(fù)數(shù)據(jù)的請(qǐng)求和傳輸.
為滿(mǎn)足不同的消息請(qǐng)求,可以通過(guò)構(gòu)造自定義的多級(jí)包頭加以區(qū)分,比如操作消息可以通過(guò)在包頭定義操作碼,備份服務(wù)端和代理端再通過(guò)分析操作碼對(duì)數(shù)據(jù)部分做不同的操作.在傳輸時(shí)要保證數(shù)據(jù)傳輸?shù)恼_性,可以構(gòu)造待發(fā)送的數(shù)據(jù)包隊(duì)列,平衡處理各節(jié)點(diǎn)間的通信任務(wù).
虛擬機(jī)管理模塊用于處理與OpenStack云計(jì)算平臺(tái)的連接、驗(yàn)證權(quán)限,獲取云計(jì)算平臺(tái)的相關(guān)信息,創(chuàng)建、刪除虛擬機(jī),獲取虛擬機(jī)配置,磁盤(pán)列表和路徑等.該模塊是系統(tǒng)與OpenStack環(huán)境通信的基礎(chǔ).
OpenStack包含有Keystone,Cinder,Nova,Glance等各種組件,每個(gè)組件提供不同的服務(wù),占用不同的端口[13].要與這些服務(wù)通信,需要先獲取權(quán)限,OpenStack將用戶(hù)劃分為不同的權(quán)限級(jí)別,且用戶(hù)與租戶(hù)相關(guān),需選擇一個(gè)具有Admin權(quán)限的用戶(hù)并通過(guò)Keystone服務(wù)認(rèn)證.
完成認(rèn)證后,可通過(guò)Nova等服務(wù)獲取所有虛擬機(jī)的詳細(xì)信息,包括虛擬機(jī)的硬件配置以及運(yùn)行狀況,磁盤(pán)列表和路徑,用于備份和恢復(fù)任務(wù).創(chuàng)建新虛擬機(jī)時(shí)需保證與原機(jī)的配置相同,結(jié)合用戶(hù)可選的虛擬機(jī)名稱(chēng)、網(wǎng)絡(luò)等信息,再通過(guò)Nova和Cinder服務(wù)創(chuàng)建完成.
磁盤(pán)處理模塊位于每一個(gè)計(jì)算節(jié)點(diǎn),用于管理與Ceph環(huán)境的連接、生成快照、計(jì)算快照點(diǎn)Bitmap、讀取和寫(xiě)入磁盤(pán)數(shù)據(jù)等.
本系統(tǒng)邏輯上將磁盤(pán)劃分為固定大小的數(shù)據(jù)塊,對(duì)每個(gè)磁盤(pán)生成一個(gè)Bitmap,每一個(gè)bit對(duì)應(yīng)一個(gè)數(shù)據(jù)塊.Ceph提供了返回單個(gè)快照點(diǎn)內(nèi)全部有效數(shù)據(jù)段或兩個(gè)快照點(diǎn)間變化數(shù)據(jù)段的接口,可計(jì)算出全量數(shù)據(jù)Bitmap或增量數(shù)據(jù)Bitmap,前者描述完整磁盤(pán)的有效數(shù)據(jù),后者描述磁盤(pán)兩個(gè)快照點(diǎn)之間的變化數(shù)據(jù).
本系統(tǒng)在計(jì)算Bitmap時(shí)將磁盤(pán)劃分為多個(gè)較長(zhǎng)的數(shù)據(jù)段,一個(gè)數(shù)據(jù)段包含若干數(shù)據(jù)塊,通過(guò)Ceph獲取每個(gè)數(shù)據(jù)段內(nèi)的有效數(shù)據(jù)或變化數(shù)據(jù)信息,再計(jì)算生成每個(gè)數(shù)據(jù)段的Bitmap,最終合并出磁盤(pán)的完整Bitmap.數(shù)據(jù)段的長(zhǎng)度可采用Ceph的分段上限.計(jì)算數(shù)據(jù)段的Bitmap方法如圖3所示.
以某個(gè)數(shù)據(jù)段f為例,其在文件中的偏移為offset,長(zhǎng)度為length,對(duì)應(yīng)n個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊編號(hào)從0到n–1,則分塊長(zhǎng)度為length/n.對(duì)于某一段有效數(shù)據(jù),假設(shè)其偏移和長(zhǎng)度分別為S和L,對(duì)于第i個(gè)數(shù)據(jù)塊,如果存在:
則說(shuō)明數(shù)據(jù)塊內(nèi)包含該段有效數(shù)據(jù),將Bitmap內(nèi)第i個(gè)bit置為1.計(jì)算完成所有數(shù)據(jù)段之后,即可合并出整個(gè)磁盤(pán)快照點(diǎn)的Bitmap.備份時(shí),只需對(duì)其中bit為1的數(shù)據(jù)塊,計(jì)算出其在磁盤(pán)文件中的偏移,再?gòu)腃eph中按塊的偏移和長(zhǎng)度讀取即可,避免了對(duì)無(wú)效數(shù)據(jù)區(qū)的備份,節(jié)約了備份時(shí)間和空間,采用增量數(shù)據(jù)Bimtap傳輸數(shù)據(jù)可以實(shí)現(xiàn)增量備份的效果.
數(shù)據(jù)存儲(chǔ)模塊負(fù)責(zé)保存虛擬機(jī)磁盤(pán)快照點(diǎn)的備份數(shù)據(jù),保存數(shù)據(jù)的方式采用固定的結(jié)構(gòu)和方法.存儲(chǔ)結(jié)構(gòu)上,需按照存儲(chǔ)根目錄、虛擬機(jī)、快照時(shí)間點(diǎn)和磁盤(pán)的層次,快照時(shí)間點(diǎn)和磁盤(pán)通過(guò)生成ID的方式加以區(qū)分.每一個(gè)快照點(diǎn)內(nèi)保存有所有磁盤(pán)的存儲(chǔ)數(shù)據(jù)文件、索引文件、元數(shù)據(jù)等信息.目錄結(jié)構(gòu)如圖4所示.
圖4 存儲(chǔ)目錄結(jié)構(gòu)
存儲(chǔ)數(shù)據(jù)文件保存全量備份點(diǎn)的有效數(shù)據(jù)塊,或增量快照點(diǎn)的變化數(shù)據(jù)塊,所有數(shù)據(jù)塊擁有同樣的塊大小,按順序?qū)懭氪鎯?chǔ)數(shù)據(jù)文件中.元數(shù)據(jù)保存了磁盤(pán)ID、依賴(lài)快照點(diǎn)ID等信息.索引文件是根據(jù)磁盤(pán)快照點(diǎn)計(jì)算的Bitmap生成的,每一行的格式為”bit|offset”,bit是指該數(shù)據(jù)塊是否為磁盤(pán)當(dāng)前快照點(diǎn)的有效數(shù)據(jù)塊或增量數(shù)據(jù)塊,與Bitmap里的值相同,offset指數(shù)據(jù)塊在存儲(chǔ)數(shù)據(jù)文件中的偏移,如果當(dāng)前沒(méi)有保存該塊,則偏移為0.
當(dāng)進(jìn)行備份時(shí),需要寫(xiě)入數(shù)據(jù).首先按照目錄結(jié)構(gòu)創(chuàng)建正確的路徑; 針對(duì)每一個(gè)磁盤(pán),通過(guò)磁盤(pán)處理模塊計(jì)算該快照點(diǎn)的全量或增量Bitmap; 循環(huán)處理每一個(gè)bit位,如果bit為1,則傳輸對(duì)應(yīng)的數(shù)據(jù)塊,按順序?qū)懭氪鎯?chǔ)數(shù)據(jù)文件,如果bit為0,則不需要傳輸,同時(shí)應(yīng)記錄該bit的值和數(shù)據(jù)塊在存儲(chǔ)數(shù)據(jù)文件中的偏移,并保存至索引文件,不需傳輸?shù)膲K偏移置為0; 最后,記錄磁盤(pán)的依賴(lài)快照點(diǎn)、磁盤(pán)大小等元數(shù)據(jù)信息.
當(dāng)進(jìn)行恢復(fù)時(shí),針對(duì)每一個(gè)磁盤(pán),根據(jù)元數(shù)據(jù)信息獲取完整的快照鏈關(guān)系,然后合并所有索引文件的Bitmap信息,合并方式為某數(shù)據(jù)塊如果在任意時(shí)間點(diǎn)的bit為1,那么合并后該數(shù)據(jù)塊bit也置為1.根據(jù)合并后的Bitmap,對(duì)bit為1的數(shù)據(jù)塊,從最近時(shí)間點(diǎn)開(kāi)始讀取,如果該時(shí)間點(diǎn)未保存有該數(shù)據(jù)塊,即索引文件的偏移為0,則向前一個(gè)時(shí)間點(diǎn)繼續(xù)讀取,以此類(lèi)推.最終可得到完整的磁盤(pán)數(shù)據(jù).
以一個(gè)磁盤(pán)的增量快照鏈為例,如圖5所示,增量點(diǎn)T2依賴(lài)于增量點(diǎn)T1,增量點(diǎn)T1依賴(lài)于全量點(diǎn)T0,每個(gè)快照點(diǎn)保存有索引文件、元數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)文件.按照從左到右的順序編號(hào),有數(shù)據(jù)塊0到15.備份時(shí),根據(jù)T2時(shí)刻計(jì)算出的增量數(shù)據(jù)Bitmap,數(shù)據(jù)塊5、10、11的數(shù)據(jù)有變化,所以當(dāng)前只需要備份這三個(gè)數(shù)據(jù)塊,將數(shù)據(jù)寫(xiě)入到有效數(shù)據(jù)文件,并記錄偏移offset.
圖5 備份數(shù)據(jù)存儲(chǔ)方式
恢復(fù)時(shí),首先根據(jù)快照鏈關(guān)系,合并T0、T1、T2的Bitmap,得到T2時(shí)刻磁盤(pán)的完整數(shù)據(jù)Bitmap,即數(shù)據(jù)塊2、5、8、10、11、15的bit都為1,再根據(jù)完整數(shù)據(jù)Bitmap從存儲(chǔ)數(shù)據(jù)文件讀取數(shù)據(jù)塊,優(yōu)先從最近時(shí)間點(diǎn)開(kāi)始讀,如果沒(méi)有查詢(xún)到該數(shù)據(jù)塊,則從依賴(lài)快照點(diǎn)中讀,以此類(lèi)推.圖5例中,首先會(huì)從增量點(diǎn)T2讀取數(shù)據(jù)塊5、10、11,然后從增量點(diǎn)T1讀取數(shù)據(jù)塊15、從全量點(diǎn)T0讀取數(shù)據(jù)塊2、8,最終即可得到T2時(shí)刻磁盤(pán)的完整數(shù)據(jù).
實(shí)驗(yàn)環(huán)境參照?qǐng)D2的網(wǎng)絡(luò)拓?fù)?OpenStack版本號(hào)為Mitaka,虛擬機(jī)磁盤(pán)格式為RAW; 備份服務(wù)端安裝在獨(dú)立主機(jī)上,代理端安裝于OpenStack所有計(jì)算節(jié)點(diǎn)上.實(shí)驗(yàn)采用OpenStack虛擬機(jī)快照備份功能作為對(duì)比方法,實(shí)驗(yàn)對(duì)象選用云環(huán)境內(nèi)不同操作系統(tǒng)、不同系統(tǒng)配置的虛擬機(jī),配置包含單磁盤(pán)、多磁盤(pán)等多種方式,本文系統(tǒng)分塊大小為2 MB.
為測(cè)試備份系統(tǒng)虛擬機(jī)的增量數(shù)據(jù)備份,創(chuàng)建一臺(tái)擁有10 GB根磁盤(pán)的虛擬機(jī),操作系統(tǒng)為最小化安裝的Centos7.3,先用dd命令寫(xiě)入5.1 GB非0數(shù)據(jù)擴(kuò)充根磁盤(pán)大小,在T0時(shí)刻做一次全量備份,由于都是提取的有效數(shù)據(jù),兩種方法全量備份的效果相同,然后自T1時(shí)刻起向根磁盤(pán)連續(xù)寫(xiě)入測(cè)試數(shù)據(jù)并做增量備份,如表1所示.測(cè)試數(shù)據(jù)采用不同版本的Linux內(nèi)核tar.gz壓縮文件,版本號(hào)依次為L(zhǎng)inux-2.6.39.2、Linux-3.6.9、Linux-3.8.2、Linux-3.12.69、Linux-4.6.3、Linux-4.9.88.
實(shí)驗(yàn)結(jié)果表明,本文提出的備份系統(tǒng)可針對(duì)變化數(shù)據(jù)使用增量備份,而OpenStack快照備份只能對(duì)根磁盤(pán)做全量備份,故備份大小約等于根磁盤(pán)已分配大小.根磁盤(pán)增量數(shù)據(jù)備份傳輸?shù)拇笮『蜁r(shí)間對(duì)比如圖6所示,無(wú)論是節(jié)省備份時(shí)間還是存儲(chǔ)空間,本文系統(tǒng)均優(yōu)于OpenStack的快照備份方式,實(shí)驗(yàn)中本文系統(tǒng)平均節(jié)約了88.72%的備份時(shí)間和97.14%的備份存儲(chǔ)空間,在變化數(shù)據(jù)相對(duì)于磁盤(pán)已分配空間較小時(shí),本文系統(tǒng)的優(yōu)勢(shì)更加明顯.
表1 根磁盤(pán)增量數(shù)據(jù)備份
圖6 根磁盤(pán)增量備份對(duì)比
為測(cè)試多磁盤(pán)的備份情況,創(chuàng)建一臺(tái)擁有10 GB根磁盤(pán)、10 GB臨時(shí)磁盤(pán)、10 GB云硬盤(pán)的虛擬機(jī),對(duì)比OpenStack快照備份方法,實(shí)驗(yàn)全量備份、增量備份任務(wù),實(shí)驗(yàn)結(jié)果表明,本文提出的備份系統(tǒng)可針對(duì)多磁盤(pán)虛擬機(jī)實(shí)現(xiàn)有效保護(hù),對(duì)臨時(shí)磁盤(pán)、云硬盤(pán)均可實(shí)現(xiàn)全量和增量備份,備份效果與根磁盤(pán)相同.與OpenStack快照備份的功能對(duì)比如表2所示,在恢復(fù)測(cè)試中,每個(gè)時(shí)間點(diǎn)所有磁盤(pán)的數(shù)據(jù)均能正確恢復(fù)到新虛擬機(jī).
表2 多磁盤(pán)備份功能對(duì)比
本文針對(duì)以Ceph RBD作為后端塊存儲(chǔ)方法的OpenStack環(huán)境,設(shè)計(jì)并實(shí)現(xiàn)了一種利用Ceph快照特點(diǎn)的虛擬機(jī)備份系統(tǒng),實(shí)驗(yàn)結(jié)果表明,相比于OpenStack的虛擬機(jī)快照功能,本系統(tǒng)可以實(shí)現(xiàn)后者不具有的虛擬機(jī)整機(jī)的數(shù)據(jù)保護(hù)功能,包括對(duì)虛擬機(jī)配置信息的保存、多磁盤(pán)數(shù)據(jù)的備份,可以實(shí)現(xiàn)跨用戶(hù)、跨租戶(hù)的恢復(fù),通過(guò)計(jì)算變化數(shù)據(jù)可以實(shí)現(xiàn)增量備份,有效節(jié)約了備份時(shí)間和存儲(chǔ)空間.但本系統(tǒng)的增量備份會(huì)保留一個(gè)快照,備份速度和增量計(jì)算精度與分塊大小相關(guān),備份數(shù)據(jù)也可以通過(guò)存儲(chǔ)網(wǎng)絡(luò)傳輸,后續(xù)可以做進(jìn)一步優(yōu)化和改進(jìn).