用于復(fù)制內(nèi)容可尋址存儲集群的異步分布式去重的制作方法【專利摘要】本發(fā)明涉及用于復(fù)制內(nèi)容可尋址存儲集群的異步分布式去重。一種方法由分布式數(shù)據(jù)復(fù)制系統(tǒng)中的設(shè)備組中的設(shè)備執(zhí)行。該方法包括將對象的索引存儲在分布式數(shù)據(jù)復(fù)制系統(tǒng)中,所述索引在對象由分布式數(shù)據(jù)復(fù)制系統(tǒng)中的多個設(shè)備本地存儲時被復(fù)制。該方法還包括進(jìn)行對索引的至少一部分的掃描,以及基于對索引的掃描來識別對象中的至少一個的冗余復(fù)制品。該方法進(jìn)一步包括對冗余復(fù)制品進(jìn)行去重,以及對索引進(jìn)行更新以反映冗余復(fù)制品的狀態(tài)?!緦@f明】用于復(fù)制內(nèi)容可尋址存儲集群的異步分布式去重[0001]分案說明[0002]本申請屬于申請日為2009年12月22日的中國專利申請200980156970.8的分案申請?!?br>背景技術(shù):
】[0003]企業(yè)計算局面經(jīng)歷了存儲體系結(jié)構(gòu)的根本性轉(zhuǎn)變,因為中央服務(wù)體系結(jié)構(gòu)已經(jīng)讓位于分布式存儲集群。隨著企業(yè)尋求增加存儲效率的方式,從商品計算機(jī)構(gòu)建的存儲集群可以以與龐大盤陣列相比的成本的一小部分,為新的數(shù)據(jù)密集型應(yīng)用提供高性能、可用性和可伸縮性。為了開啟存儲集群的全部潛力,跨多個地理位置復(fù)制數(shù)據(jù),從而增加可用性,并且減少距客戶端的網(wǎng)絡(luò)距離。[0004]數(shù)據(jù)去重(de-duplicat1n)可以識別重復(fù)的對象,并且通過移除副本來減少所需的存儲空間。結(jié)果,數(shù)據(jù)去重對于存儲業(yè)變得日益重要,并且正由會包含許多副本的大型系統(tǒng)的需求推動?!?br/>發(fā)明內(nèi)容】[0005]根據(jù)一個實施方式,一種方法可以由分布式數(shù)據(jù)復(fù)制系統(tǒng)中的設(shè)備組中的設(shè)備執(zhí)行。該方法可以包括將對象的索引存儲在分布式數(shù)據(jù)復(fù)制系統(tǒng)中,所述索引是在對象的復(fù)制品由分布式數(shù)據(jù)復(fù)制系統(tǒng)中的多個設(shè)備本地存儲時被復(fù)制。該方法還可以包括進(jìn)行對索引的至少一部分的掃描,以及基于對索引的掃描來識別對象中的至少一個的冗余復(fù)制品。該方法可以進(jìn)一步包括通過將去重記錄寫入索引的一部分來對冗余復(fù)制品進(jìn)行去重。[0006]根據(jù)另一個實施方式,分布式數(shù)據(jù)復(fù)制系統(tǒng)中的設(shè)備組中的設(shè)備可以包括:用于將對象的索引存儲在分布式數(shù)據(jù)復(fù)制系統(tǒng)中的裝置;用于將改變寫入索引以指定對象中的一個的復(fù)制品的狀態(tài)的裝置;用于將對索引的改變復(fù)制到分布式數(shù)據(jù)復(fù)制系統(tǒng)中的多個設(shè)備的裝置;用于進(jìn)行對索引的至少一部分的掃描的裝置;用于基于對索引的掃描來識別對象中的一個的冗余復(fù)制品的裝置;以及用于對冗余復(fù)制品進(jìn)行去重的裝置。[0007]根據(jù)又一個實施方式,一種系統(tǒng)可以包括存儲器,其用來存儲指令、對象的數(shù)據(jù)存儲以及數(shù)據(jù)存儲中的對象的索引;以及處理器。處理器可以執(zhí)行存儲器中的指令來:識別數(shù)據(jù)存儲中的對象的狀態(tài),所述狀態(tài)與對象是否具有復(fù)制品以及刪除請求是否與對象相關(guān)聯(lián)有關(guān);基于對象的狀態(tài)將去重指定記錄與入索引;將具有去重指定記錄的索引復(fù)制到一個或多個設(shè)備;以及從一個或多個設(shè)備中的一個接收與對象相關(guān)聯(lián)的其它去重指定記錄,其中去重指定記錄和其它去重指定記錄為對對象的一個或多個復(fù)制品的刪除提供基礎(chǔ)。[0008]根據(jù)又一個實施方式,一種由一個或多個設(shè)備執(zhí)行的方法可以包括:將對象的索引存儲在分布式數(shù)據(jù)復(fù)制系統(tǒng)內(nèi)的多個設(shè)備中,以及在本地存儲對象時遍及分布式數(shù)據(jù)復(fù)制系統(tǒng)復(fù)制索引,其中每一個設(shè)備對索引的特定子集內(nèi)的對象的去重負(fù)責(zé);進(jìn)行對索引的子集中的每一個的掃描以基于掃描來識別冗余復(fù)制品;對冗余進(jìn)行去重;以及自動將對象從帶有具有正在進(jìn)行的刪除請求的復(fù)制品的設(shè)備拷貝到帶有先前已被去重的復(fù)制品的設(shè)備。[0009]根據(jù)進(jìn)一步實施方式,一種計算機(jī)可讀存儲器可以包括計算機(jī)可執(zhí)行的指令。該計算機(jī)可讀存儲器可以包括:用來進(jìn)行對分布式數(shù)據(jù)復(fù)制系統(tǒng)中的對象的索引的一部分的掃描的一個或多個指令;用來基于對索引的一部分的掃描來識別對象中的一個的冗余復(fù)制品的一個或多個指令;用來對冗余復(fù)制品進(jìn)行去重的一個或多個指令?!緦@綀D】【附圖說明】[0010]合并入并且構(gòu)成本說明書的一部分的附圖圖示了在此描述的一個或多個實施例,并且與描述一起說明了這些實施例。在附圖中:[0011]圖1是在其中可以實現(xiàn)在此描述的系統(tǒng)和方法的示例性網(wǎng)絡(luò)的圖;[0012]圖2是圖1的文件系統(tǒng)的示例性配置的圖;[0013]圖3是圖1的存儲集群的示例性組件的圖;[0014]圖4是圖1的示例性存儲集群的功能框圖;[0015]圖5是可以在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)的索引內(nèi)使用的示例性記錄結(jié)構(gòu)的圖;[0016]圖6A-6B是用于管理客戶端發(fā)起的上載/刪除操作的示例性過程的流程圖;[0017]圖7是用于在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)中執(zhí)行去重的示例性過程的流程圖;[0018]圖8是用于管理刪除請求的示例性過程的流程圖;[0019]圖9是用于移除重復(fù)復(fù)制品的示例性過程的流程圖;[0020]圖10是用于在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)中優(yōu)化帶寬消耗以及減少時延的示例性過程的流程圖;以及[0021]圖11是根據(jù)在此描述的一個實施方式圖示了示例性全局索引的一部分的圖?!揪唧w實施方式】[0022]下面的詳細(xì)描述參考附圖。在不同附圖中的相同參考數(shù)字可以識別相同或相似元素。并且,下面的詳細(xì)描述不限制本發(fā)明。[0023]在此描述的系統(tǒng)和/或方法可以為復(fù)制的存儲集群提供異步分布式去重算法,其為不可變對象提供可用性、活性以及一致性保證。在此描述的實施方式可以使用分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)的基礎(chǔ)復(fù)制層來在不同的存儲集群之間復(fù)制內(nèi)容可尋址索引(在此也被稱為“全局索引”)。全局索引的每一個對象可以具有唯一內(nèi)容句柄(例如,哈希值或數(shù)字簽名)。在此描述的實施方式中,對冗余復(fù)制品的移除過程可以保持至少一個復(fù)制品存活。[0024]示例性網(wǎng)絡(luò)配置[0025]圖1是在其中可以實現(xiàn)在此描述的系統(tǒng)和方法的示例性系統(tǒng)100的圖。系統(tǒng)100可以包括經(jīng)由網(wǎng)絡(luò)130連接的客戶端110-1至110-N(統(tǒng)稱為客戶端110,以及分別稱為客戶端110)以及存儲集群120-1至120-M(統(tǒng)稱為存儲集群120,以及分別稱為存儲集群120)。存儲集群120可以形成文件系統(tǒng)140(如圖1中虛線所示)。[0026]網(wǎng)絡(luò)130可以包括一個或多個網(wǎng)絡(luò),諸如局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、電話網(wǎng)絡(luò)(例如,公共交換電話網(wǎng)絡(luò)(PSTN))、內(nèi)聯(lián)網(wǎng)、因特網(wǎng)、相似或相異網(wǎng)絡(luò)、或網(wǎng)絡(luò)的組合??蛻舳?10和存儲集群120可以經(jīng)由有線和/或無線連接連接到網(wǎng)絡(luò)130。[0027]客戶端110可以包括一種或多種類型的設(shè)備,諸如個人計算機(jī)、無線電話、個人數(shù)字助理(PDA)、膝上型計算機(jī)或另一種類型的通信設(shè)備、和/或運(yùn)行于這些設(shè)備中的一個上的線程或進(jìn)程。在一個實施方式中,客戶端110包括或被聯(lián)接到應(yīng)用,在所述應(yīng)用代表下客戶端110與存儲集群120通信以讀取或修改(例如,寫)文件數(shù)據(jù)。[0028]存儲集群120可以包括一個或多個服務(wù)器設(shè)備、或其它類型的計算或通信設(shè)備,其可以以在此描述的方式存儲、處理、搜索和/或提供信息。在一個實施方式中,存儲集群120可以包括能夠為文件維護(hù)大型、隨機(jī)讀/寫訪問數(shù)據(jù)存儲的一個或多個服務(wù)器(例如,計算機(jī)系統(tǒng)和/或應(yīng)用)。如果發(fā)生改變,則存儲集群120的數(shù)據(jù)存儲可以允許索引系統(tǒng)快速更新索引的部分。存儲集群120的數(shù)據(jù)存儲可以包括一個或多個表(例如,可以包括每統(tǒng)一資源定位符(URL)—行的文檔表、由URL之外的值作為鍵的輔助表等)。在一個示例中,存儲集群120可以被包括在用于管理結(jié)構(gòu)化數(shù)據(jù)(例如,文檔的隨機(jī)存取存儲集群)的分布式存儲系統(tǒng)(例如,如在第七屆OSDI論文集(2006年11月)、第205-218頁、Chang等人的“Bigtable:ADistributedStorageSystemforStructuredData(Bigtable:用于結(jié)構(gòu)化數(shù)據(jù)的分布式存儲系統(tǒng))”中闡述的"Bigtable")中,所述結(jié)構(gòu)化數(shù)據(jù)可以被設(shè)計為縮放到非常大的大小(例如,跨數(shù)千服務(wù)器的千兆兆字節(jié)的數(shù)據(jù))。[0029]盡管在圖1中未示出,但是系統(tǒng)100可以包括多種其它組件,諸如一個或多個專用客戶服務(wù)器或集線器??蛻舴?wù)器例如可以存儲來自一個或多個存儲集群120的數(shù)據(jù)存儲的只讀副本以供客戶端110訪問。集線器例如可以存儲來自一個或多個存儲集群120的數(shù)據(jù)存儲的只讀副本以分發(fā)到一個或多個客戶服務(wù)器。[0030]示例性存儲集群配置[0031]圖2是文件系統(tǒng)140的示例性配置的圖。如圖2中所示,文件系統(tǒng)140可以包括存儲集群120-1、120-2、120-3以及120-4。在一個實施方式中,文件系統(tǒng)140可以是分布式多主站數(shù)據(jù)復(fù)制系統(tǒng),其中存儲集群120-1、120-2、120-3以及120-4中的每一個對于其它存儲集群可以充任主服務(wù)器。在文件系統(tǒng)140中,可以跨存儲集群120-1、120-2、120-3以及120-4(例如,在多個地理位置)復(fù)制數(shù)據(jù)以增加數(shù)據(jù)可用性以及減少距客戶端(例如,客戶端110)的網(wǎng)絡(luò)距離。通常,可以在不同的存儲集群120中動態(tài)地創(chuàng)建、變異、克隆以及刪除分布式對象和引用,以及基礎(chǔ)數(shù)據(jù)復(fù)制層(未示出)維護(hù)寫順序保真度以確保所有存儲集群120以數(shù)據(jù)的相同版本結(jié)束。因此,數(shù)據(jù)復(fù)制層重視對單個對象的相同復(fù)制品的寫順序。[0032]可以將分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)中的所有對象的全局索引與每一個存儲集群120進(jìn)行關(guān)聯(lián)。每一個已存儲的對象可以由全局索引中的唯一內(nèi)容句柄(諸如哈希值、數(shù)字簽名等)列出。所選擇的存儲集群每一個可以被分配為負(fù)責(zé)全局索引中的不同范圍的內(nèi)容句柄。例如,單個存儲集群120可以負(fù)責(zé)對與特定內(nèi)容句柄相關(guān)聯(lián)的對象的去重??梢詫⒁粋€存儲集群作出的對全局索引的改變復(fù)制到其它存儲集群。[0033]盡管圖2示出了文件系統(tǒng)140的示例性功能組件,但是在其它實施方式中,文件系統(tǒng)140可以包含比在圖2中所描繪的更少、另外、不同或不同布置的組件。在另外其它實施方式中,文件系統(tǒng)140的一個或多個組件可以執(zhí)行被描述為由文件系統(tǒng)140的一個或多個其它組件執(zhí)行的一個或多個任務(wù)。[0034]圖3是存儲集群120的示例性組件的圖。存儲集群120可以包括總線310、處理器320、主存儲器330、只讀存儲器(ROM)340、存儲設(shè)備350、輸入設(shè)備360、輸出設(shè)備370以及通信接口380??偩€310可以包括允許在存儲集群120的組件之間的通信的一個或多個導(dǎo)線。[0035]處理器320可以包括可以解釋并且執(zhí)行指令的任何類型的處理器或微處理器。主存儲器330可以包括可以存儲用于處理器320執(zhí)行的信息和指令的隨機(jī)存取存儲器(RAM)或另一種類型的動態(tài)存儲設(shè)備。R0M340可以包括可以存儲用于處理器320使用的靜態(tài)信息和指令的ROM設(shè)備或另一種類型的靜態(tài)存儲設(shè)備。存儲設(shè)備350可以包括磁和/或光記錄介質(zhì)以及其對應(yīng)的驅(qū)動。例如,存儲設(shè)備350可以包括提供持久存儲的一個或多個本地盤355。在一個實施方式中,存儲集群120可以在諸如主存儲器330和/或存儲設(shè)備350的一個或多個計算機(jī)可讀介質(zhì)內(nèi)為存儲在文件系統(tǒng)140中的對象維護(hù)元數(shù)據(jù)。例如,存儲集群120可以將用于存儲在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)內(nèi)的所有對象的全局索引存儲在存儲設(shè)備350內(nèi)。[0036]輸入設(shè)備360可以包括允許操作者向存儲集群120輸入信息的一個或多個機(jī)制,諸如鍵盤、鍵區(qū)、按鈕、鼠標(biāo)、筆等。輸出設(shè)備370可以包括向操作者輸出信息的一個或多個機(jī)制,包括顯示、發(fā)光二極管(LED)等。通信接口380可以包括使存儲集群120能夠與其它設(shè)備和/或系統(tǒng)通信的任何類收發(fā)器機(jī)制。例如,通信接口380可以包括用于與其它存儲集群120和/或客戶端110通信的機(jī)制。[0037]圖4圖示了存儲集群120的功能框圖。如圖4中所示,存儲集群120可以包括數(shù)據(jù)存儲410和去重邏輯420。在一個實施方式中,如圖4中所圖示的,數(shù)據(jù)存儲410可以在存儲集群120內(nèi)提供。在其它實施方式中,數(shù)據(jù)存儲410中的部分或全部可以被存儲在與存儲集群120通信的系統(tǒng)100的一個或多個其它設(shè)備內(nèi),諸如外部存儲器設(shè)備或與索引系統(tǒng)(未示出)相關(guān)聯(lián)的設(shè)備。[0038]數(shù)據(jù)存儲410可以包括復(fù)制的索引存儲412和本地對象存儲414。復(fù)制的索引存儲412可以作為分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)的復(fù)制層的一部分被包括。復(fù)制的索引存儲412可以存儲與全局索引相關(guān)聯(lián)的信息。復(fù)制的索引存儲412的至少一部分可以在多個存儲集群120上被復(fù)制。每一個復(fù)制的索引存儲412的復(fù)制品的數(shù)量可以是用戶可配置的。本地對象存儲414可以將對象本地存儲在存儲集群120內(nèi)。本地對象存儲414可以包括文件,諸如客戶端(例如,客戶端110)上載的圖像或視頻。[0039]去重邏輯420可以包括從分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)內(nèi)的存儲集群(例如,存儲集群120-1、120-2、120-3以及120-4)移除冗余復(fù)制品的邏輯。用于每一個參與的存儲集群的去重邏輯420可以被分配為負(fù)責(zé)全局索引的特定部分。例如,去重邏輯420可以被分配給全局索引的特定范圍的內(nèi)容句柄。因此,分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)內(nèi)的僅僅一個存儲集群可以能夠?qū)ο到y(tǒng)內(nèi)的復(fù)制對象執(zhí)行破壞性操作(例如,對復(fù)制品的刪除)。[0040]為了便于去重,記錄可以由去重邏輯420生成,并且附于與特定內(nèi)容句柄相關(guān)聯(lián)的全局索引的一部分。記錄例如可以包括用于啟用活復(fù)制品的“Data”指定符、用于指示對復(fù)制品的正在進(jìn)行的刪除請求的“DeleteRequest”指定符以及用于指示已為去重選擇的復(fù)制品的“Deduped”指定符。在下面更加詳細(xì)地描述了記錄格式和用途。[0041]盡管圖4示出了存儲集群120的示例性功能組件,但是在其它實施方式中,存儲集群120可以包含比在圖4中所描繪的更少、另外、不同或不同布置的功能組件。在另外其它實施方式中,存儲集群120的一個或多個功能組件可以執(zhí)行被描述為由一個或多個其它功能組件執(zhí)行的一個或多個其它任務(wù)。[0042]示例性記錄結(jié)構(gòu)[0043]圖5提供了在一個示例性實施方式中,可以被寫入全局索引的去重指定記錄的示例性記錄結(jié)構(gòu)500的圖示。在全局索引中,可以將去重指定記錄與對象復(fù)制品的特定內(nèi)容句柄進(jìn)行關(guān)聯(lián)。如圖5中所示,記錄結(jié)構(gòu)500可以包括存儲集群標(biāo)識符(“ID”)部分510、存儲位置部分520以及指定部分530。存儲集群標(biāo)識部分510可以包括存儲為之寫記錄的對象復(fù)制品的存儲集群120的唯一標(biāo)識(例如,“集群ID”)。位置部分520可以包括復(fù)制品在存儲集群標(biāo)識部分510所識別的存儲集群120內(nèi)的位置的地址。指定部分530例如可以包括〃Data〃指定符、〃DeleteRequest〃指定符或〃Deduped〃指定符。[0044]記錄結(jié)構(gòu)500可以以〃ClusterID:Locat1n:Designat1n(集群ID:位置:指定)〃的形式列出。例如,復(fù)制品的記錄可以由存儲集群120-1以記錄"01:234523/2000:DeleteRequest"添加到全局索引,其中“01”是存儲集群120-1的集群ID,“234523/2000”是在存儲集群120-1內(nèi)的存儲復(fù)制品的位置,以及“DeleteRequest”是指定符。存儲集群120_2中的相同對象的另一個復(fù)制品的記錄可以是〃02:234544/1000:Data〃,其中“02”是存儲集群120-2的集群ID,“234544/1000”是在存儲集群120-2內(nèi)的位置,以及“Data”是指定符。[0045]示例性過程流程[0046]圖6A-6B是用于管理客戶端發(fā)起的上載/刪除操作的示例性過程的流程圖。圖6A描繪了從客戶端上載對象的示例性過程600的流程圖。圖6B描繪了移除客戶端所刪除的對象的示例性過程650的流程圖。在一個實施方式中,過程600和650可以由存儲集群120中的一個來執(zhí)行。過程600和650可以響應(yīng)于客戶端(例如,客戶端110)活動來實現(xiàn)。對于在下面描述的過程600和650的特定示例,可以參考文件系統(tǒng)140的存儲集群120-1,其中存儲集群120-1包括集群ID“01”。[0047]參考圖6A,當(dāng)從客戶端接收上載的文件(塊610)時,過程600可以開始。例如,存儲集群120-1可以從客戶端110中的一個接收新的文件??梢源鎯ι陷d的文件(塊620),以及可以將用于上載的文件的“Data”指定符寫入全局索引(塊630)。例如,存儲集群120_1可以將上載的文件存儲在存儲器(例如,存儲設(shè)備350)中,并且將對象的內(nèi)容句柄添加到全局索引。存儲集群120-1還可以將數(shù)據(jù)記錄(例如,〃01:Locat1n:Data〃)寫入由對象的內(nèi)容句柄尋址的復(fù)制的全局索引。[0048]參考圖6B,當(dāng)接收刪除的文件的通知(塊660)時,過程650可以開始。例如,存儲集群120-1可以接收客戶端110中的一個刪除了文件的指示??梢园l(fā)起刪除請求(塊670),以及可以將用于刪除的文件的“DeleteRequest”指定符寫入全局索引(塊680)。例如,存儲集群120-1可以發(fā)起刪除請求以從文件系統(tǒng)140異步移除刪除的文件。存儲設(shè)備120-1還可以將〃DeleteRequest〃記錄(例如,〃01:Locat1n:DeleteReqeust〃)寫入由對象的內(nèi)容句柄尋址的復(fù)制的全局索引。[0049]圖7是用于在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)(例如,文件系統(tǒng)140)中執(zhí)行去重的示例性過程700的流程圖。在一個實施方式中,過程700可以由存儲集群120中的一個來執(zhí)行。在另一個實施方式中,過程700的部分或全部可以由另一個設(shè)備或設(shè)備組一包括或排除存儲集群120—來執(zhí)行。過程700可以在每一個存儲集群120中周期性實現(xiàn),以及可以包括對存儲集群120中的對象的全部或一部分的掃描。對于在下面描述的過程700的特定示例,可以參考文件系統(tǒng)140的存儲集群120-1和120-2,其中存儲集群120-1包括集群ID“01”,以及存儲集群120-2包括集群ID“02”。[0050]如圖7中所圖示的,過程700可以以進(jìn)行對全局索引的掃描(塊710)開始。例如,(例如,使用去重邏輯420的)存儲集群120-1可以進(jìn)行對在全局索引中列出的對象的全部或一部分的掃描。掃描可以識別例如被標(biāo)記用于刪除的多個復(fù)制品和/或?qū)ο蟆0051]可以確定是否遇到刪除請求(塊720)。例如,存儲集群120-1可以遇到全局索引中的包括來自另一個存儲集群(例如,來自存儲集群120-2)的刪除請求指定符(例如,^02:Locat1n:DeleteReqeust'')的對象。如果確定遇到刪除請求(塊720-是),則可以對刪除請求進(jìn)行處理(塊730)。例如,存儲集群120-1可以如參考圖8更加詳細(xì)描述的來對刪除請求進(jìn)行處理。[0052]如果確定沒有遇到刪除請求(塊720-否),則可以確定是否存在冗余復(fù)制品(塊740)。冗余復(fù)制品可以是在不同位置的沒有對對象的未解決的(outstanding)刪除請求的復(fù)制對象。例如,存儲集群120-1可以識別與存儲集群120-1負(fù)責(zé)的內(nèi)容句柄相對應(yīng)的相同對象的多個復(fù)制品。例如,多個復(fù)制品可以被存儲在不同的存儲集群(例如,存儲集群120-1和存儲集群120-2)中或在相同存儲集群內(nèi)的不同位置中。[0053]如果確定存在幾余復(fù)制品(塊740_是),則可以移除幾余復(fù)制品(塊750)。例如,存儲集群120-1可以如參考圖9更加詳細(xì)描述的來移除冗余復(fù)制品。如果確定不存在冗余復(fù)制品(塊740-否),則過程可以返回到塊710,其中可以進(jìn)行對全局索引的另一個掃描(塊710)。[0054]圖8圖示了與圖6的塊660的對刪除請求的處理相關(guān)聯(lián)的示例性操作??梢杂龅綄ο蟮膭h除請求(塊810)。例如,存儲集群120-1進(jìn)行的掃描可以識別全局索引中的帶有先前由存儲集群120-1寫入、刪除某一存儲集群中的復(fù)制品的刪除請求指定符(例如,〃02:Locat1n:DeleteRequest")的內(nèi)容句柄。假設(shè)存儲集群120-1負(fù)責(zé)該內(nèi)容句柄,貝丨J存儲集群120-1可以應(yīng)用操作來確定現(xiàn)在是否可以對復(fù)制品進(jìn)行去重。[0055]可以確定是否存在去重指定符(塊820)。例如,存儲集群120-1可以查看全局索引中的與內(nèi)容句柄相關(guān)聯(lián)的其它記錄來確定是否存在去重指定符(例如,〃02:Locat1n:Deduped〃)。如果確定存在去重指定符(塊820-是),則可以對復(fù)制品和全局索引中的相關(guān)記錄進(jìn)行去重(塊830)。例如,存儲集群120-1可以發(fā)起刪除請求以刪除存儲集群120-2中的復(fù)制品(如果存在的話),以及從全局索引刪除與關(guān)于刪除的復(fù)制品的內(nèi)容句柄有關(guān)的任何記錄(例如,〃02:LOCat1n:*〃,其中可以是任何指定符)。[0056]如果確定不存在去重指定符(塊820-否),則可以確定是否存在另一個活復(fù)制品(塊840)。例如,存儲集群120-1可以查看用于全局索引的內(nèi)容句柄以確定對于該對象,是否存在另一個活復(fù)制品。全局索引例如可以包括關(guān)于該內(nèi)容句柄的來自另一個存儲集群的數(shù)據(jù)記錄(例如,"03:Locat1n:Data")。[0057]如果存在另一個活復(fù)制品(塊840-是),則可以如在上面參考塊830所描述地對復(fù)制品進(jìn)行去重。如果不存在另一個活復(fù)制品(塊840-否),則可以確定所有復(fù)制品是否具有刪除請求(塊850)。例如,存儲集群120-1可以查看用于全局索引的內(nèi)容句柄以確定與內(nèi)容句柄相關(guān)聯(lián)的所有復(fù)制品是否具有未解決的刪除請求(例如,〃*:*:DeleteRequest",其中分別可以是任何集群ID和任何位置)。[0058]如果確定所有復(fù)制品具有刪除請求(塊850-是),則可以如在上面參考塊830所描述地對復(fù)制品進(jìn)行去重。如果確定所有復(fù)制品均沒有刪除請求(塊850-否),則可以將對象從發(fā)起刪除請求的存儲集群拷貝到不同的存儲集群,以及可以更新全局索引(塊860)。例如,響應(yīng)于記錄〃02:Locat1n:DeleteRequest〃,存儲集群120-1可以將對象從存儲集群120-2拷貝到另一個存儲集群120-3,對于存儲集群120-3存在去重記錄(例如,〃03:Locat1n:Deduped〃)并且沒有未解決的刪除請求。存儲集群120_1可以刪除與復(fù)制品相關(guān)聯(lián)的先前去重記錄(例如,〃03:LOCat1n:DedUped〃),并且將數(shù)據(jù)指定符(例如,〃03:Locat1n:Data〃)寫入全局索引中的對象的對應(yīng)內(nèi)容句柄。[0059]圖9圖示了與圖7的塊750的對重復(fù)引用的移除相關(guān)聯(lián)的示例性操作??梢宰R別不帶刪除請求的多個復(fù)制品(塊910)。例如,存儲集群120-1可以查看全局索引,并且識別沒有與存儲集群120-1負(fù)責(zé)的內(nèi)容句柄相對應(yīng)的未解決的刪除請求的兩個或多個復(fù)制品。[0060]可以應(yīng)用確定復(fù)制品待被去重的標(biāo)準(zhǔn)(塊920)。例如,存儲集群120-1可以應(yīng)用標(biāo)準(zhǔn)來對可以被存儲在存儲集群120-1內(nèi)的冗余復(fù)制品進(jìn)行去重。對冗余復(fù)制品進(jìn)行去重的標(biāo)準(zhǔn)可以基于多種因素,諸如復(fù)制品的地理接近性、在存儲集群處的可用存儲能力或其它因素。(例如,使用去重邏輯420的)存儲集群120-1可以將標(biāo)準(zhǔn)應(yīng)用于在上面識別的沒有未解決的刪除請求的兩個或多個復(fù)制品。在一些實施方式中,多個復(fù)制品可以被識別來待被去重。在其它實施方式中,存儲集群120-1可以留下多于一個活復(fù)制品(例如,未被標(biāo)記用于去重的復(fù)制品)。[0061]可以對全局索引進(jìn)行更新以將去重的復(fù)制品指定為"Deduped〃(塊930)。例如,對于每一個去重的復(fù)制品,存儲集群120-1可以刪除與復(fù)制品相關(guān)聯(lián)的先前數(shù)據(jù)記錄(例如,〃02:Locat1n:Data〃),并且將去重指定符(例如,〃02:Locat1n:DedupecT)寫入全局索引中的對應(yīng)的內(nèi)容句柄。[0062]對冗余復(fù)制品的去重可以使用被復(fù)制為全局索引的一部分的去重消息來完成。被標(biāo)記用于去重的復(fù)制品可以被存儲在存儲集群120-1或另一個存儲集群(例如,存儲集群120-2、120-3、120-4等)內(nèi)。在一個實施方式中,存儲集群120-1可以刪除本地存儲的復(fù)制品以及從全局索引刪除對應(yīng)的〃01:Locat1n:Data"記錄,并且將〃01:Locat1n:Deduped"添加到全局索引。存儲集群120-1還可以使用復(fù)制的全局索引,發(fā)起刪除消息來刪除存儲在其它集群中的復(fù)制品。[0063]圖10提供了用于在分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)(例如,文件系統(tǒng)140)中優(yōu)化帶寬消耗以及減少時延的示例性過程1000的流程圖。在一個實施方式中,過程1000可以由存儲集群120中的一個來執(zhí)行。在另一個實施方式中,過程1000的部分或全部可以由另一個設(shè)備或設(shè)備組一包括或排除存儲集群120—來執(zhí)行。對于在下面描述的過程1000的特定示例,可以參考文件系統(tǒng)140的存儲集群120-1,其中存儲集群120-1包括集群ID“01”。[0064]如圖1000中所圖示,過程1000可以以接收對對象的請求(塊1010)開始。例如,存儲集群120-1可以從客戶端(例如,客戶端110-1)接收獲取對象的請求。[0065]可以在全局索引中查找對象位置(塊1020)。例如,存儲集群120-1可以使用對象的內(nèi)容句柄來在復(fù)制的全局索引中查找對象的復(fù)制品位置。[0066]可以識別“最佳”復(fù)制品位置(塊1030)。例如,假設(shè)多于一個復(fù)制品可用,存儲集群120-1可以確定待檢索的“最佳”復(fù)制品以最小化網(wǎng)絡(luò)資源。例如,“最佳”復(fù)制品可以是具有與存儲集群120-1最接近的地理位置的復(fù)制品。在其它實施方式中,“最佳”復(fù)制品可以基于可用網(wǎng)絡(luò)連通性、地理位置和/或其它標(biāo)準(zhǔn)的組合。因此,在一些實施方式中,對象的“最佳”復(fù)制品可以被本地存儲在存儲集群120-1內(nèi)。[0067]可以從所識別的位置檢索對象(塊1040)。例如,存儲集群120-1可以向最接近的可用存儲集群請求“最佳”復(fù)制品,并且接收滿足客戶端請求的復(fù)制品。存儲集群120-1然后可以將復(fù)制品發(fā)送給客戶端。[0068]示例[0069]圖11提供了根據(jù)在此描述的一個實施方式的示例性全局索引的一部分1100。除其它信息外,索引可以包括內(nèi)容句柄列1110和去重指定記錄列1120。假設(shè),在示例性索引部分1100中,分布式多主站數(shù)據(jù)復(fù)制系統(tǒng)包括三個存儲集群XX、YY和ZZ。去重算法可以在存儲集群XX、YY和ZZ的每一個中周期性地運(yùn)行,以及可以掃描全局索引的全部或一部分。并且,與特定對象內(nèi)容句柄相關(guān)聯(lián)的記錄(例如,Data、DeleteRequest和Deduped)可以由存儲集群XX、YY和ZZ中的一個寫入全局索引。對全局索引的修改可以被復(fù)制到所有其它參與的集群(例如,存儲集群XX、YY和ZZ的剩余者)。[0070]如圖11中所示,索引部分1100包括四個對象的內(nèi)容句柄和相關(guān)聯(lián)的刪除指定記錄?!癏andlelI”具有分別指示復(fù)制品被存儲在存儲集群XX處的記錄(〃XX:Locat1nOl:Data")和被存儲在存儲集群YY處的記錄("YY:Locat1nOl:Data")?!癏andle21”具有指示復(fù)制品被存儲在存儲集群XX處的記錄(〃XX:Locat1n02:Data")以及指示在存儲集群YY處的另一個復(fù)制品具有正在進(jìn)行的刪除請求的記錄(〃YY:Locat1n02:DeleteRequest")?!癏andle31”具有分別指不復(fù)制品被存儲在存儲集群YY處的記錄("XX:Locat1n03:Data")和被存儲在存儲集群ZZ處的記錄(〃ZZ:Locat1nOl:Data〃)?!癏andle31”還具有以下兩個記錄:指示在存儲集群YY處的復(fù)制品具有正在進(jìn)行的刪除請求的記錄(〃YY:Locat1n03:DeleteRequest")和指示在存儲集群ZZ處的復(fù)制品具有正在進(jìn)行的刪除請求的記錄(〃ZZ:Locat1n01:DeleteRequest〃)?!℉andle41〃具有指示復(fù)制品被存儲在存儲集群YY處的記錄(〃XX:Locat1n04:Data〃)以及指示在存儲集群YY處的復(fù)制品具有正在進(jìn)行的刪除請求的記錄(〃YY:Locat1n04:DeleteRequest")。Handle41還具有一個指示對復(fù)制品的去重已經(jīng)發(fā)生的記錄(〃ZZ:Locat1n02:Deduped")。存儲集群所使用的去重算法可以使用與在此描述的原理一致的導(dǎo)則來操作。假設(shè)存儲集群XX被分配為負(fù)責(zé)包括"Handlell"、〃Handle21〃、〃Handle31〃以及〃Handle41〃的全局索引的部分。[0071]當(dāng)對象被完全上載于存儲集群中時,存儲集群可以將數(shù)據(jù)記錄(例如,"ClusterID:Locat1n:Data")寫入由對象的內(nèi)容句柄尋址的復(fù)制的全局索引。例如,〃XX:Locat1nOl:Data〃和〃YY:Locat1nOl:Data〃說明了關(guān)于〃Handlell〃的復(fù)制品的數(shù)據(jù)記錄。并且,〃XX:Locat1n02:Data〃說明了關(guān)于〃Handle21〃的復(fù)制品的數(shù)據(jù)記錄。對于"Handle31〃和〃Handle41〃,可以看到類似的數(shù)據(jù)記錄。[0072]當(dāng)在存儲集群中請求對象時,存儲集群可以使用對象的內(nèi)容句柄來在復(fù)制的全局索引中查找復(fù)制品位置,并且從“最佳”(例如,最接近)集群取得復(fù)制品。例如,假設(shè)在存儲集群ZZ處請求與"Handlell"相對應(yīng)的對象,以及存儲集群YY比存儲集群XX更接近于存儲集群ZZ,存儲集群ZZ可以向存儲集群YY請求對應(yīng)于"Handlell"的對象復(fù)制品。[0073]當(dāng)在存儲集群中刪除對象時,存儲集群可以將"ClusterID:Location:DeleteRequest"寫入由對象的內(nèi)容句柄尋址的復(fù)制的全局索引。例如,〃YY:Locat1n02:DeleteRequest"說明了關(guān)于在存儲集群YY中的〃Handle21〃的刪除的復(fù)制品的記錄。類似地,〃YY:Locat1n03:DeleteRequest"和〃ZZ:Locat1nOl:DeleteRequest"分別說明了關(guān)于對存儲集群YY和ZZ而言的〃Handle31〃的刪除的復(fù)制品的記錄。[0074]如果在存儲集群中的掃描遇到?jīng)]有與存儲集群負(fù)責(zé)的內(nèi)容句柄相對應(yīng)的未解決的刪除請求的多個復(fù)制品,則存儲集群可以刪除對象的冗余復(fù)制品(可能留下多于一個活復(fù)制品)。對于另一個存儲集群中的每一個刪除的復(fù)制品,存儲集群可以刪除數(shù)據(jù)記錄并且寫入去重記錄。例如,在存儲集群XX中的掃描可以識別"Handlell"具有分別指示復(fù)制品被存儲在存儲集群XX的記錄(〃XX:LOCat1n01:Data〃)和被存儲在存儲集群YY的記錄(〃YY:Locat1n01:Data〃)?;跒橐瞥哂嘁枚峁┑臉?biāo)準(zhǔn),存儲集群XX可以發(fā)起刪除在存儲集群YY處的復(fù)制品。存儲集群XX可以刪除圖11中所示的記錄〃YY:Locat1nOl:Data〃,并且替代地寫入〃YY:Locat1nOl:Deduped"。[0075]如果在存儲集群XX中的掃描遇到與存儲集群XX負(fù)責(zé)的內(nèi)容句柄相對應(yīng)的、對另一個存儲集群(例如,存儲集群YY或ZZ)中的復(fù)制品的刪除請求(例如,"ClusterID=L0cat1n:DeleteRequest"),則存儲集群XX可以應(yīng)用下面的分析。如果對于與刪除請求相同的存儲集群和位置,存在"Deduped"記錄,如果存在對象的另一個活復(fù)制品、或如果所有的復(fù)制品均具有未解決的刪除請求,則存儲集群XX可以刪除存儲集群YY或ZZ中的對象的復(fù)制品(如果存在的話),并且刪除記錄"YY:Locat1n:*"或"ZZ:Locat1n:*"。例如,在存儲集群YY中的〃Handle21〃的復(fù)制品和記錄〃YY:Locat1n02:DeleteRequest〃可以由存儲集群Μ刪除,因為存在另一個活對象(由記錄〃XX:Locat1n02:Data〃指示)。類似地,在存儲集群YY中的〃Handle31〃的復(fù)制品和記錄〃YY:Locat1n:03:DeleteRequest〃可以由存儲集群XX刪除,因為存儲集群YY和存儲集群ZZ中的兩個復(fù)制品均具有未解決的刪除請求。[0076]如果存儲集群XX不能刪除存儲集群YY或ZZ中的對象的復(fù)制品(例如,不存在"Deduped"記錄或?qū)ο蟮牧硪粋€活復(fù)制品、以及所有的復(fù)制品均沒有未解決的刪除請求),則存儲集群XX可以將對象從YY或ZZ拷貝到另一個存儲集群,對于該另一個存儲集群存在去重記錄并且沒有未解決的刪除請求、刪除去重記錄以及寫入數(shù)據(jù)記錄。例如,存儲集群YY中的〃Handle41〃的復(fù)制品(〃YY:Locat1n04:DeleteRequest")可以觸發(fā)存儲集群XX將與"Handle41"相關(guān)聯(lián)的對象拷貝到存儲集群ZZ。存儲集群XX可以更新全局索引以將〃ZZ:Locat1n02:DedupecT改變?yōu)?ZZ:Locat1n02:Data"。[0077]算法的正確性是直截了當(dāng)?shù)?,因為對對象的所有刪除操作僅僅由在負(fù)責(zé)其內(nèi)容句柄的存儲集群中的掃描過程來執(zhí)行。算法還透明地處理相同集群中的、具有不同位置(例如,XX:Locat1nl和XX:Locat1n2)的多個對象復(fù)制品。[0078]結(jié)論[0079]在此描述的系統(tǒng)和/或方法可以將對象的全局索引存儲在分布式數(shù)據(jù)復(fù)制系統(tǒng)中,以及遍及分布式數(shù)據(jù)復(fù)制系統(tǒng)復(fù)制全局索引和部分對象。存儲集群可以被分配為在全局索引的特定子集內(nèi)的去重的責(zé)任實體。存儲集群可以進(jìn)行對全局索引的子集的掃描,并且基于掃描來識別冗余復(fù)制品。存儲集群可以對本地存儲或存儲在遠(yuǎn)程存儲集群中的冗余復(fù)制品進(jìn)行去重。[0080]對實施方式的前面的描述提供了說明和描述,但是并不意在窮舉或?qū)⒈景l(fā)明限制在所公開的精確形式。修改和變化根據(jù)上述教導(dǎo)是可能的或可以從本發(fā)明的實踐獲得。[0081]例如,在另一個實施方式中,可以使用去重算法的同步版本,其中不同的存儲集群直接而不是使用在分布式數(shù)據(jù)復(fù)制系統(tǒng)內(nèi)的復(fù)制層來通信。[0082]并且,雖然關(guān)于圖6A-10來描述了塊系列,但是在其它實施方式中,可以修改塊的順序。此外,可以并行執(zhí)行非依賴性的塊。[0083]將顯而易見的是,在此描述的實施例可以以在附圖中所圖示的實施方式中的軟件、固件以及硬件的許多不同形式實現(xiàn)。用于實現(xiàn)在此描述的實施例的實際軟件代碼或?qū)S每刂朴布⒉皇菍Ρ景l(fā)明的限制。因此,沒有參考特定軟件代碼描述了實施例的操作和行為一應(yīng)該理解的是,軟件和控制硬件可以基于在此的描述被設(shè)計來實現(xiàn)實施例。[0084]此外,在此描述的某些實施方式可以被實現(xiàn)為執(zhí)行一個或多個功能的“邏輯”或“組件”。該邏輯或組件可以包括:硬件,諸如處理器、微處理器、專用集成電路或現(xiàn)場可編程門陣列;或硬件和軟件(例如,由處理器執(zhí)行的軟件)的組合。[0085]應(yīng)當(dāng)強(qiáng)調(diào)的是,詞語“包括”在本說明書中使用時被采用來明確說明所述特征、完整物、步驟或組件的存在,但是并不排除一個或多個其它特征、完整物、步驟、組件或其組群的存在或添加。[0086]盡管在權(quán)利要求書中記載和/或在說明書中公開了特征的特定組合,但是這些組合并不意在限制本發(fā)明的公開。實際上,可以以未在權(quán)利要求書中明確記載和/或未在說明書中明確公開的方式對這些特征中的許多特征進(jìn)行組合。[0087]除非明確描述如此,在本申請的描述中使用的元素、動作或指令均不應(yīng)當(dāng)被解釋為對本發(fā)明是關(guān)鍵的或至關(guān)重要的。同時,如在此所使用的,不加數(shù)量詞的項意指包括一個或多個項。在意指僅僅一個項時,使用詞語“一個”或類似語言。此外,除非另外明確說明,如在此所使用的,短語“基于”意在表示“至少部分基于”?!緳?quán)利要求】1.一種計算機(jī)實現(xiàn)的方法,包括:在分布式存儲系統(tǒng)的多個設(shè)備中的第一設(shè)備處,其中所述第一設(shè)備包括一個或多個處理器以及存儲用于由所述一個或多個處理器執(zhí)行的程序的存儲器:訪問存儲在所述分布式存儲系統(tǒng)中的對象的索引,其中所述索引被存儲在所述第一設(shè)備處;掃描所述索引的第一部分;響應(yīng)于所述掃描,識別所述對象中的一個對象的冗余復(fù)制品;將新的記錄寫入對應(yīng)于所述冗余復(fù)制品的所述索引的所述第一部分,其中所述新的記錄包括去重指定符;以及在所述寫入操作之后,將所述索引的所述第一部分復(fù)制到所述多個設(shè)備以指定所述冗余復(fù)制品用于去重?!疚臋n編號】G06F17/30GK104166673SQ201410306908【公開日】2014年11月26日申請日期:2009年12月22日優(yōu)先權(quán)日:2008年12月22日【發(fā)明者】賈·達(dá)圖阿什維利,亞歷山大·克塞爾曼,亞歷山大·德羅貝切夫申請人:谷歌公司