基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法
【專利摘要】本發(fā)明涉及基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,通過內(nèi)存粹取技術(shù)XML方式恢復(fù)虛擬機,可實現(xiàn)當(dāng)虛擬機系統(tǒng)損壞、故障或虛擬機丟失時,通過調(diào)用內(nèi)存相關(guān)映像文件及核心模塊來恢復(fù)系統(tǒng)文件,恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài);包括如下步驟:1)虛擬機日志信息存儲;2)索引;3)內(nèi)存框架重構(gòu);4)仿生恢復(fù)。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:1)能夠在沒有任何備份的情況下,自動恢復(fù)虛擬機系統(tǒng)和虛擬機上的所有數(shù)據(jù),提高云計算虛擬機穩(wěn)定性和安全性;2)減少資源消耗,提高資源利用率;3)減少設(shè)備投入和維護人員數(shù)量,有效降低成本;4)只需為3分鐘—7分鐘就可恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài),效率高。
【專利說明】基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及云計算領(lǐng)域,尤其涉及一種基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法。
【背景技術(shù)】
[0002]隨著虛擬化技術(shù)的不斷成熟,云計算的概念應(yīng)運而生。按照通用的標(biāo)準(zhǔn),云計算是基于互聯(lián)網(wǎng)網(wǎng)絡(luò),向多種用戶提供的虛擬的,豐富的,按需即取的包括數(shù)據(jù)存儲池、軟件下載和維護池、計算能力池、多媒體信息資源池和客戶服務(wù)池在內(nèi)的廣泛數(shù)據(jù)和運算處理服務(wù),是基于之前互聯(lián)網(wǎng)應(yīng)用服務(wù)和整合運算技術(shù)基礎(chǔ)上發(fā)展而來的新一代數(shù)據(jù)處理和應(yīng)用服務(wù)技術(shù)。
[0003]在目前的云計算環(huán)境中,利用虛擬化技術(shù)來實現(xiàn)服務(wù)的資源調(diào)度和共享已成為主流,所有服務(wù)都是以虛擬機作為服務(wù)后臺。隨著服務(wù)請求數(shù)量的不斷增加,各種服務(wù)所需要創(chuàng)建的虛擬機也隨之增加,虛擬機運行的穩(wěn)定性成為最重要的研究課題。
[0004]為了保證云計算平臺上的虛擬機運行安全和數(shù)據(jù)安全,常見的做法是進行備份。傳統(tǒng)備份方式分為:數(shù)據(jù)備份和系統(tǒng)備份,都是以1:1復(fù)制關(guān)系方式進行,以保證系統(tǒng)和數(shù)據(jù)的安全性和完整性。當(dāng)出現(xiàn)問題時恢復(fù)最近備份的某一時間點來恢復(fù)原有的系統(tǒng)和數(shù)據(jù),保障系統(tǒng)和數(shù)據(jù)完整性。傳統(tǒng)備份缺點是:當(dāng)數(shù)據(jù)和系統(tǒng)在備份時,首先會消耗所存放備份數(shù)據(jù)的磁盤存儲資源、消耗大量的計算機硬件資源,而且備份任務(wù)是每天或者一段時間內(nèi)就需要進行一次,長此以往會產(chǎn)生大量的備份數(shù)據(jù),占用更多資源,導(dǎo)致設(shè)備增加的同時也會消耗大量的電能。
[0005]目前,為了保證虛擬機穩(wěn)定運行,當(dāng)虛擬機出現(xiàn)故障時,通過虛擬環(huán)境快照的備份方法提供了高可用性,諸如VCB或基于SAN備份的虛擬環(huán)境備份方法提供了高可用性,并且比傳統(tǒng)的基于文件的方法更適合于整合服務(wù)器架構(gòu)。但快照備份方式具有以下缺點:1)只適用于一個特定環(huán)境;2)快照備份是分時間段進行,因為有時間間隔從而造成數(shù)據(jù)不連續(xù);3)隨著時間推移,舊的備份文件需要保留,新的文件不斷增加,因此需要巨大的存儲空間。
【發(fā)明內(nèi)容】
[0006]本發(fā)明克服現(xiàn)有技術(shù)的不足,提供了一種基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,能夠在沒有備份的情況下自動恢復(fù)虛擬機系統(tǒng)和虛擬機上的所有數(shù)據(jù),有效提高云計算虛擬機穩(wěn)定性,減少存儲空間及資源浪費,提高資源利用率。
[0007]為了達到上述目的,本發(fā)明采用以下技術(shù)方案實現(xiàn):
[0008]基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,應(yīng)用內(nèi)存粹取技術(shù)XML方式恢復(fù)虛擬機,可實現(xiàn)當(dāng)虛擬機系統(tǒng)損壞、故障或虛擬機丟失時,通過調(diào)用內(nèi)存相關(guān)映像文件及核心模塊來恢復(fù)系統(tǒng)文件,恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài);包括如下步驟:
[0009]I)虛擬機日志信息存儲[0010]虛擬機運行過程中,內(nèi)存池MemoryPool申請分配多個用來滿足內(nèi)存申請請求的內(nèi)存塊,這些內(nèi)存塊是從進程堆中開辟的一個較大的連續(xù)內(nèi)存區(qū)域,并把虛擬機日志信息存儲到內(nèi)存塊中;
[0011]2)索引
[0012]針對虛擬機任何操作所形成的數(shù)據(jù)塊和內(nèi)存塊隊列建立索引,并將此信息保存到硬盤索引隊列當(dāng)中,當(dāng)數(shù)據(jù)發(fā)生變化時,與原有的索引信息進行對比,將不同的索引信息進行保存,相同的索引信息不進行任何操作,同時生成內(nèi)存塊索引鏈表和硬盤索引鏈表;
[0013]3)內(nèi)存框架重構(gòu)
[0014]根據(jù)內(nèi)存索引鏈表信息和硬盤索引鏈表信息,重構(gòu)原始虛擬機虛擬硬件配置信息,如CPU、內(nèi)存、硬盤等,逐步恢復(fù)虛擬機原始狀態(tài);
[0015]4)仿生恢復(fù)
[0016]當(dāng)虛擬機硬件恢復(fù)完成時、通過云計算平臺WEB界面上的一鍵式恢復(fù)按鈕進行恢復(fù),恢復(fù)虛擬機原始應(yīng)用和原始數(shù)據(jù),恢復(fù)到宕機前5分鐘時的狀態(tài)。
[0017]所述內(nèi)存塊由一個塊頭結(jié)構(gòu)MemoryBlock和多個內(nèi)存分配單元組成,所有內(nèi)存塊組成了一個內(nèi)存塊鏈表,MemoryPool的pBlock是這個鏈表的頭;虛擬機對每個內(nèi)存塊,都可以通過其頭部的塊頭結(jié)構(gòu)MemoryBlock的pNext成員訪問緊跟在其后面的那個內(nèi)存塊。
[0018]所述內(nèi)存分配單元大小固定,其中沒有分配的自由分配單元的頭兩個字節(jié)記錄了緊跟它之后的下一個自由分配單元的編號,通過利用每個自由分配單元的頭兩個字節(jié),一個MemoryBlock中的所有自由分配單元被鏈接起來。
[0019]所述內(nèi)存框架重構(gòu)具體過程如下:
[0020]當(dāng)有新的內(nèi)存請求到來時,MemoryPool會通過pBlock遍歷MemoryBlock鏈表,直到找到其中還有自由分配單元的內(nèi)存塊,取得其MemoryBlock的nFirst值,即該內(nèi)存塊中第I個可供分配的自由單元的編號,根據(jù)這個編號定位到該自由分配單元的起始位置;在返回這個地址前,首先將該位置開始的頭兩個字節(jié)的值賦給本內(nèi)存塊的MemoryBlock的nFirst成員,這樣下一次的請求就會用這個編號對應(yīng)的內(nèi)存單元來滿足,同時將此內(nèi)存塊的MemoryBlock的nFree遞減I,然后再將剛才定位到的內(nèi)存單元的起始位置作為此次內(nèi)存請求的返回地址返回給調(diào)用者;
[0021]如果從現(xiàn)有的內(nèi)存塊中找不到一個自由的內(nèi)存分配單元,MemoryPool就會從進程堆中申請一個內(nèi)存塊,申請完后,首先初始化這個內(nèi)存塊;初始化的操作包括設(shè)置MemoryBlock的nSize為所有內(nèi)存分配單元的大小、nFree為n_l, nFirst為I,初始化后,從MemoryBlock的aData位置開始,每隔nUnitSize大小取其頭兩個字節(jié),記錄其之后的自由分配單元的編號,即自然序號加1,最后將此內(nèi)存塊的第I個分配單元的起始地址aData返回;
[0022]當(dāng)某個虛擬機被分配的單元因為delete需要回收時,該單元將返回給MemoryPool, MemoryPool能夠知道該單元的起始地址;這時,MemoryPool開始遍歷其所維護的內(nèi)存塊鏈表,判斷該單元的起始地址是否落在某個內(nèi)存塊的地址范圍內(nèi);如果不在所有內(nèi)存地址范圍內(nèi),則這個被回收的單元不屬于這個MemoryPool ;如果在某個內(nèi)存塊的地址范圍內(nèi),那么它會將這個剛剛回收的分配單元加到這個內(nèi)存塊的MemoryBlock所維護的自由分配單元鏈表的頭部,同時將其nFree值遞增I ;[0023]回收后,內(nèi)存池的操作會繼續(xù)判斷:如果此內(nèi)存塊的所有分配單元都是自由的,那么這個內(nèi)存塊就會從MemoryPool中被移出并作為一個整體返回給進程堆;如果該內(nèi)存塊中還有非自由分配單元,則這個內(nèi)存塊會被移到MemoryPoo I維護的內(nèi)存塊的頭部,下次內(nèi)存請求到來MemoryPool遍歷其內(nèi)存塊鏈表尋找自由分配單元時,第I次尋找就會找到這個內(nèi)存塊。
[0024]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
[0025]I)能夠在沒有任何備份的情況下,自動恢復(fù)虛擬機系統(tǒng)和虛擬機上的所有數(shù)據(jù),有效提高云計算虛擬機穩(wěn)定性和安全性;
[0026]2)減少硬件及系統(tǒng)的資源消耗,提高資源利用率;
[0027]3)減少設(shè)備及數(shù)據(jù)中心投入,減少維護人員數(shù)量,有效降低成本;
[0028]4)只需為3分鐘一7分鐘就可恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài),效率高。
【專利附圖】
【附圖說明】
[0029]圖1是本發(fā)明的流程示意圖。
【具體實施方式】
[0030]下面結(jié)合附圖對本發(fā)明的【具體實施方式】作進一步說明:
[0031]見圖1,是本發(fā)明流程示意圖,本發(fā)明基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,應(yīng)用內(nèi)存粹取技術(shù)XML方式恢復(fù)虛擬機,可實現(xiàn)當(dāng)虛擬機系統(tǒng)損壞、故障或虛擬機丟失時,通過調(diào)用內(nèi)存相關(guān)映像文件及核心模塊來恢復(fù)系統(tǒng)文件,恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài);包括如下步驟:
[0032]I)虛擬機日志信息存儲
[0033]虛擬機運行過程中,內(nèi)存池MemoryPool申請分配多個用來滿足內(nèi)存申請請求的內(nèi)存塊,這些內(nèi)存塊是從進程堆中開辟的一個較大的連續(xù)內(nèi)存區(qū)域,并把虛擬機日志信息存儲到內(nèi)存塊中;
[0034]2)索引
[0035]針對虛擬機任何操作所形成的數(shù)據(jù)塊和內(nèi)存塊隊列建立索引,并將此信息保存到硬盤索引隊列當(dāng)中,當(dāng)數(shù)據(jù)發(fā)生變化時,與原有的索引信息進行對比,將不同的索引信息進行保存,相同的索引信息不進行任何操作,同時生成內(nèi)存塊索引鏈表和硬盤索引鏈表;
[0036]3)內(nèi)存框架重構(gòu)
[0037]根據(jù)內(nèi)存索引鏈表信息和硬盤索引鏈表信息,重構(gòu)原始虛擬機虛擬硬件配置信息,如CPU、內(nèi)存、硬盤等,逐步恢復(fù)虛擬機原始狀態(tài);
[0038]4)仿生恢復(fù)
[0039]當(dāng)虛擬機硬件恢復(fù)完成時、通過云計算平臺WEB界面上的一鍵式恢復(fù)按鈕進行恢復(fù),恢復(fù)虛擬機原始應(yīng)用和原始數(shù)據(jù),恢復(fù)到宕機前5分鐘時的狀態(tài)。
[0040]所述內(nèi)存塊由一個塊頭結(jié)構(gòu)MemoryBlock和多個內(nèi)存分配單元組成,所有內(nèi)存塊組成了一個內(nèi)存塊鏈表,MemoryPool的pBlock是這個鏈表的頭;虛擬機對每個內(nèi)存塊,都可以通過其頭部的塊頭結(jié)構(gòu)MemoryBlock的pNext成員訪問緊跟在其后面的那個內(nèi)存塊。
[0041]所述內(nèi)存分配單元大小固定,其中沒有分配的自由分配單元的頭兩個字節(jié)記錄了緊跟它之后的下一個自由分配單元的編號,通過利用每個自由分配單元的頭兩個字節(jié),一個MemoryBlock中的所有自由分配單元被鏈接起來。
[0042]所述內(nèi)存框架重構(gòu)具體過程如下:
[0043]當(dāng)有新的內(nèi)存請求到來時,MemoryPool會通過pBlock遍歷MemoryBlock鏈表,直到找到其中還有自由分配單元的內(nèi)存塊,取得其MemoryBlock的nFirst值,即該內(nèi)存塊中第I個可供分配的自由單元的編號,根據(jù)這個編號定位到該自由分配單元的起始位置;在返回這個地址前,首先將該位置開始的頭兩個字節(jié)的值賦給本內(nèi)存塊的MemoryBlock的nFirst成員,這樣下一次的請求就會用這個編號對應(yīng)的內(nèi)存單元來滿足,同時將此內(nèi)存塊的MemoryBlock的nFree遞減I,然后再將剛才定位到的內(nèi)存單元的起始位置作為此次內(nèi)存請求的返回地址返回給調(diào)用者;
[0044]如果從現(xiàn)有的內(nèi)存塊中找不到一個自由的內(nèi)存分配單元,MemoryPool就會從進程堆中申請一個內(nèi)存塊,申請完后,首先初始化這個內(nèi)存塊;初始化的操作包括設(shè)置MemoryBlock的nSize為所有內(nèi)存分配單元的大小、nFree為n_l, nFirst為I,初始化后,從MemoryBlock的aData位置開始,每隔nUnitSize大小取其頭兩個字節(jié),記錄其之后的自由分配單元的編號,即自然序號加1,最后將此內(nèi)存塊的第I個分配單元的起始地址aData返回;
[0045]當(dāng)某個虛擬機被分配的單元因為delete需要回收時,該單元將返回給MemoryPool, MemoryPool能夠知道該單元的起始地址;這時,MemoryPool開始遍歷其所維護的內(nèi)存塊鏈表,判斷該單元的起始地址是否落在某個內(nèi)存塊的地址范圍內(nèi);如果不在所有內(nèi)存地址范圍內(nèi),則這個被回收的單元不屬于這個MemoryPooI ;如果在某個內(nèi)存塊的地址范圍內(nèi),那么它會將這個剛剛回收的分配單元加到這個內(nèi)存塊的MemoryBlock所維護的自由分配單元鏈表的頭部,同時將其nFree值遞增I ;
[0046]回收后,內(nèi)存池的操作會繼續(xù)判斷:如果此內(nèi)存塊的所有分配單元都是自由的,那么這個內(nèi)存塊就會從MemoryPool中被移出并作為一個整體返回給進程堆;如果該內(nèi)存塊中還有非自由分配單元,則這個內(nèi)存塊會被移到MemoryPoo I維護的內(nèi)存塊的頭部,下次內(nèi)存請求到來MemoryPool遍歷其內(nèi)存塊鏈表尋找自由分配單元時,第I次尋找就會找到這個內(nèi)存塊。
[0047]虛擬機運行過程中,內(nèi)存池MemoryPool申請分配多個用來滿足內(nèi)存申請請求的內(nèi)存塊,這些內(nèi)存塊是從進程堆中開辟的一個較大的連續(xù)內(nèi)存區(qū)域,它由一個塊頭結(jié)構(gòu)MemoryBlock和多個可供分配的內(nèi)存單元組成,所有內(nèi)存塊組成了一個內(nèi)存塊鏈表,MemoryPool的pBlock是這個鏈表的頭。虛擬機對每個內(nèi)存塊,都可以通過其頭部的MemoryBlock塊頭結(jié)構(gòu)的pNext成員訪問緊跟在其后面的那個內(nèi)存塊。
[0048]內(nèi)存分配單兀大小固定(由MemoryPool的nUnitSize表不),MemoryBlock塊頭結(jié)構(gòu)并不維護那些已經(jīng)分配的單元的信息;相反,它只維護沒有分配的自由分配單元的信息。它有兩個成員比較重要:nFree和nFirst。nFree記錄這個內(nèi)存塊中還有多少個自由分配單元,而nFirst則記錄下一個可供分配的單元的編號。每一個自由分配單元的頭兩個字節(jié)(即一個USHORT型值)記錄了緊跟它之后的下一個自由分配單元的編號,這樣,通過利用每個自由分配單元的頭兩個字節(jié),一個MemoryBlock中的所有自由分配單元被鏈接起來。[0049]當(dāng)有新的內(nèi)存請求到來時,MemoryPool會通過pBlock遍歷MemoryBlock鏈表,并通過檢測MemoryBlock塊頭結(jié)構(gòu)的nFree成員是否大于O,找到某個還有自由分配單元MemoryBlock所在的內(nèi)存塊。因為所有分配單元大小固定,因此每個分配單元的起始位置都可以通過編號分配單元大小來偏移定位,找到這樣的內(nèi)存塊后,取得其MemoryBlock的nFirst值,即為該內(nèi)存塊中第I個可供分配的自由單元的編號,然后根據(jù)這個編號定位到該自由分配單元的起始位置,這個位置就是用來滿足此次內(nèi)存申請請求的內(nèi)存的起始地址。
[0050]在返回這個地址前,需要首先將該位置開始的頭兩個字節(jié)的值賦給本內(nèi)存塊的MemoryBlock的nFirst成員,因為這兩個字節(jié)值記錄了其之后的下一個自由分配單元的編號,這樣下一次的請求就會用這個編號對應(yīng)的內(nèi)存單元來滿足,同時將此內(nèi)存塊的MemoryBlock的nFree遞減I,然后才將剛才定位到的內(nèi)存單元的起始位置作為此次內(nèi)存請求的返回地址返回給調(diào)用者。
[0051]如果從現(xiàn)有的內(nèi)存塊中找不到一個自由的內(nèi)存分配單元,MemoryPool就會從進程堆中申請一個內(nèi)存塊,申請完后,并不會立刻將其中的一個分配單元分配出去,而是需要首先初始化這個內(nèi)存塊。初始化的操作包括設(shè)置MemoryBlock的nSize為所有內(nèi)存分配單元的大小、nFree為n_l, nFirst為I。設(shè)置nFree為n_l而不是η,是因為此次新內(nèi)存塊就是為了滿足一次新的內(nèi)存請求而申請的,馬上就會分配一塊自由存儲單元出去,如果設(shè)為η-1,分配一個自由存儲單元后無須再將η遞減I ;設(shè)置nFirst為I的原因也是如此,已經(jīng)知道nFirst為下一個可以分配的自由存儲單元的編號,立即會將編號為O的自由分配單元分配出去。如果設(shè)為1,其后也無須修改nFirst的值。
[0052]此時,MemoryBlock需要將編號為O的分配單元之后的所有自由分配單元鏈接起來。如前所述,每個自由分配單元的頭兩個字節(jié)用來存儲下一個自由分配單元的編號;另外,因為每個分配單元大小固定,所以可以通過其編號和單元大小(MemoryPool的nUnitSize成員)的乘積作為偏移值進行定位。定位從MemoryBlock的aData位置做地址開始,因為aData屬于MemoryBlock塊頭結(jié)構(gòu),是MemoryBlock塊頭結(jié)構(gòu)的最后一個字節(jié),所以實質(zhì)上,MemoryBlock塊頭結(jié)構(gòu)的最后一個字節(jié)也用做被分配出去的分配單元的一部分。因為整個內(nèi)存塊由MemoryBlock塊頭結(jié)構(gòu)和整數(shù)個分配單元組成,這意味著內(nèi)存塊的最后一個字節(jié)會被浪費,這個字節(jié)用位于兩個內(nèi)存的最后部分的深黑背景的小塊標(biāo)識。
[0053]確定了分配單元的起始位置后,將自由分配單元鏈接起來的工作就很容易了。即從aData位置開始,每隔nUnitSize大小取其頭兩個字節(jié),記錄其之后的自由分配單元的編號。因為剛開始所有分配單元都是自由的,所以這個編號就是自然序號加1,即位置上緊跟其后的單元的編號。初始化全部完成后,將此內(nèi)存塊的第I個分配單元的起始地址返回,已經(jīng)知道這個地址就是aData。
[0054]當(dāng)某個虛擬機被分配的單元因為delete需要回收時,該單元并不會返回給進程堆,而是返回給MemoryPool。返回時,MemoryPool能夠知道該單元的起始地址。這時,MemoryPool開始遍歷其所維護的內(nèi)存塊鏈表,判斷該單元的起始地址是否落在某個內(nèi)存塊的地址范圍內(nèi)。如果不在所有內(nèi)存地址范圍內(nèi),則這個被回收的單元不屬于這個MemoryPool ;如果在某個內(nèi)存塊的地址范圍內(nèi),那么它會將這個剛剛回收的分配單元加到這個內(nèi)存塊的MemoryBlock所維護的自由分配單元鏈表的頭部,同時將其nFree值遞增I。[0055]回收后,考慮到資源的有效利用及后續(xù)操作的性能,內(nèi)存池的操作會繼續(xù)判斷:如果此內(nèi)存塊的所有分配單元都是自由的,那么這個內(nèi)存塊就會從MemoryPool中被移出并作為一個整體返回給進程堆;如果該內(nèi)存塊中還有非自由分配單元,這時不能將此內(nèi)存塊返回給進程堆,但是因為剛剛有一個分配單元返回給了這個內(nèi)存塊,即這個內(nèi)存塊有自由分配單元可供下次分配,因此它會被移到MemoryPool維護的內(nèi)存塊的頭部。這樣下次的內(nèi)存請求到來,MemoryPool遍歷其內(nèi)存塊鏈表以尋找自由分配單元時,第I次尋找就會找到這個內(nèi)存塊,這樣可以減少MemoryPool的遍歷次數(shù)。
[0056]綜上所述,本發(fā)明基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法的工作原理是:虛擬機的每個內(nèi)存池(MemoryPool)維護一個內(nèi)存塊鏈表(單鏈表),每個內(nèi)存塊由一個維護該內(nèi)存塊信息的塊頭結(jié)構(gòu)(MemoryBlock)和多個分配單元組成,塊頭結(jié)構(gòu)MemoryBlock則進一步維護一個該內(nèi)存塊的所有自由分配單元組成的"鏈表"。這個鏈表不是通過"指向下一個自由分配單元的指針"鏈接起來的,而是通過"下一個自由分配單元的編號"鏈接起來,這個編號值存儲在該自由分配單元的頭兩個字節(jié)中。另外,第I個自由分配單元的起始位置并不是MemoryBlock塊頭結(jié)構(gòu)"后面的"第I個地址位置,而是MemoryBlock塊頭結(jié)構(gòu)"內(nèi)部"的最后一個字節(jié)aData(也可能不是最后一個,因為考慮到字節(jié)對齊的問題),即分配單元實際上往前面錯了一位。又因為MemoryBlock塊頭結(jié)構(gòu)后面的空間剛好是分配單元的整數(shù)倍,這樣依次錯位下去,內(nèi)存塊的最后一個字節(jié)實際沒有被利用。這么做的一個原因也是考慮到不同平臺的移植問題,因為不同平臺的對齊方式可能不盡相同。即當(dāng)申請MemoryBlock大小內(nèi)存時,可能會返回比其所有成員大小總和還要大一些的內(nèi)存。最后的幾個字節(jié)是為了"補齊",而使得aData成為第I個分配單元的起始位置,這樣在對齊方式不同的各種平臺上都可以工作。最后利用鏈?zhǔn)綌?shù)據(jù)的連續(xù)性實現(xiàn)dump的恢復(fù)功能。
【權(quán)利要求】
1.基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,應(yīng)用內(nèi)存粹取技術(shù)XML方式恢復(fù)虛擬機,可實現(xiàn)當(dāng)虛擬機系統(tǒng)損壞、故障或虛擬機丟失時,通過調(diào)用內(nèi)存相關(guān)映像文件及核心模塊來恢復(fù)系統(tǒng)文件,恢復(fù)到出現(xiàn)問題5分鐘之前的虛擬機狀態(tài);其特征在于,包括如下步驟: 1)虛擬機日志信息存儲 虛擬機運行過程中,內(nèi)存池MemoryPool申請分配多個用來滿足內(nèi)存申請請求的內(nèi)存塊,這些內(nèi)存塊是從進程堆中開辟的一個較大的連續(xù)內(nèi)存區(qū)域,并把虛擬機日志信息存儲到內(nèi)存塊中; 2)索引 針對虛擬機任何操作所形成的數(shù)據(jù)塊和內(nèi)存塊隊列建立索引,并將此信息保存到硬盤索引隊列當(dāng)中,當(dāng)數(shù)據(jù)發(fā)生變化時,與原有的索引信息進行對比,將不同的索引信息進行保存,相同的索引信息不進行任何操作,同時生成內(nèi)存塊索引鏈表和硬盤索引鏈表; 3)內(nèi)存框架重構(gòu) 根據(jù)內(nèi)存索引鏈表信息和硬盤索引鏈表信息,重構(gòu)原始虛擬機虛擬硬件配置信息,如CPU、內(nèi)存、硬盤等,逐步恢復(fù)虛擬機原始狀態(tài); 4)仿生恢復(fù) 當(dāng)虛擬機硬件恢復(fù)完成時、通過云計算平臺WEB界面上的一鍵式恢復(fù)按鈕進行恢復(fù),恢復(fù)虛擬機原始應(yīng)用和 原始數(shù)據(jù),恢復(fù)到宕機前5分鐘時的狀態(tài)。
2.根據(jù)權(quán)利要求1所述的基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,其特征在于,所述內(nèi)存塊由一個塊頭結(jié)構(gòu)MemoryBlock和多個內(nèi)存分配單元組成,所有內(nèi)存塊組成了一個內(nèi)存塊鏈表,MemoryPool的pBlock是這個鏈表的頭;虛擬機對每個內(nèi)存塊,都可以通過其頭部的塊頭結(jié)構(gòu)MemoryBlock的pNext成員訪問緊跟在其后面的那個內(nèi)存塊。
3.根據(jù)權(quán)利要求2所述的基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,其特征在于,所述內(nèi)存分配單元大小固定,其中沒有分配的自由分配單元的頭兩個字節(jié)記錄了緊跟它之后的下一個自由分配單元的編號,通過利用每個自由分配單元的頭兩個字節(jié),一個MemoryBlock中的所有自由分配單元被鏈接起來。
4.根據(jù)權(quán)利要求1所述的基于云計算平臺應(yīng)用無備容災(zāi)的技術(shù)方法,其特征在于,所述內(nèi)存框架重構(gòu)具體過程如下: 當(dāng)有新的內(nèi)存請求到來時,MemoryPool會通過pBlock遍歷MemoryBlock鏈表,直到找到其中還有自由分配單元的內(nèi)存塊,取得其MemoryBlock的nFirst值,即該內(nèi)存塊中第I個可供分配的自由單元的編號,根據(jù)這個編號定位到該自由分配單元的起始位置;在返回這個地址前,首先將該位置開始的頭兩個字節(jié)的值賦給本內(nèi)存塊的MemoryBlock的nFirst成員,這樣下一次的請求就會用這個編號對應(yīng)的內(nèi)存單元來滿足,同時將此內(nèi)存塊的MemoryBlock的nFree遞減I,然后再將剛才定位到的內(nèi)存單元的起始位置作為此次內(nèi)存請求的返回地址返回給調(diào)用者; 如果從現(xiàn)有的內(nèi)存塊中找不到一個自由的內(nèi)存分配單元,MemoryPool就會從進程堆中申請一個內(nèi)存塊,申請完后,首先初始化這個內(nèi)存塊;初始化的操作包括設(shè)置MemoryBlock的nSize為所有內(nèi)存分配單元的大小、nFree為n_l,nFirst為I,初始化后,從MemoryBlock的aData位置開始,每隔nUnitSize大小取其頭兩個字節(jié),記錄其之后的自由分配單元的編號, 即自然序號加1,最后將此內(nèi)存塊的第I個分配單元的起始地址aData返回; 當(dāng)某個虛擬機被分配的單元因為delete需要回收時,該單元將返回給MemoryPool,MemoryPool能夠知道該單元的起始地址;這時,MemoryPool開始遍歷其所維護的內(nèi)存塊鏈表,判斷該單元的起始地址是否落在某個內(nèi)存塊的地址范圍內(nèi);如果不在所有內(nèi)存地址范圍內(nèi),則這個被回收的單元不屬于這個MemoryPool ;如果在某個內(nèi)存塊的地址范圍內(nèi),那么它會將這個剛剛回收的分配單元加到這個內(nèi)存塊的MemoryBlock所維護的自由分配單元鏈表的頭部,同時將其nFree值遞增I ; 回收后,內(nèi)存池的操作會繼續(xù)判斷:如果此內(nèi)存塊的所有分配單元都是自由的,那么這個內(nèi)存塊就會從MemoryPool中被移出并作為一個整體返回給進程堆;如果該內(nèi)存塊中還有非自由分配單元,則這個內(nèi)存塊會被移到MemoryPool維護的內(nèi)存塊的頭部,下次內(nèi)存請求到來MemoryPool遍歷其內(nèi)存塊鏈表尋找自由分配單元時,第1次尋找就會找到這個內(nèi)存塊。
【文檔編號】G06F11/07GK103970618SQ201410217274
【公開日】2014年8月6日 申請日期:2014年5月21日 優(yōu)先權(quán)日:2014年5月21日
【發(fā)明者】趙吉勇, 王新賀, 趙吉宇, 劉欣宇 申請人:遼寧中科信科技有限公司