專利名稱:使用細(xì)分段的集群存儲的制作方法
使用細(xì)分段的集群存儲 本申請要求2007年4月19日提交的、標(biāo)題為"有效存儲、相似性確定和傳輸?shù)募?xì) 分段"的美國臨時專利申請No. 60/925514的優(yōu)先權(quán),為了所有目的,通過引用將其結(jié)合到本 文中。 本申請要求2007年4月11日提交的、標(biāo)題為"使用細(xì)分段的集群存儲"的美國臨 時專利申請No. 60/923066的優(yōu)先權(quán),為了所有目的,通過引用將其結(jié)合到本文中。
本申請要求2007年4月11日提交的、標(biāo)題為"使用增量壓縮的集群存儲"的美國 臨時專利申請No. 60/922996的優(yōu)先權(quán),為了所有目的,通過引用將其結(jié)合到本文中。
背景技術(shù):
將數(shù)據(jù)存儲系統(tǒng)擴大到保存更多信息是重要的,因為數(shù)據(jù)存儲用戶持續(xù)增加其預(yù) 期的存儲要求。 一種方式是將多個單獨存儲系統(tǒng)聚集成集群,它將多個單獨節(jié)點的容量和 性能結(jié)合成一體。但是,為了平滑地縮放,必須按照節(jié)點上存儲的數(shù)據(jù)以及節(jié)點所需的處理 和吞吐量來適當(dāng)使用集群的各節(jié)點。 —些存儲系統(tǒng)通過消除所存儲數(shù)據(jù)的冗余副本來優(yōu)化存儲,這稱作消除重復(fù)。在 一些情況下,所存儲數(shù)據(jù)被分為段。首先將預(yù)期要存儲的新段與已經(jīng)存儲的那些段進行比 較。如果該段已經(jīng)存儲在系統(tǒng)上,則存儲引用來取代新段,而不是存儲整個段。這種形式的 消除重復(fù)稱作識別碼壓縮。 在隨集群使用識別碼壓縮中,為了實現(xiàn)高效率并且查找匹配段,各節(jié)點理想地搜 索所有節(jié)點中的所有所存儲段,以及另外可使用索引來引用所有節(jié)點中的所有段。對所有 節(jié)點上的所有段進行搜索和索引的能力在擴大到大量節(jié)點時產(chǎn)生問題,因為各節(jié)點必須保 持它對集群的各節(jié)點上存儲的所有段進行搜索和索引的能力。 在使用集群方式來擴大存儲方面,在節(jié)點之間劃分段、使得單個節(jié)點無需保持其 對集群的各節(jié)點上存儲的所有段進行搜索和索引的能力,是有用的。這種劃分有時基于段 的散列,使得在給定段的情況下可計算散列,并且可在具有該段的節(jié)點已經(jīng)存在于集群時 識別該節(jié)點。由于各節(jié)點僅存儲若干段中的一些段,因此各節(jié)點僅需要對若干段的中的一 些段進行索引。然而,在根據(jù)段的散列將段指配給不同節(jié)點中,可能損失局部性,因而損失 性能。理想地,依次訪問的段應(yīng)當(dāng)依次存儲在磁盤上,使得單次磁盤訪問可同時檢索許多相 關(guān)段。 一般來說,將順序段指配給不同節(jié)點使得難以依次對段進行存儲。
在以下具體實施方式
和附圖中公開了本發(fā)明的各個實施例。 圖1是示出使用細(xì)分段的群集存儲的系統(tǒng)的一個實施例的框圖。 圖2是示出使用集群存儲的存儲系統(tǒng)的框圖。 圖3A是示出數(shù)據(jù)流或者數(shù)據(jù)塊的一部分的一個實施例的框圖。 圖3B是示出分配給集群節(jié)點的段的一個實施例的框圖。 圖4是示出集群存儲的過程的一個實施例的流程圖。
圖5是示出用于選擇存儲節(jié)點的過程的一個實施例的流程圖。 圖6是示出用于選擇存儲節(jié)點的過程的一個實施例的流程圖。 圖7是示出用于存儲段的表示的過程的一個實施例的流程圖。 圖8是示出用于在先前存儲的子段之中查找重復(fù)子段的過程的一個實施例的流程圖。 圖9是示出用于存儲段的表示的過程的一個實施例的流程圖。 圖10是示出用于存儲段的表示的過程的一個實施例的流程圖。
具體實施例方式
本發(fā)明可通過多種方式來實現(xiàn),其中包括過程、設(shè)備、系統(tǒng)、物質(zhì)構(gòu)成、計算機可讀 介質(zhì)、如計算機可讀存儲介質(zhì)或者其中程序指令通過光或電子通信鏈路發(fā)送的計算機網(wǎng) 絡(luò)。在本說明書中,這些實現(xiàn)或者本發(fā)明可采取的任何其它形式可稱作技術(shù)。描述為配置 成執(zhí)行任務(wù)的例如處理器或存儲器等組件包括在給定時間暫時配置成執(zhí)行該任務(wù)的通用 組件和/或制造成執(zhí)行該任務(wù)的專用組件。 一般來說,所公開過程的步驟的順序在本發(fā)明 的范圍內(nèi)可改變。 下面連同示出本發(fā)明的原理的附圖一起提供本發(fā)明的一個或多個實施例的詳細(xì)
描述。結(jié)合這類實施例來描述本發(fā)明,但是,本發(fā)明并不局限于任何實施例。本發(fā)明的范圍
僅由權(quán)利要求來限定,并且本發(fā)明包括多種備選、修改和等效方案。在以下描述中提出大量
具體細(xì)節(jié),以便提供對本發(fā)明的透徹理解。作為示例來提供這些細(xì)節(jié),本發(fā)明可在沒有這些
具體細(xì)節(jié)的部分或全部的情況下根據(jù)權(quán)利要求來實施。為了簡潔起見,沒有詳細(xì)描述與本
發(fā)明相關(guān)的技術(shù)領(lǐng)域中已知的技術(shù)資料,以免不必要地影響對本發(fā)明的理解。 公開了集群存儲。存儲系統(tǒng)使用節(jié)點的集群來存儲入局?jǐn)?shù)據(jù)。將入局?jǐn)?shù)據(jù)分段。
各段被表征,用于給定節(jié)點上的存儲的指配。在集群的給定節(jié)點上,以如下方式存儲段查
找并且消除作為已經(jīng)在節(jié)點上經(jīng)過索引的數(shù)據(jù)的副本的該段的部分。將段分到多個節(jié)點中
減少了待進行搜索的段的數(shù)量以便消除重復(fù),并且減小了節(jié)點上的給定段所需的索引的大小。 在各種實施例中,至少部分根據(jù)段的內(nèi)容的全部或部分的所計算散列、根據(jù)少于 段中的所有字節(jié)(例如初始字節(jié)、結(jié)束字節(jié)、字節(jié)的算法確定樣本等)的函數(shù)、根據(jù)對于段 的子段所計算的散列(例如對于小于整個段的段的一部分所計算的散列)、根據(jù)段的略圖、 根據(jù)確定哪些集群節(jié)點具有段的子段的匹配的與段相關(guān)聯(lián)的基于內(nèi)容的標(biāo)簽、根據(jù)節(jié)點容 量(例如剩余存儲容量、已使用的存儲容量等)或能力或者與節(jié)點相關(guān)聯(lián)的任何其它適當(dāng) 的可用資源,集群節(jié)點與該段相關(guān)聯(lián)。在一些實施例中,確定哪些集群節(jié)點具有段的子段的 匹配的步驟至少部分基于子段的散列或者概要數(shù)據(jù)結(jié)構(gòu)、如Bloom濾波器。在一些實施例 中,在將段指配給集群節(jié)點時考慮集群節(jié)點的容量或者其它能力。 在集群的各節(jié)點上,使用細(xì)分段來查找段的重復(fù)部分。細(xì)分段允許將大段用于有 效地向節(jié)點進行分配并且將較小段用于給定節(jié)點上的壓縮效率,同時允許依次訪問的子段 被依次存儲。在一些實施例中,子段引用被存儲在一個以上節(jié)點上,使得子段引用能被依次 讀取。通過存儲對相同的先前存儲子段的引用,細(xì)分段有效地存儲包含與其它子段相同的 子段的段。如果先前沒有存儲子段,則存儲新的子段。子段的重構(gòu)通過使用對子段的引用和新存儲的子段以及關(guān)于如何將子段放在一起以形成段的信息來實現(xiàn)。 在一些實施例中,一個以上集群節(jié)點將包括先前存儲的給定子段。在將第一段指 配給第一節(jié)點而將具有相同子段的第二段指配給第二節(jié)點時可出現(xiàn)這種情況。這實現(xiàn)了更 有效地讀取第一段,因為讀取僅需要從第一節(jié)點進行,類似地,讀取第二段僅需要從第二節(jié) 點進行。 在各種實施例中,選擇集群節(jié)點至少部分基于下列各項中的一項或多項已經(jīng)存 儲在節(jié)點上的一個或多個段、已經(jīng)由該節(jié)點管理的一個或多個相似段、已經(jīng)由該節(jié)點管理 的一個或多個相同子段或者作為選擇集群節(jié)點的基礎(chǔ)的任何其它適當(dāng)段或子段。
在一些實施例中,段和/或子段至少部分根據(jù)流中的數(shù)據(jù)的內(nèi)容來創(chuàng)建。在一些 實施例中,它們使用錨定功能來創(chuàng)建。在各種實施例中,錨定功能包括計算字節(jié)的滑動窗口 的散列、確定所計算的散列是否滿足一個或多個預(yù)定標(biāo)準(zhǔn)和/或以算法方式在字節(jié)的滑動 窗口之中或周圍建立邊界。在一些實施例中,定義窗口,并且使用所計算函數(shù)(例如散列或 其它函數(shù))的最小或最大值或者窗口中任何位置的數(shù)據(jù)值的最小或最大值來定義段或子 段。在一些實施例中,定義包括多個子段的窗口。計算各子段的字節(jié)的第一個、全部或者選 擇的字節(jié)的散列,并且選擇窗口中的最大或最小散列值,以便開始下一個段。
圖1是示出使用細(xì)分段的群集存儲的系統(tǒng)的一個實施例的框圖。在所示示例中, 存儲系統(tǒng)100存儲圖1中由客戶112和客戶108所表示的客戶的數(shù)據(jù)??蛻舫吮镜卮鎯?器之外還可具有本地存儲裝置。例如,客戶機108具有存儲裝置110,而客戶112沒有本地 存儲裝置。存儲系統(tǒng)100使用內(nèi)部存儲裝置102或者附連的外部存儲裝置104來存儲數(shù)據(jù)。
存儲系統(tǒng)100經(jīng)由網(wǎng)絡(luò)106與客戶通信。網(wǎng)絡(luò)106包括下列各項中的一項或多 項局域網(wǎng)、廣域網(wǎng)、有線網(wǎng)絡(luò)、無線網(wǎng)絡(luò)、因特網(wǎng)、光纖網(wǎng)絡(luò)或者實現(xiàn)通信的任何其它適當(dāng) 網(wǎng)絡(luò)。存儲系統(tǒng)100還經(jīng)由網(wǎng)絡(luò)106a與復(fù)制系統(tǒng)120通信。復(fù)制系統(tǒng)120包括內(nèi)部存儲 裝置122,并且連接到外部存儲裝置124。 復(fù)制系統(tǒng)120存儲在存儲系統(tǒng)100上存儲的數(shù)據(jù)的全部或者一部分。最初,通過 經(jīng)由網(wǎng)絡(luò)106發(fā)送適當(dāng)?shù)臄?shù)據(jù),存儲系統(tǒng)100上存儲的數(shù)據(jù)的全部或一部分在復(fù)制系統(tǒng)120 上復(fù)制。在初始"播種"之后,通過從存儲系統(tǒng)100發(fā)送新數(shù)據(jù)來更新復(fù)制系統(tǒng)120。更新 可在數(shù)據(jù)量超過某個大小時或者在其它適當(dāng)時間可以是連續(xù)的,根據(jù)定期安排在突發(fā)中發(fā) 送。 在各種實施例中,存儲裝置102U04、122和124包括例如硬盤、磁帶驅(qū)動器、半導(dǎo) 體存儲器等單個存儲裝置、例如冗余陣列系統(tǒng)(例如獨立磁盤冗余陣列(RAID))等多個存 儲裝置、例如圖書館系統(tǒng)或網(wǎng)絡(luò)附連存儲系統(tǒng)等用于存儲的系統(tǒng)或者任何其它適當(dāng)?shù)拇鎯?裝置或系統(tǒng)。 圖2是示出使用集群存儲的存儲系統(tǒng)的框圖。在一些實施例中,存儲系統(tǒng)200用 于實現(xiàn)圖1的存儲系統(tǒng)IOO或復(fù)制系統(tǒng)120。在各種實施例中,復(fù)制系統(tǒng)120接收先前沒有 存儲的數(shù)據(jù)流、數(shù)據(jù)段、子段和/或?qū)ο惹按鎯Φ淖佣蔚囊枚皇菙?shù)據(jù)流或數(shù)據(jù)塊的所 有段。在所示示例中,存儲系統(tǒng)200接收一個或多個數(shù)據(jù)流或數(shù)據(jù)塊。數(shù)據(jù)流或數(shù)據(jù)塊由 圖2中表示為202和204的多個數(shù)據(jù)重定向器來處理。數(shù)據(jù)重定向器獲得輸入數(shù)據(jù)流或數(shù) 據(jù)塊,并且將數(shù)據(jù)流或塊分解為段。在一些實施例中,使用其中計算字節(jié)的滑動窗口的散列 的錨定功能來創(chuàng)建段;如果散列滿足某些預(yù)定標(biāo)準(zhǔn),則段段之間的邊界以算法方式在滑動窗口之中或周圍建立。在一些實施例中,定義包括多個子段的窗口 ,其中計算各子段的第一 批字節(jié)的散列,并且選擇窗口中的最大或最小散列值,以便開始下一個段。
在各種實施例中,使用對分段窗口中的多個窗口計算的函數(shù)值來確定段或子段邊 界。計算與分段窗口中的候選邊界相關(guān)聯(lián)的多個值。候選邊界其中之一至少部分根據(jù)所計 算值的兩個或更多之間的比較來選擇。確定分段窗口中的邊界。在一些實施例中,分段窗 口可通過以下方式來確定確定與最小段長度對應(yīng)的第一位置,并且確定與最大長度對應(yīng) 的第二位置,其中分段窗口是從第一位置到第二位置的段。確定邊界的步驟可包括確定分 段窗口中的多個窗口 。各窗口對應(yīng)于分段窗口中的位置,并且與候選邊界相關(guān)聯(lián)。在一些實 施例中,然后對各窗口評估函數(shù)。該函數(shù)具有作為其輸入的該窗口的一個或多個數(shù)據(jù)值。在 各種實施例中,該函數(shù)包括散列函數(shù)SHA-1 (安全散列算法1) 、SHA-256、SHA-384、SHA-512、 MD5 (消息摘要算法5) 、RIPEMD-160 (RACE完整性原語評估消息摘要160位版本)、Rabin散 列、指紋、CRC(循環(huán)冗余校驗)、"和"、"異或"或者區(qū)分窗口的任何其它適當(dāng)函數(shù)。在對所 有窗口生成函數(shù)值之后,至少部分根據(jù)生成的值來選擇邊界 一 例如,選擇與所生成的所有 值的函數(shù)值的極值對應(yīng)的位置,選擇與所生成的所有值的最小值對應(yīng)的位置,選擇與所生 成的所有值的最大值對應(yīng)的位置,選擇與所生成的所有值中的在其中具有最長序列的"l" 位的值對應(yīng)的位置,或者選擇與所生成的所有值中的在其中具有最多的"l"位的值對應(yīng)的 位置。如果對于值存在平局,則可采用選擇使段長度為最大或最小的位置的標(biāo)準(zhǔn)。
在所示示例中,集群節(jié)點224包括匹配節(jié)點206和存儲裝置210 ;集群節(jié)點226包 括匹配節(jié)點212和存儲裝置216 ;集群節(jié)點228包括匹配節(jié)點218和存儲裝置222。各匹 配節(jié)點負(fù)責(zé)管理集群中存儲的段的子集。管理段的步驟包括實現(xiàn)查找所管理的其它段的 子段中的段的子段的匹配或副本;以及將段的復(fù)制表示存儲在存儲節(jié)點中。將段傳送到圖 2中分別表示為224、226和228的集群節(jié)點的圖2中表示為206、212和218的一個或多個 匹配功能節(jié)點。在一些實施例中,向一個或多個匹配節(jié)點的指配是作為錨定功能的一部分 而計算的散列的函數(shù)。在一些實施例中,所述指配基于少于段中的所有字節(jié)的函數(shù)。例如, 它可基于段的初始字節(jié)、段的結(jié)束字節(jié)的函數(shù)或者字節(jié)的某個算法確定樣本。在一些實施 例中,所述指配基于段的一個或多個標(biāo)簽。在各種實施例中,標(biāo)簽包括段的部分或全部或 者段的子段的概要特征集、略圖、散列或指紋或者可用于將段指配給集群節(jié)點的段的任何 其它適當(dāng)表征符。在一些實施例中,概要特征集通過以下方式來確定選擇第一段的多個 固定長度或可變長度部分或分部;對于各分部,通過對各分部應(yīng)用一組函數(shù)來計算多個值; 以及從對于所有分部所計算的所有值中,選擇值的第一子集。在一些實施例中,值的第一子 集用于確定第一段與第二段之間的相似性。在一些實施例中,例如相鄰段中的字節(jié)或者節(jié) 點中的其它可用資源等其它外部因素用于將段指配給匹配功能節(jié)點。在一些實施例中,所 述指配基于向匹配節(jié)點的一部分或全部發(fā)送段的一個或多個標(biāo)簽以便確定匹配節(jié)點是否 可能能夠識別數(shù)據(jù)的重復(fù)部分或者重復(fù)子段。在一些實施例中,所述指配基于數(shù)據(jù)重定向 器中保存的關(guān)于各節(jié)點上存儲的段的數(shù)據(jù),例如概要數(shù)據(jù)結(jié)構(gòu) 一 例如Bloom濾波器。在一 些實施例中,函數(shù)對各段生成值,數(shù)據(jù)重定向器保存將一組這類值映射到各節(jié)點的表,并且 至少部分根據(jù)這種表中的映射將段指配給節(jié)點。 在一些實施例中,一個或多個匹配功能節(jié)點已經(jīng)存儲了相似或相同的段。將段分 解為子段,并且匹配功能節(jié)點查找與匹配節(jié)點關(guān)聯(lián)存儲的數(shù)據(jù)的一部分或全部中的匹配子段。在一些實施例中,在其中搜索子段的數(shù)據(jù)的一部分包括認(rèn)為與該段相似的先前存儲的 段。 在一些實施例中,多個匹配節(jié)點可位于同一個物理存儲裝置上。 圖3A是示出數(shù)據(jù)流或者數(shù)據(jù)塊的一部分的一個實施例的框圖。在所示示例中,示
出數(shù)據(jù)流或數(shù)據(jù)塊300的一部分。數(shù)據(jù)流或數(shù)據(jù)塊300的一部分可以是備份的數(shù)據(jù)、存儲
的數(shù)據(jù)、在遠(yuǎn)程站點上復(fù)制的數(shù)據(jù)或者任何其它適當(dāng)數(shù)據(jù)流或數(shù)據(jù)塊的一部分。 圖3B是示出分配給集群節(jié)點的段的一個實施例的框圖。在一些實施例中,集群節(jié)
點316、318和320與圖2的集群節(jié)點224、226和228相似。在所示示例中,將數(shù)據(jù)流或數(shù)
據(jù)塊的一部分分段為多個段 一 例如段310、312和314。數(shù)據(jù)流或數(shù)據(jù)塊的一部分的分段
可使用段邊界的基于內(nèi)容的確定(例如窗口中的內(nèi)容的散列等于某個值,或者窗口中的內(nèi)
容的散列是一組窗口的內(nèi)容的散列的最小值或最大值)、段邊界的基于非內(nèi)容的確定(例
如字節(jié)計數(shù))、基于文件的段邊界或者將數(shù)據(jù)流或數(shù)據(jù)塊分為段的任何其它適當(dāng)方式。在
各種實施例中,段為相同大小或者為不同大小。在各種實施例中,段可以是不重疊或者重疊
的。段310、312和314分別分配給集群節(jié)點316、318和320。向集群節(jié)點分配段基于段內(nèi)
容、段編號、與段相關(guān)聯(lián)的元數(shù)據(jù)和/或具有可能相似段的集群節(jié)點,使得可進行段的有效
存儲。在一些實施例中,將段的標(biāo)簽或其它表征分配給多個節(jié)點,并且具有可能相似段的給
定節(jié)點可指明它是將要向其分配的段的良好候選節(jié)點。 圖4是示出集群存儲的過程的一個實施例的流程圖。在一些實施例中,圖4的過 程在圖2的存儲系統(tǒng)200中實現(xiàn)。在所示示例中,在400,接收數(shù)據(jù)流或數(shù)據(jù)塊。在402,將 數(shù)據(jù)流或數(shù)據(jù)塊分為段。在404,選擇第一段。在406,選擇存儲節(jié)點。在408,識別作為先 前存儲段的一部分的副本的段的一部分;存儲該部分的表示;以及存儲不是先前存儲數(shù)據(jù) 的副本的數(shù)據(jù)。在410,確定是否存在要處理的更多段。如果是,則在412,選擇下一個段, 并且控制轉(zhuǎn)到406。如果不是,則該過程結(jié)束。 圖5是示出用于選擇存儲節(jié)點的過程的一個實施例的流程圖。在一些實施例中, 圖5的過程用于實現(xiàn)圖4的406。在所示示例中,在500,計算標(biāo)簽。在502,使用標(biāo)簽來選 擇節(jié)點。在一些實施例中,根據(jù)標(biāo)簽將段指配給節(jié)點,而無需考慮哪些段當(dāng)前存儲在該節(jié)點 中;例如所有奇數(shù)標(biāo)簽(例如散列值)轉(zhuǎn)到節(jié)點l,偶數(shù)標(biāo)簽轉(zhuǎn)到節(jié)點2。隨時間推移,節(jié)點 將具有相似段,但是,當(dāng)選擇節(jié)點時,實際上沒有對于具有相似段進行校驗。在一些實施例 中,重定向器訪問將標(biāo)簽值的集合映射到各節(jié)點的數(shù)據(jù)庫或表以便確定向哪一個節(jié)點指配 段。在一些實施例中,在向給定節(jié)點指配段時考慮給定節(jié)點的負(fù)荷和/或容量。在各種實 施例中,標(biāo)簽包括略圖、散列或者識別可能相似段的任何其它適當(dāng)方式。
在一些實施例中,重定向器將標(biāo)簽與重定向器正保存的概要數(shù)據(jù)結(jié)構(gòu)(例如 Bloom濾波器)進行比較,以便確定向哪一個節(jié)點指配給定段。 圖6是示出用于選擇存儲節(jié)點的過程的一個實施例的流程圖。在一些實施例中, 圖6的過程用于實現(xiàn)圖4的406。在所示示例中,在600,計算標(biāo)簽。在602,向所有節(jié)點廣 播標(biāo)簽。在一些實施例中,將標(biāo)簽發(fā)送到一個或多個節(jié)點但并非所有節(jié)點。在一些實施例 中,選擇為接收標(biāo)簽的節(jié)點至少部分基于標(biāo)簽。在603,節(jié)點確定它們是否包含可能相似的 段。節(jié)點可使用Bloom濾波器來確定它們是否具有相似段,或者它們可實際識別重復(fù)子段。 在604,接收關(guān)于一個或多個節(jié)點可能包含相似的先前所存儲段的指示。在606,根據(jù)該指示來選擇節(jié)點。在一些實施例中,該指示指明在節(jié)點上存儲了多少可能相似的所存儲段的 測量。在一些實施例中,該指示指明匹配節(jié)點上存儲的子段的子段的數(shù)量。在一些實施例 中,該指示包括與給定節(jié)點上的所存儲段的總數(shù)有關(guān)的信息,使得在確定段的指配時可考 慮負(fù)荷平衡。在各種實施例中,標(biāo)簽包括略圖、散列或者識別可能相似的段的任何其它適當(dāng) 方式。 圖7是示出用于存儲段的表示的過程的一個實施例的流程圖。在一些實施例中, 圖7的過程用于實現(xiàn)圖4的408。在所示示例中,在700,將段發(fā)送給所選節(jié)點。在702,在 所選節(jié)點上接收段。在704,將段分為子段。在706,計算子段的包括指紋的標(biāo)簽。在708, 使用標(biāo)簽來識別對先前所存儲子段的引用和/或段數(shù)據(jù)。在一些實施例中,指紋用于識別 確定子段是否為先前所存儲子段的副本。在一些實施例中,標(biāo)簽還用于識別不是副本并且 需要存儲的子段。在710,使用所識別的引用和/或段數(shù)據(jù)來存儲關(guān)聯(lián)標(biāo)簽和段。
圖8是示出用于在先前存儲的子段之中查找重復(fù)子段的過程的一個實施例的流 程圖。在一些實施例中,圖8的過程用于實現(xiàn)圖7的708。在所示示例中,在800,選擇第一 子段。在802,確定所選子段是否為先前所存儲子段的副本。在一些實施例中,使用指紋來 確定所選子段是或不是先前所存儲子段的副本。如果所選子段是副本,則在804,該子段被 識別為相同,并且控制轉(zhuǎn)到808。如果所選子段不是副本,則在812,如果適當(dāng),就將子段數(shù) 據(jù)和關(guān)聯(lián)標(biāo)簽(例如包括指紋)識別為不是副本,并且控制轉(zhuǎn)到808。在一些實施例中,存 儲所識別子段數(shù)據(jù)和關(guān)聯(lián)標(biāo)簽,以便用于段的重構(gòu)。在一些實施例中,在滑動窗口用于識別 子段的情況下,則可能不需要存儲給定的所選子段和關(guān)聯(lián)標(biāo)簽。在808,確定是否存在更多 子段。如果存在更多子段,則在810選擇下一個子段,并且控制轉(zhuǎn)到802。如果不存在更多 子段,則該過程結(jié)束。 圖9是示出用于存儲段的表示的過程的一個實施例的流程圖。在一些實施例中, 圖9的過程用于實現(xiàn)圖4的408。在所示示例中,在900,將標(biāo)簽發(fā)送給所選節(jié)點。在902, 在所選節(jié)點上接收標(biāo)簽。在904,使用標(biāo)簽來識別可能相似的段。在906,對于可能相似的 段獲取標(biāo)簽。在一些實施例中,標(biāo)簽包括指紋。在各種實施例中,從所選節(jié)點的存儲裝置中 讀取標(biāo)簽,或者根據(jù)需要即時計算標(biāo)簽。在一些實施例中,為了便利和快速獲取而將標(biāo)簽存 儲在一起。在908,從所選節(jié)點發(fā)送標(biāo)簽。在910,從所選節(jié)點接收標(biāo)簽。在912,將段分為 子段。在914,對子段計算標(biāo)簽。在916,使用標(biāo)簽來識別對先前所存儲子段的引用和/或 段數(shù)據(jù)。在一些實施例中,指紋用于確定子段是否為先前所存儲子段的副本。在918,將引 用和/或段數(shù)據(jù)及關(guān)聯(lián)標(biāo)簽發(fā)送給所選節(jié)點。在920,在所選節(jié)點上接收引用和/或段數(shù)據(jù) 及關(guān)聯(lián)標(biāo)簽。在922,使用引用和/或段數(shù)據(jù)來存儲關(guān)聯(lián)標(biāo)簽和段。 圖10是示出用于存儲段的表示的過程的一個實施例的流程圖。在一些實施例中, 圖10的過程用于實現(xiàn)圖4的408。在所示示例中,在1000,將段分為子段。在1002,對子段 計算標(biāo)簽。在一些實施例中,標(biāo)簽包括指紋。在1004,將標(biāo)簽發(fā)送給所選節(jié)點。在1006,在 所選節(jié)點上接收標(biāo)簽。在1008,使用標(biāo)簽來識別可能相似的段。在1010,對于可能相似的 段獲取標(biāo)簽。在一些實施例中,標(biāo)簽包括指紋。在各種實施例中,從所選節(jié)點的存儲裝置讀 取標(biāo)簽,或者根據(jù)需要即時計算標(biāo)簽。在一些實施例中,為了便利和快速獲取而將標(biāo)簽存儲 在一起。在1012,使用標(biāo)簽來識別對先前所存儲子段的引用和/或段數(shù)據(jù)。在一些實施例 中,指紋用于確定子段是否為先前所存儲子段的副本。在1014,從所選節(jié)點發(fā)送對段數(shù)據(jù)的引用。在一些實施例中,標(biāo)簽用于引用段數(shù)據(jù)。在一些實施例中,作為對子段的引用,從節(jié) 點發(fā)送子段標(biāo)簽。在1016,從所選節(jié)點接收對段數(shù)據(jù)的引用。在1018,將段數(shù)據(jù)發(fā)送給所 選節(jié)點。在1020,在所選節(jié)點上接收段數(shù)據(jù)。在1022,使用引用和/或段數(shù)據(jù)來存儲關(guān)聯(lián) 標(biāo)簽和段。 雖然為了清楚理解的目的而比較詳細(xì)地描述了以上實施例,但本發(fā)明并不局限于 所提供的細(xì)節(jié)。存在實現(xiàn)本發(fā)明的許多備選方式。所公開的實施例是說明性而不是限制性 的。 所要求的權(quán)利如下。
權(quán)利要求
一種用于集群存儲的方法,包括接收數(shù)據(jù)流或數(shù)據(jù)塊;將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段;以及對于各段選擇集群節(jié)點;以及識別比所述段小的所述段的一部分,所述段的一部分是已經(jīng)由所述集群節(jié)點管理的段的一部分的副本。
2. 如權(quán)利要求1所述的方法,還包括使用所述段的所述部分的表示來存儲所述段。
3. 如權(quán)利要求1所述的方法,還包括使用不是先前存儲的數(shù)據(jù)的副本的段數(shù)據(jù)來存 儲所述段。
4. 如權(quán)利要求1所述的方法,其中,管理段的步驟包括實現(xiàn)查找所管理的其它段中的 所述段的部分的副本。
5. 如權(quán)利要求1所述的方法,其中,管理段的步驟包括存儲所述段的復(fù)制表示。
6. 如權(quán)利要求1所述的方法,其中,所述集群節(jié)點管理所述集群中存儲的一部分所述段。
7. 如權(quán)利要求1所述的方法,其中,識別比所述段小的所述段的一部分是否為已經(jīng)由 所述集群節(jié)點管理的段的一部分的副本的步驟包括將所述段分為多個子段,并且識別已經(jīng) 存儲的子段。
8. 如權(quán)利要求1所述的方法,其中,將子段存儲在一個以上節(jié)點上,使得所述子段能夠 依次被讀取。
9. 如權(quán)利要求1所述的方法,其中,將子段引用存儲在一個以上節(jié)點上,使得所述子段 引用能夠依次被讀取。
10. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段至少部分基于 所述數(shù)據(jù)流或所述數(shù)據(jù)塊的內(nèi)容。
11. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段至少部分基于 所述數(shù)據(jù)流或所述數(shù)據(jù)塊中的文件邊界。
12. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段至少部分基于 錨定功能,其中所述錨定功能包括確定所計算的散列是否滿足一個或多個預(yù)定標(biāo)準(zhǔn)。
13. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段至少部分基于 錨定功能,其中所述錨定功能包括使用對于分段窗口中的多個窗口而計算的函數(shù)的值。
14. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段至少部分基于 錨定功能,其中所述錨定功能包括以算法方式在字節(jié)的滑動窗口之中或周圍建立邊界。
15. 如權(quán)利要求1所述的方法,其中,將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段包括識別多個 子段并且將所述多個子段分組為段,其中所述多個子段是連續(xù)的或重疊的。
16. 如權(quán)利要求15所述的方法,其中,識別所述多個子段的步驟包括識別窗口中的所述多個子段,并且至少部分根據(jù)所述多個子段的每一個的預(yù)定數(shù)量的字節(jié)的散列值來選擇 邊界。
17. 如權(quán)利要求16所述的方法,其中,根據(jù)所述多個子段的每一個的最大散列值來選 擇所述邊界。
18. 如權(quán)利要求16所述的方法,其中,根據(jù)所述多個子段的每一個的最小散列值來選 擇所述邊界。
19. 如權(quán)利要求15所述的方法,其中,識別所述多個子段至少部分基于所述數(shù)據(jù)流或 所述數(shù)據(jù)塊的內(nèi)容。
20. 如權(quán)利要求15所述的方法,其中,識別所述多個子段的步驟包括計算滿足預(yù)定條 件的函數(shù)來選擇邊界。
21. 如權(quán)利要求15所述的方法,其中,識別所述多個子段的步驟包括使用錨定來選擇 邊界。
22. 如權(quán)利要求15所述的方法,其中,識別所述多個子段的步驟包括至少部分根據(jù)窗 口中的函數(shù)的最小值或最大值來選擇邊界。
23. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于所述段的內(nèi)容的 至少一部分的散列。
24. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于所述段的略圖。
25. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于與所述段相關(guān)聯(lián) 的內(nèi)容標(biāo)簽。
26. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于所述段的內(nèi)容的 至少一部分。
27. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于所述集群節(jié)點的 剩余存儲容量。
28. 如權(quán)利要求1所述的方法,還包括存儲與所述段相關(guān)聯(lián)的一個或多個標(biāo)簽。
29. 如權(quán)利要求28所述的方法,其中,所述一個或多個標(biāo)簽包括一個或多個指紋。
30. 如權(quán)利要求1所述的方法,其中,與多個段相關(guān)聯(lián)的多個標(biāo)簽在集群節(jié)點上存儲在一起。
31. 如權(quán)利要求1所述的方法,其中,與多個子段相關(guān)聯(lián)的多個標(biāo)簽在集群節(jié)點上存儲在一起。
32. 如權(quán)利要求1所述的方法,其中,識別比所述段小的作為已經(jīng)由所述集群節(jié)點管理 的段的一部分的副本的所述段的一部分的步驟包括識別一個或多個先前存儲的相似段, 并且確定所述一個或多個先前存儲的相似段的已經(jīng)存儲的部分是否為所述段的所述部分 的副本。
33. 如權(quán)利要求32所述的方法,其中,使用所述段的標(biāo)簽來識別所述一個或多個先前 存儲的相似段。
34. 如權(quán)利要求1所述的方法,其中,所述集群節(jié)點包括用于將段指配給集群節(jié)點的過 程的概要數(shù)據(jù)結(jié)構(gòu)。
35. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于已經(jīng)存儲在所述 節(jié)點上的一個或多個段。
36. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于已經(jīng)由所述節(jié)點 管理的一個或多個相似段。
37. 如權(quán)利要求1所述的方法,其中,選擇所述集群節(jié)點至少部分基于已經(jīng)由所述節(jié)點 管理的一個或多個相同子段。
38. —種用于集群存儲的系統(tǒng),包括 處理器;以及與所述處理器耦合的存儲器,其中所述存儲器配置成向所述處理器提供在運行時使所 述處理器執(zhí)行以下步驟的指令 接收數(shù)據(jù)流或數(shù)據(jù)塊;將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段;以及 對于各段 選擇集群節(jié)點;以及識別比所述段小的所述段的一部分,所述段的一部分是已經(jīng)由所述集群節(jié)點管理的段 的一部分的副本。
39. —種用于集群存儲的計算機程序產(chǎn)品,所述計算機程序產(chǎn)品包含在計算機可讀介 質(zhì)中,并且包括用于執(zhí)行以下步驟的計算機指令接收數(shù)據(jù)流或數(shù)據(jù)塊;將所述數(shù)據(jù)流或所述數(shù)據(jù)塊分為段;以及 對于各段 選擇集群節(jié)點;以及識別比所述段小的所述段的一部分,所述段的一部分是已經(jīng)由所述集群節(jié)點管理的段 的一部分的副本。
全文摘要
公開了集群存儲。接收數(shù)據(jù)流或數(shù)據(jù)塊;將數(shù)據(jù)流或數(shù)據(jù)塊分為段。對于各段,選擇群集節(jié)點,識別比該段小的該段的一部分,該段的一部分是已經(jīng)由集群節(jié)點管理的段的一部分的副本。
文檔編號G06F12/00GK101796492SQ200880019270
公開日2010年8月4日 申請日期2008年3月28日 優(yōu)先權(quán)日2007年4月11日
發(fā)明者E·K·李, R·H·帕特森, S·雷迪, U·馬赫什沃里 申請人:Emc公司