處理
1、刪除RestoreLink文件
i1、通過刪除或者無效化RestoreLinkOID而標(biāo)記文件還原完成
3、作為正常用戶I/O繼續(xù)
a、在READ(讀取)的情況下,獲得數(shù)據(jù)并且返回給用戶
b、在WRITE(寫入)的情況下,更新數(shù)據(jù)的主要和HA鏡像拷貝。
[0171]下面的算法被用來對(duì)文件(由FileOID標(biāo)識(shí))實(shí)施I/O。
[0172]如果文件沒有正被實(shí)況還原,則系統(tǒng)按照結(jié)合早前的附圖所解釋的那樣實(shí)施文件系統(tǒng)I/O。也就是說,在READ(讀取)的情況下,系統(tǒng)從主要來源讀取數(shù)據(jù)并且將其返回給用戶;在WRITE(寫入)的情況下,系統(tǒng)把數(shù)據(jù)寫入到主要和HA拷貝。但是當(dāng)實(shí)況還原屬性有效時(shí),這一處理如下發(fā)生改變:
算法File_I/0(IN FileOID, IN 10_Reg1n, IN 10_Type: Read/Write)
1、從FiIeOID 獲得 RestoreLinkOID屬性
2、檢查文件FileOID是否正被實(shí)況還原
a、如果RestoreLinkOID不存在或者無效,則作為正常1繼續(xù)
1、在READ(讀取)的情況下,獲得數(shù)據(jù)并且返回給用戶
i1、在WRITE(寫入)的情況下,更新數(shù)據(jù)的主要和HA鏡像拷貝
3、如果RestoreLinkOID有效,則獲得對(duì)應(yīng)于1區(qū)段的還原狀
a、從相應(yīng)的RestoreLink文件(由RestoreLinkOID標(biāo)識(shí))加載位圖的一部分。由于每一個(gè)比特表示曾被還原或者需要被還原的區(qū)段,因此系統(tǒng)可以快速地確定所需要的比特集合
4、調(diào)用1ToFileBeingRestored(FileC)ID,10_Reg1n, R_State, 10_Type)o
[0173]目錄/文件還原
目錄和文件系統(tǒng)實(shí)況還原處理可以使用前面所描述的個(gè)體文件還原處理。
[0174]文件系統(tǒng)層級(jí)實(shí)況還原可以作為其根目錄的還原來對(duì)待。
[0175]目錄可以包含許多文件以及具有更多文件的其他子目錄。用以實(shí)施目錄還原的簡(jiǎn)單的方法可以是鎖定將要還原的目錄樹,并且隨后實(shí)施個(gè)體文件的實(shí)況還原。
[0176]雖然對(duì)于單個(gè)文件的實(shí)況還原幾乎是即時(shí)的,但是鎖定目的地目錄樹方法的主要問題在于:來源目錄可能包含許多子目錄和文件,從而導(dǎo)致非常長(zhǎng)的累積實(shí)況還原處理。由于在該處理發(fā)生的同時(shí)對(duì)于目的地目錄的訪問被阻塞,因此這可能是不合期望的。這種情況的一個(gè)效果是用戶I/O將會(huì)超時(shí),并且依賴于這些I/O的應(yīng)用將停止正確地操作。我們描述了一種在準(zhǔn)備文件以用于還原的整個(gè)持續(xù)時(shí)間內(nèi)不需要鎖定整個(gè)目的地目錄樹的處理。在還原目錄樹時(shí),目的地不能存在或者必須為空。
[0177]典型的文件系統(tǒng)具有遍歷目錄的內(nèi)容的確定性方式。每一個(gè)來源目錄(包括其子目錄)的內(nèi)容在操作的持續(xù)時(shí)間內(nèi)是固定的,并且可以按照明確定義的順序被遍歷。出于討論的目的,我們可以與樹遍歷并行。每一個(gè)目錄可以作為樹的一個(gè)節(jié)點(diǎn)來對(duì)待,并且每一個(gè)文件可以作為數(shù)據(jù)內(nèi)容來對(duì)待。正被還原的目錄可以被描述成多分支樹。使用傳統(tǒng)的樹深度優(yōu)先順序方法來遍歷還原來源目錄:首先訪問子目錄,并且隨后實(shí)況還原當(dāng)前目錄中的每一個(gè)文件。在實(shí)施遍歷的同時(shí),系統(tǒng)保持跟蹤其當(dāng)前正在遍歷的路徑。使用深度優(yōu)先方法的主要優(yōu)點(diǎn)在于,路徑信息受到限制并且較少。舉例來說,LINUX OS把文件路徑限制到4KiB,而與多少子目錄出現(xiàn)在該路徑上無關(guān)。
[0178]下面的算法使用以下輸入:RestoreSourceDp、RestoreSourceDir和RestorePathDir0
[0179]RestoreSourceDp是包含將要還原的數(shù)據(jù)的發(fā)現(xiàn)點(diǎn)(還原數(shù)據(jù)的來源) RestoreSourceDir是RestoreSourceDp中的正被還原的目錄與前面對(duì)于文件的情況一樣,二元組〈RestoreSourceDp,RestoreSourceDir〉形成將要還原的目錄的版本。 RestorePathDir是數(shù)據(jù)被還原到其中的路徑(目的地目錄
[0180]在還原目錄時(shí),系統(tǒng)保持關(guān)于正被還原的每一個(gè)目錄的、被稱作RestoreInProgress的私有(對(duì)于用戶不可見)屬性。該屬性記錄對(duì)應(yīng)于實(shí)況還原〈RestoreSourceDp, RestoreSourceDir〉的來源信息D該屬性的存在表明該目錄文件內(nèi)容實(shí)況還原尚未完成。該屬性不存在表明所述目錄中的所有文件都已被完全還原或者實(shí)況還原(元數(shù)據(jù)已完成并且數(shù)據(jù)正被還原),或者表明這是不需要還原的目錄(當(dāng)目錄被刪除并且所創(chuàng)建的目錄具有相同的名稱時(shí)可能發(fā)生這種情況)。該屬性主要被用來在目錄實(shí)況還原正在進(jìn)行中時(shí)協(xié)調(diào)進(jìn)來的命名空間操作。如果目錄被刪除并且被重新創(chuàng)建,則其不存在該屬性。
[0181]下面的算法被用來發(fā)起對(duì)于正被還原的目錄的后臺(tái)遍歷,并且隨后發(fā)起每一個(gè)個(gè)體文件的實(shí)況還原。該算法(如在圖18中描繪的)由系統(tǒng)在后臺(tái)執(zhí)行。每一個(gè)子目錄通過其名稱而不是通過其OID被訪問。
[0182]算法DirectoryLi veRe s tore (IN RestoreSourceDp, IN RestoreSourceDir, INRestorePathDir)
1、對(duì)于RestoreSourceDir中的每一個(gè)子目錄S
a、在RestorePathDir中以原子級(jí)創(chuàng)建子目錄S:
1、創(chuàng)建S
i1、從來源〈RestoreSourceDp,RestoreSourceDir〉還原S的元數(shù)據(jù)
ii1、記錄關(guān)于S 的屬性 RestoreInProgress
b、調(diào)用DirectoryLiveRestore(RestoreSourceDp,對(duì)應(yīng)于RestoreSourceDir中的S的完整路徑,對(duì)應(yīng)于RestorePathDir中的S的完整路徑)
2、調(diào)用DirectoryContentLiveRestore (RestoreSourceDp,RestoreSourceDir,RestorePathDir)0
[0183]系統(tǒng)允許對(duì)正被實(shí)況還原的目錄的命名空間操作。對(duì)于目錄的用戶訪問可能會(huì)與正在后臺(tái)運(yùn)行的目錄實(shí)況還原操作產(chǎn)生沖突。應(yīng)當(dāng)提到的是,前面描述了針對(duì)文件的操作沖突解析。
[0184]當(dāng)系統(tǒng)接收到基于路徑的操作時(shí),其遍歷所述路徑上的每一個(gè)子目錄,并且如果需要的話在原子級(jí)對(duì)該子目錄的內(nèi)容實(shí)施實(shí)況還原。
[0185]每一個(gè)目錄內(nèi)容關(guān)于文件系統(tǒng)操作的其余部分以原子級(jí)被還原。在這個(gè)討論中,“目錄內(nèi)容”意味著目錄內(nèi)的所有文件。子目錄沒有被即時(shí)還原,相反每一個(gè)子目錄被創(chuàng)建為其所有屬性都正被還原的一個(gè)對(duì)象,并且還利用RestoreInProgress屬性被標(biāo)記,從而表明其內(nèi)容需要在以后時(shí)間被還原。
[0186]下面的算法描述了這一處理。所述算法關(guān)于針對(duì)RestorePathDir的所有其他文件系統(tǒng)操作通過原子方式被執(zhí)行一一對(duì)于所有其他文件系統(tǒng)操作鎖定了針對(duì)該目錄的訪問。每一個(gè)子目錄通過其名稱而不是通過其OID被訪問。
[0187]算法DirectoryContentLiveRestore(IN RestoreSourceDp , INRestoreSourceDir, IN RestorePathDir)
1、如果 RestoreSourceDir 具有 RestoreInProgress,則
a、實(shí)況還原每一個(gè)文件:
1、對(duì)于ReStoreSourceDir 中的每一個(gè)文件F調(diào)用PrepareFi IeForRestore (對(duì)應(yīng)于RestorePathDir中的F的完整路徑,〈對(duì)應(yīng)于RestorePathDir中的F的完整路徑>,RestoreSourceDp〉)
b、對(duì)于RestoreSourceDir中的每一個(gè)子目錄S:
1、如果S在RestorePathDir中不存在,則
i1、創(chuàng)建S
ii1、從來源〈RestoreSourceDp,RestoreSourceDir〉還原S的元數(shù)據(jù)
iv、記錄關(guān)于S 的屬性 RestoreInProgress: Re store InProgr ess=<RestoreSourceDp,RestoreSourceDir中的S的完整路徑)
C、標(biāo)記目錄實(shí)況還原完成(消除RestoreInProgress屬性)
下面的算法被用來在實(shí)施用戶I /0時(shí)解決命名空間(路徑)沖突。
[0188]10_Path標(biāo)識(shí)出被用于操作的文件系統(tǒng)命名空間內(nèi)的對(duì)象路徑。
[0189]fsOperat1n標(biāo)識(shí)出由用戶請(qǐng)求的文件系統(tǒng)操作。
[0190]算法ResolveNameSpaceOnLiveRestore(IN 10_Path, IN fsOperat1n)
1、把10_Path分解成個(gè)體令牌:10_Path=〈Sl,S2,..., Sn〉。應(yīng)當(dāng)提到的是,Sn可以是目錄或文件。只有最后一個(gè)令牌可以是文件。
2、對(duì)于每一個(gè)Si,i=l...η
a、如果Si是Sn并且是文件一一如前面所描述的那樣解決操作,因?yàn)樵撐募膶?shí)況還原的角度看來已經(jīng)被處理
b、如果Si是目錄并且具有RestoreInProgress,則執(zhí)行DirectoryContentLiveRestore(RestoreSourceDp, RestoreSourceDir, Si的完整路徑)。
[0191]當(dāng)用戶I/O到達(dá)時(shí),子路徑可能已經(jīng)被還原,在這種情況下不需要做任何事情。當(dāng)子路徑由先前的用戶操作或者由后臺(tái)目錄實(shí)況還原還原時(shí)可能會(huì)發(fā)生這種情況。
[0192]如果子路徑尚未被還原,則這意味著這是對(duì)于該子路徑的第一用戶操作,并且后臺(tái)實(shí)況還原尚未將其還原。在這種情況下,系統(tǒng)鎖定該子路徑并且實(shí)施內(nèi)容實(shí)況還原。當(dāng)后臺(tái)處理進(jìn)入該路徑時(shí),其將快速地確定不需要做任何事情并且繼續(xù)進(jìn)行。
[0193]塊層級(jí)實(shí)況還原
正如前面所提到的那樣,實(shí)況還原還可以在塊層級(jí)發(fā)生。這是對(duì)整個(gè)站點(diǎn)實(shí)施實(shí)況還原的優(yōu)選方式。
[0194]系統(tǒng)層
下面的定義被用于描述塊層級(jí)實(shí)況還原處理。
站點(diǎn)P—正被還原的主要站點(diǎn)
站點(diǎn)R—一被用作站點(diǎn)還原操作的來源的遠(yuǎn)程(本地位置或遠(yuǎn)程位置處的智能節(jié)點(diǎn))站點(diǎn)。
[0195]每一個(gè)站點(diǎn)通常由以下功能層構(gòu)成:物理存儲(chǔ)、文件系統(tǒng)以及虛擬盤層。圖19示出了所述三個(gè)存儲(chǔ)層及其關(guān)系。
[0196]物理存儲(chǔ)層(PSU1910——物理存儲(chǔ)介質(zhì),HDD、SSD等等。
[0197]文件系統(tǒng)層(FSLH920——這是實(shí)施文件系統(tǒng)的層。FSL主要出于兩個(gè)原因使用存儲(chǔ),即存儲(chǔ)文件系統(tǒng)元數(shù)據(jù)(內(nèi)部文件系統(tǒng)和命名空間信息)和用戶數(shù)據(jù)。在沒有用戶文件I/o的情況下,F(xiàn)SL對(duì)于其操作只需要元數(shù)據(jù),并且不訪問或修改被用來存儲(chǔ)用戶數(shù)據(jù)的存儲(chǔ)區(qū)域。更新的FSL實(shí)現(xiàn)方式趨向于支持所謂的TRM操作。TRM操作由FSL使用來向物理存儲(chǔ)通知某一區(qū)域不再被使用,并且可以由PSL收回。
[0198]虛擬盤層(VDD1930—一這是位于物理和文件系統(tǒng)層之間的層,并且被用來虛擬化物理存儲(chǔ)配置。VDL消耗物理存儲(chǔ),并且向文件系統(tǒng)層呈現(xiàn)虛擬盤。這樣就允許不具有相同的存儲(chǔ)(盤)配置的站點(diǎn)之間的站點(diǎn)還原。VDL還被用來跟蹤被呈現(xiàn)到文件系統(tǒng)層的每一個(gè)虛擬盤處的區(qū)域分配。在該實(shí)施例中,為了討論簡(jiǎn)單起見,VDL被描述成與FSL分開的邏輯層。但是在某種其他實(shí)現(xiàn)方式中,其可以被直接實(shí)施在PSL或FSL之內(nèi)JDL可以負(fù)責(zé)為元數(shù)據(jù)(MD)和用戶數(shù)據(jù)(D)結(jié)構(gòu)保持單獨(dú)的邏輯構(gòu)造,正如后面所描述的那樣。
[0199]可以從文件系統(tǒng)中提取出的一項(xiàng)信息是存儲(chǔ)元數(shù)據(jù)的區(qū)域。但是這樣做的代價(jià)可能是高昂的。在更好的方法中,文件系統(tǒng)可以被實(shí)施成使得他將其元數(shù)據(jù)存儲(chǔ)在專用于僅有元數(shù)據(jù)用途的單獨(dú)的存儲(chǔ)器件(或多個(gè)存儲(chǔ)器件)上。當(dāng)與這種方法組合時(shí),利用VDL處置區(qū)域分配跟蹤,允許快速地識(shí)別由文件系統(tǒng)層分配/使用的元數(shù)據(jù)區(qū)域。
[0200]塊實(shí)況還原
VDL實(shí)施塊實(shí)況還原操作。其被用來從一個(gè)站點(diǎn)到另一個(gè)站點(diǎn)還原區(qū)域的集合。區(qū)域的列表被保持在數(shù)據(jù)還原區(qū)域映射圖中。在給定這樣的映射圖的情況下,VDL在邏輯塊層級(jí)從遠(yuǎn)程站點(diǎn)拷貝數(shù)據(jù)。在后面描述并且在圖20中示出了一般的算法。
[0201]如前面所描述的站點(diǎn)P。
[0202]如前面所描述的站點(diǎn)R。
[0203]RestoreExtentMap是保持將要還原的區(qū)域的列表的數(shù)據(jù)區(qū)域映射圖。
[0204]算法BlockLiveRestore(INRestoreExtentMap, IN Site_P, IN Site_R)
1、對(duì)于RestoreExtentMap中的每一個(gè)區(qū)域,從遠(yuǎn)程位置Site_Ra取數(shù)據(jù)并且將其在本地拷貝到Site_P—一(數(shù)據(jù)的主要和HA鏡像拷貝都被拷貝)
2、利用關(guān)于已被還原的區(qū)域的信息更新RestoreExtentMap。
[0205]還原區(qū)域位圖
人們可以使用多種方法來跟蹤被還原和未被還原的區(qū)域。一種方法是使用位圖。位圖的使用允許對(duì)正被還原的區(qū)域進(jìn)行隨機(jī)訪問。在這種情況下對(duì)位圖的使用類似于其被用于文件實(shí)況還原的方式。還原區(qū)域位圖中的每一個(gè)比特跟蹤對(duì)應(yīng)于以原子級(jí)被還原的區(qū)域的還原狀態(tài)。舉例來說,數(shù)值為O的比特標(biāo)記需要被還原的區(qū)域,而數(shù)值為I的比特標(biāo)記已被還原的區(qū)域。初始創(chuàng)建零位圖(所有比特都被設(shè)定到零),從而表明還沒有區(qū)域被還原。隨著實(shí)況還原繼續(xù)并且個(gè)體區(qū)域被還原,還原區(qū)域位圖被更新以反映出對(duì)應(yīng)于每一個(gè)區(qū)域的還原狀態(tài)。
[0206]在寫時(shí)拷貝(copy-on-write)文件系統(tǒng)中,數(shù)據(jù)從不會(huì)被覆寫。每一項(xiàng)修改都被寫入到新分配的塊。對(duì)于這些文件系統(tǒng),關(guān)于正被還原(已還原對(duì)需要被還原)的區(qū)域的信息可以通過使用單個(gè)還原水印來實(shí)施,其中水印之下的區(qū)域已被還原,并且水印之上的區(qū)域尚未被還原。
[0207]如果接收到針對(duì)某一區(qū)域的1/0,則使用下面的邏輯。系統(tǒng)通過創(chuàng)建數(shù)據(jù)的HA拷貝來保護(hù)新還原和新寫入的用戶數(shù)據(jù)。
[0208]針對(duì)正被實(shí)況還原的區(qū)域的I/O
使用下面的算法來實(shí)施針對(duì)正被還原的塊(區(qū)域)的用戶I/O 10_Regi on——標(biāo)識(shí)I /0操作塊 10_Type--標(biāo)識(shí)讀取或?qū)懭氩僮鳌?br>[0209]算法1ToBlockBeingRestorecKIN 10_Reg1n, IN 10_Type: Read/Write, INRestoreExtentMap, IN Site_P, IN Site_R)
1、使用RestoreExtentMap確定與用戶I/O重疊的還原區(qū)域
2、如果區(qū)域尚未被還原,則還原所需要的區(qū)域
a、從Site_R來源讀出數(shù)據(jù),并且將其寫入到目的地Site_P—一數(shù)據(jù)的主要和HA鏡像拷貝
b、更新RestoreExtentMap,從而標(biāo)記區(qū)域還原完成
c、如果所有區(qū)域都被還原,則完成還原處理
3、作為正常1繼續(xù)
a、在READ(讀取)的情況下,獲得數(shù)據(jù)并且返回給用戶
b、在WRITE(寫入)的情況下,更新數(shù)據(jù)的主要和HA鏡像拷貝
C、O
[0210]圖21示出了當(dāng)還原區(qū)域映射圖被用來跟蹤關(guān)于各個(gè)區(qū)域以及進(jìn)行中的用戶I/O(寫入)的還原信息時(shí)的塊還原處理2100的一個(gè)實(shí)例。
[0211]數(shù)據(jù)區(qū)域被從遠(yuǎn)程儲(chǔ)集池130(從系統(tǒng)R)還原到主要儲(chǔ)集池110(到系統(tǒng)P)。遠(yuǎn)程儲(chǔ)集池包含將要還原的用戶數(shù)據(jù)2110。在該實(shí)現(xiàn)方式中,遠(yuǎn)程儲(chǔ)集池被劃分在各個(gè)區(qū)域上。因此,系統(tǒng)R跟蹤關(guān)于所使用的區(qū)域的信息,并且在還原處理開始之前使得該信息可用于系統(tǒng)R。以原子級(jí)逐個(gè)區(qū)域地還原儲(chǔ)集池中的數(shù)據(jù)。在該實(shí)現(xiàn)方式中,使用還原區(qū)域位圖2135來管理實(shí)況還原期間的區(qū)域的還原狀態(tài)。對(duì)于將要還原的每一個(gè)區(qū)域,來源儲(chǔ)集池(系統(tǒng)R)在還原區(qū)域位圖中保持一個(gè)比特,以便跟蹤某一區(qū)域是否已被還原。數(shù)值為I的比特標(biāo)記已被還原的區(qū)域,而數(shù)值為O的比特標(biāo)記需要被還原的區(qū)域。
[0212]在圖21中,主要數(shù)據(jù)2120中的區(qū)域A和B已經(jīng)基于存儲(chǔ)在來源儲(chǔ)集池中的先前收集的分析使用日程安排而被還原。在這里,塊C當(dāng)前正被用戶I/O操作2130修改。塊C被還原,隨后將數(shù)據(jù)與用戶數(shù)據(jù)合并從而得到數(shù)據(jù)C’,數(shù)據(jù)C’隨后被存儲(chǔ)在主要和HA拷貝全部二者之內(nèi)。隨著更多的文件塊被還原,還原區(qū)域位圖被更新,以便反映出進(jìn)行中的實(shí)況還原的狀
??τ O
[0213]對(duì)于FSL發(fā)出的TRIM操作的處置
正如后面所描述的那樣,一旦文件系統(tǒng)元數(shù)據(jù)被拷貝到還原位置,用戶就被允許訪問其數(shù)據(jù),這可以隨后導(dǎo)致修改文件系統(tǒng)元數(shù)據(jù)。這可以在對(duì)將要還原的文件系統(tǒng)進(jìn)行修剪期間發(fā)生,或者后來在對(duì)于正被還原的站點(diǎn)的用戶I/o期間發(fā)生。這些操作可以導(dǎo)致由文件系統(tǒng)使用的元數(shù)據(jù)和數(shù)據(jù)區(qū)段中的一些被釋放。這還可以導(dǎo)致向VDL發(fā)出TR頂操作,從而表明某一存儲(chǔ)區(qū)段不再被FSL使用。當(dāng)接收到對(duì)應(yīng)于元數(shù)據(jù)區(qū)段的TR頂操作時(shí),系統(tǒng)將其如所有元數(shù)據(jù)塊都已被恢復(fù)的那樣正常處理。當(dāng)接收到對(duì)應(yīng)于數(shù)據(jù)區(qū)段的TRM操作時(shí),由于其不需要被還原,因此系統(tǒng)找到由該區(qū)段表明的、存在于還原區(qū)域映射圖中的所有區(qū)域,并且將其還原標(biāo)記為完成。應(yīng)當(dāng)注意的是,如果在映射圖中沒有找到某一區(qū)域,則相應(yīng)的區(qū)域?qū)崨r還原已經(jīng)完成或者還不需要還原;在任何情況下,都不再需要對(duì)于還原映射圖的進(jìn)一步動(dòng)作。
[0214]當(dāng)作為用戶元數(shù)據(jù)修剪或I/O操作的結(jié)果接收到對(duì)某一數(shù)據(jù)區(qū)段的TRM操作時(shí),下面的算法被用來保持?jǐn)?shù)據(jù)區(qū)域還原映射圖。使用以下自變量:
如前面所描述的RestoreExtentMap
TrimDataReg1n是由FSL標(biāo)記為不處于使用中的數(shù)據(jù)區(qū)段。
[0215]算法ProcessTrim(IN RestoreExtentMap, IN TrimDataReg1n)
1、對(duì)于數(shù)據(jù),同樣處在RestoreExtentMap中的TrimDataReg1n中的每一個(gè)區(qū)域E把E還原狀態(tài)標(biāo)記為完成(把相應(yīng)的比特設(shè)定到I)。
[0216]站點(diǎn)還原
正如前面簡(jiǎn)要討論的那樣,塊實(shí)況還原還可以被應(yīng)用于整個(gè)站點(diǎn)的還原。下面的描述假設(shè)文件系統(tǒng)層使用由VDL呈現(xiàn)的專用虛擬器件來存儲(chǔ)其元數(shù)據(jù),并且FSL向下方的存儲(chǔ)層發(fā)出TRIM操作