在內(nèi)容可尋址存儲系統(tǒng)中維護(hù)并使用子對父映射的緩存的制作方法
【專利說明】
[0001] 相關(guān)申請的交叉引用
[0002] 本申請涉及于2013年11月21日提交的美國專利申請第14/086, 197號,通過引 用將其闡述的全部內(nèi)容結(jié)合于本文中。
技術(shù)領(lǐng)域
[0003] 本發(fā)明涉及一種存儲系統(tǒng),并且更具體地,涉及用于維護(hù)并使用內(nèi)容可尋址存 儲系統(tǒng)(content-addressable storage system)中的子對父映射(child-to-parent mapping)的緩存(cache)。
【背景技術(shù)】
[0004] 本部分中所描述的方法可能被實現(xiàn),但其并非一定是先前已經(jīng)構(gòu)思或?qū)崿F(xiàn)的方 法。因此,除非在本文中明確指出并非如此,否則在本部分中所描述的方法對于本申請中的 權(quán)利要求來說并非現(xiàn)有技術(shù)并且不應(yīng)因被包含在本部分中而被視為現(xiàn)有技術(shù)。
[0005] 在典型的文件系統(tǒng)中,基于項所存儲的位置和項的名稱或標(biāo)識符來對所存儲的項 進(jìn)行檢索。例如,如果名為"f〇〇. txt"的文件位于名為"c :\myfiles\text"的目錄下,那么 應(yīng)用程序可以使用路徑名"C:\myfiles\text\foo.txt"作為訪問密鑰(access key)以從 文件系統(tǒng)中檢索文件。因為傳統(tǒng)的訪問密鑰是基于正被檢索的項的位置,因此,當(dāng)項在文件 系統(tǒng)的目錄結(jié)構(gòu)中被移動時訪問密鑰改變。另外,因為項的各副本被存儲于不同的位置,因 此,各副本具有不同的訪問密鑰。另一方面,當(dāng)項的內(nèi)容被改變時,訪問密鑰保持不變。
[0006] 與傳統(tǒng)的文件系統(tǒng)相比,內(nèi)容可尋址存儲系統(tǒng)允許基于從項的內(nèi)容生成的數(shù)據(jù) (諸如,用于該項的哈希值)來對項進(jìn)行檢索。由于內(nèi)容可尋址存儲系統(tǒng)是基于項的內(nèi)容而 不是基于針對與特定文件名相關(guān)的特定項的靜態(tài)位置來對項執(zhí)行存儲相關(guān)的操作,因此, 請求該操作的應(yīng)用程序可以在不知道所存儲的項的副本的數(shù)量或位置的情況下執(zhí)行這樣 的操作。
[0007] 塊存儲系統(tǒng)(chunk storage system)是一種在不了解數(shù)字信息本身的格式或內(nèi) 容的情況下執(zhí)行存儲操作的存儲系統(tǒng)。因為該系統(tǒng)將所有形式的數(shù)字項都視為好像那些項 僅僅是數(shù)據(jù)的不透明塊,故這樣的存儲系統(tǒng)被稱為塊存儲系統(tǒng)。例如,同一塊存儲系統(tǒng)可 以由文字處理應(yīng)用程序、圖像管理應(yīng)用程序和日歷系統(tǒng)所使用,以分別存儲文檔、圖像和日 程。然而,從塊存儲系統(tǒng)的角度來看,僅存儲一種類型的項:數(shù)字信息的不透明塊。
[0008] 塊存儲系統(tǒng)可以被實施為內(nèi)容可尋址存儲系統(tǒng)。例如,塊存儲系統(tǒng)可以基于塊的 內(nèi)容(諸如通過將密碼哈希函數(shù)(例如,MD5、SHA-I或SHA2)應(yīng)用于塊)生成用于塊的訪 問密鑰。然后,塊儲存器可以存儲該塊并且維護(hù)索引數(shù)據(jù)(indexing data),其中,該索引數(shù) 據(jù)使哈希值與該塊所存儲的位置相關(guān)。當(dāng)應(yīng)用程序隨后請求對該塊進(jìn)行檢索時,該應(yīng)用程 序?qū)⒐V堤峁┙o塊存儲系統(tǒng)。塊存儲系統(tǒng)使用該索引數(shù)據(jù)以對與哈希值相關(guān)的塊進(jìn)行定 位,并且將這樣定位的塊提供給請求(requesting)應(yīng)用程序。
[0009] 當(dāng)通過內(nèi)容可尋址存儲系統(tǒng)中的一個或多個塊來表示項時,在項被修改的情況 下,額外的一個或多個塊需要添加至該內(nèi)容可尋址存儲系統(tǒng)。因為訪問密鑰是基于內(nèi)容的, 故用于與修改后的項相對應(yīng)的任意塊的訪問密鑰將不同于與用于與原始項相對應(yīng)的塊的 訪問密鑰。此外,對于原始項的參照,諸如哈希值或其他訪問密鑰,僅可用于訪問原始項而 不能訪問修改后的項。
[0010] 文件系統(tǒng)卷(file system volume)可包括按照文件夾層級布置的一個或多個文 件。為了將這樣的文件系統(tǒng)卷作為塊存儲在內(nèi)容可尋址存儲系統(tǒng)中,可以在一個或多個存 儲的塊來反映文件夾層級本身。例如,假設(shè)塊A表示文件夾A,并且塊B和塊C表示文件夾 A中的文件。在這種情況下,表示文件夾A的塊A可以包括用于塊B和塊C的訪問密鑰, 從而反映了文件夾A與文件B和C之間的層級關(guān)系。這樣的訪問密鑰可被用于向下導(dǎo)航 (navigate)文件夾層級。然而,如果在沒有導(dǎo)航通過文件夾層級的情況下獲得了特定塊 (諸如響應(yīng)于索引搜索),則在確定文件夾層級中的特定塊的位置時出現(xiàn)了問題。不同于具 有基于位置的訪問密鑰(諸如路徑名"C :\myfiles\text\foo. txt")的典型的文件系統(tǒng), 塊的訪問密鑰不包括任何文件夾層級中的塊的位置。
[0011] 此外,在內(nèi)容可尋址存儲系統(tǒng)中,當(dāng)特定的文件的內(nèi)容被修改時,必須基于所修改 的內(nèi)容將該文件的新版本存儲于不同的地址,導(dǎo)致用于新文件的訪問密鑰發(fā)生改變。當(dāng)在 一個或多個塊中表示文件系統(tǒng)層級時,包含原始文件的訪問密鑰的塊(即,在層級中與所 修改的塊相對應(yīng)的項上方的項相對應(yīng)的塊)也必須被改變至新文件的訪問密鑰,導(dǎo)致依次 生成額外的新塊。因此,修改單個文件可能導(dǎo)致反映文件系統(tǒng)的層級化結(jié)構(gòu)的多個塊發(fā)生 改變。
[0012] -個或多個索引可被維護(hù)用于存儲在內(nèi)容可尋址存儲系統(tǒng)中的文件系統(tǒng)卷的塊。 該索引可以通過訪問密鑰來識別文件系統(tǒng)卷的塊。當(dāng)塊的新版本被存儲在內(nèi)容可尋址存儲 系統(tǒng)中時,還必須更新任何這樣的索引。對索引進(jìn)行更新的未使用過的( nafee)實施方 式包括通過從根塊(root chunk)迭代通過層級來對每一個塊改變做出響應(yīng),以及重建用于 文件系統(tǒng)卷中的所有塊的索引。因為它涉及在任何文件被修改時迭代通過文件系統(tǒng)層級中 每一個塊,故這不是可升級的解決方案。
【發(fā)明內(nèi)容】
[0013] 根據(jù)本發(fā)明的一個方面,公開了一種方法,包括:維持子到父映射的緩存;其中, 每個子到父映射對應(yīng)于存儲在內(nèi)容可尋址存儲系統(tǒng)中的塊的層級結(jié)構(gòu)中的具體塊,并將所 述具體塊映射至所述塊的層級結(jié)構(gòu)中的父塊;其中,所述塊的層級結(jié)構(gòu)包括與文件系統(tǒng)卷 相關(guān)的第一根塊;響應(yīng)于對于所述文件系統(tǒng)卷的、使新根塊與所述文件系統(tǒng)卷相關(guān)聯(lián)的改 變,通過基于從所述新根塊遍歷當(dāng)前文件系統(tǒng)層級結(jié)構(gòu)的至少一部分添加一個或多個第一 子到父映射來更新所述緩存,并且基于從所述第一根塊遍歷先前文件系統(tǒng)層級結(jié)構(gòu)的至少 一部分來移除一個或多個第二子到父映射。
[0014] 根據(jù)本發(fā)明的另一方面,公開了一種非暫存性計算機(jī)可讀介質(zhì),所述非暫存性計 算機(jī)可讀介質(zhì)存儲的指令在由一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行: 維持子到父映射的緩存;其中,每個子到父映射對應(yīng)于存儲在內(nèi)容可尋址存儲系統(tǒng)中的塊 的層級結(jié)構(gòu)中的具體塊,并將所述具體塊映射至所述塊的層級結(jié)構(gòu)中的父塊;其中,所述塊 的層級結(jié)構(gòu)包括與文件系統(tǒng)卷相關(guān)的第一根塊;響應(yīng)于對于所述文件系統(tǒng)卷的、使新根塊 與所述文件系統(tǒng)卷相關(guān)聯(lián)的改變,通過基于從所述新根塊遍歷當(dāng)前文件系統(tǒng)層級結(jié)構(gòu)的至 少一部分添加一個或多個第一子到父映射來更新所述緩存,并且基于從所述第一根塊遍歷 先前文件系統(tǒng)層級結(jié)構(gòu)的至少一部分來移除一個或多個第二子到父映射。
【附圖說明】
[0015] 在附圖中:
[0016] 圖1是圖示了用于表示內(nèi)容可尋址存儲系統(tǒng)中的文件系統(tǒng)的系統(tǒng)的實施方式的 框圖;
[0017] 圖2是圖示了在文件系統(tǒng)變更之前和之后的塊的層級的實施方式的框圖;
[0018] 圖3A至圖3C是圖示了子對父映射的緩存的實施方式的框圖;
[0019] 圖4A至圖4B是圖示了處于變更的子對父映射的緩存的實施方式的框圖;
[0020] 圖5A至圖5B是圖示了塊索引的實施方式的框圖;
[0021] 圖6是圖示了子對父映射的緩存的實施方式的框圖;
[0022] 圖7是示出了基于新的根塊用于更新子對父映射的緩存的處理的實施方式的流 程圖;
[0023] 圖8是示出了基于新的根塊用于添加一個或多個子對父映射的處理的實施方式 的流程圖;
[0024] 圖9是示出了基于先前的根塊用于移除一個或多個子對父映射的處理的實施方 式的流程圖;
[0025] 圖10是示出了針對使用子對父映射的緩存以確定塊的至少一個祖先(ancestor) 的流程圖;
[0026] 圖11示出了一個或多個實施方式可以在其上實施的計算機(jī)系統(tǒng)。
【具體實施方式】
[0027] 在以下描述中,為了說明的目的,闡述了許多具體的細(xì)節(jié)以提供對本發(fā)明的整體 的理解。然而,將顯而易見的是可以在沒有這些具體細(xì)節(jié)的情況下實踐本發(fā)明。在其他實 例中,以框圖的形式示出了眾所周知的結(jié)構(gòu)和設(shè)備以避免不必要地使本發(fā)明模糊不清。
[0028] 總體概覽
[0029] 提供了一種用于維護(hù)并使用內(nèi)容可尋址存儲系統(tǒng)中的子對父映射的緩存的技術(shù)。 子對父映射的緩存被維護(hù)用于屬于文件系統(tǒng)層級的塊。該文件系統(tǒng)層級包括表示文件系統(tǒng) 卷的文件夾和文件的對象塊。該塊被存儲在內(nèi)容可尋址存儲系統(tǒng)中。各個子對父映射將特 定塊映射至塊的層級的父塊。該子對父映射允許在沒有從文件系統(tǒng)層級的根塊遍歷該文件 系統(tǒng)層級的前提下快速地確定任意特定塊的路徑。
[0030] 當(dāng)文件系統(tǒng)層級被修改時,生成新的根塊。更新子對父映射的緩存是通過:基于從 新的根塊遍歷當(dāng)前文件系統(tǒng)層級的至少一部分來添加一個或多個第一子對父映射以及基 于從先前根塊遍歷先前文件系統(tǒng)層級的至少一部分來移除一個或多個第二子對父映射。表 示文件系統(tǒng)層級的圖表被頻繁地修改。通常,每次修改包括對大的圖表進(jìn)行的改變的小集 合。本文中描述的技術(shù)在與對文件系統(tǒng)層級進(jìn)行改變的次數(shù)成正比的時間量(而非與表示 文件系統(tǒng)層級的圖表的大小成正比的時間量)產(chǎn)生對于表示文件系統(tǒng)層級的圖表的改變, 使得更新處理是可升級的。
[0031] 更新處理能夠產(chǎn)生所添加的塊的列表和所移除的塊的列表、或者以其他方式識別 先前文件系統(tǒng)層級與隨后的當(dāng)前文件系統(tǒng)層級之間的差異。所添加的塊和所移除的塊的列 表可以被用于執(zhí)行一個或多個文件系統(tǒng)維護(hù)功能。在一個實施方式中,基于所添加的塊和 所移除的塊有效地更新了與文件系統(tǒng)卷相關(guān)的塊數(shù)據(jù)的索引。
[0032] 塊存儲服務(wù)器
[0033] 圖1是圖示了一系統(tǒng)的實施方式的框圖,該系統(tǒng)用于表示內(nèi)容可尋址存儲系統(tǒng)中 的文件系統(tǒng)卷的。塊數(shù)據(jù)存儲器114是被配置為存儲多個塊的內(nèi)容可尋址存儲系統(tǒng)。盡管 示出了單個塊,但是,塊數(shù)據(jù)存儲器114可以包括任意數(shù)量的塊數(shù)據(jù)存儲器、網(wǎng)絡(luò)部件或適 合于實施數(shù)據(jù)存儲系統(tǒng)的任何其他部件。在一個實施方式中,塊數(shù)據(jù)存儲器114和塊存儲 服務(wù)器112是云存儲服務(wù)器的部件。
[0034] 塊存儲服務(wù)器112提供經(jīng)由基于塊內(nèi)容的訪問密鑰(諸如塊的內(nèi)容的哈希值)對 存儲在塊數(shù)據(jù)存儲