相關申請的交互參考
本申請是申請日為2013年10月24日、申請?zhí)枮?01380063506.0、發(fā)明名稱為“用于采用一致性散列的全局命名空間的方法”的發(fā)明專利申請的分案申請。
背景技術:
存儲系統(tǒng)被要求存儲大量數據并且允許存儲容量隨時間縮放。傳統(tǒng)的縮放存儲容量的方法是與存儲池中的一個或多個存儲服務器相組合地包括一個或多個專用的元數據服務器。存儲服務器存儲客戶端數據,并且元數據服務器存儲關于客戶端數據在存儲服務器內的位置的元數據(而不存儲客戶端數據)。隨著存儲容量要求增加,存儲服務器的數量可能增加,并且存儲在元數據服務器中的元數據的量也可能增加。
在這樣的情況下,元數據服務器在i/o請求的處理中變?yōu)槠款i。就這點而論,前述的傳統(tǒng)方法不能在不影響(即延遲)與i/o請求的處理相關的性能的情況下高效地縮放存儲池。
技術實現要素:
概括地講,在一個方面,本發(fā)明涉及一種用于將數據寫到存儲池的方法。該方法包括:接收用于對象的虛擬標識符(id)和偏移;從虛擬id提取標識存儲池中的第一存儲服務器的節(jié)點標識符(id);從第一存儲服務器獲取用于對象的對象布局(ol);對對象id和偏移id進行散列變換以獲得散列值,其中,虛擬id包括對象id,并且其中,偏移id從偏移產生;使用全局命名空間布局(gl)、ol和散列值標識存儲池中的第二存儲服務器;并且發(fā)出將數據寫到第二存儲服務器中的對象的寫請求,其中,寫請求包括對象id和偏移。
概括地講,在一個方面,本發(fā)明涉及一種用于對于存儲池讀數據的方法。該方法包括:接收用于對象的虛擬id;從虛擬id提取標識存儲池中的第一存儲服務器的節(jié)點標識符(id);從第一存儲服務器獲得用于對象的對象布局(ol);對對象id和偏移id進行散列變換以獲得散列值,其中,虛擬id包括對象id,并且其中,偏移id從偏移產生;使用全局命名空間布局(gl)、ol和散列值來使用一致性散列標識存儲池中的第二存儲服務器;并且發(fā)出從第二存儲服務器中的對象讀數據的讀請求,其中,寫請求包括對象id和偏移。
概括地講,在一個方面,本發(fā)明涉及一種用于將數據寫到存儲池的方法。該方法包括:接收對于新對象的請求;從存儲池選擇存儲服務器,其中,所述存儲服務器使用節(jié)點id標識;請求所述存儲服務器產生虛擬id,其中,虛擬id包括節(jié)點id和用于對象的對象id;使用虛擬id產生用于對象的對象布局(ol);將ol存儲在所述存儲服務器中;接收將數據寫到對象的寫請求,其中,所述寫請求包括偏移;從偏移產生偏移id;對對象id和偏移id進行散列變換以獲得散列值;使用全局命名空間布局(gl)、ol和散列值標識存儲池中的第二存儲服務器;并且發(fā)出將數據寫到第二存儲服務器中的對象的寫請求,其中,寫請求包括對象id和偏移。
從以下的描述和所附的權利要求書,本發(fā)明的其他方面將是清楚的。
附圖說明
圖1示出根據本發(fā)明的一個或多個實施例的系統(tǒng)。
圖2a-2c示出根據本發(fā)明的一個或多個實施例的數據結構和數據結構之間的關系。
圖3示出根據本發(fā)明的一個或多個實施例的用于初始化存儲池的流程圖。
圖4示出根據本發(fā)明的一個或多個實施例的用于將存儲服務器添加到存儲池的流程圖。
圖5示出根據本發(fā)明的一個或多個實施例的用于將客戶端連接到存儲池的流程圖。
圖6示出根據本發(fā)明的一個或多個實施例的用于創(chuàng)建對象并且將數據存儲在該對象中的流程圖。
圖7示出根據本發(fā)明的一個或多個實施例的用于將數據寫到存儲池中的先前創(chuàng)建的對象的流程圖。
圖8示出根據本發(fā)明的一個或多個實施例的用于從存儲池中的對象讀數據的流程圖。
圖9示出根據本發(fā)明的一個或多個實施例的用于刪除存儲池中的對象的流程圖。
圖10a-10j示出實現本發(fā)明的一個或多個實施例的系統(tǒng)的例子。
具體實施方式
現在將參照附圖詳細描述本發(fā)明的特定實施例。在以下對于本發(fā)明的實施例的詳細描述中,闡述了許多特定細節(jié),以便提供本發(fā)明的更透徹的理解。然而,本領域的普通技術人員將清楚,本發(fā)明可以在沒有這些特定細節(jié)的情況下實施。在其他情況下,沒有詳細地描述公知的特征,以避免不必要地使描述復雜化。
在以下對于圖1-10j的描述中,關于一個圖描述的任何組件在本發(fā)明的各種實施例中可以等同于關于任何其他的圖描述的一個或多個類似命名的組件。為簡潔起見,將不對于每個圖重復這些組件的描述。因此,每個圖的組件的每一個實施例通過引用并入,并且被假定為可選地存在于每一個具有一個或多個類似命名的組件的其他的圖內。另外,根據本發(fā)明的各種實施例,一個圖的組件的任何描述要被解釋為可選的實施例,該可選的實施例可以是除了關于任何其他圖中的相應的類似命名的組件描述的實施例之外另外實現、與這些實施例結合實現、或者代替這些實施例實現。
概括地講,本發(fā)明的實施例涉及一種用于將數據存儲在存儲池中的方法和系統(tǒng)。更具體地講,本發(fā)明的實施例為存儲池提供全局命名空間,該全局命名空間與用于存儲池的全局命名空間布局(gl)和每一對象的對象布局(ol)相組合地使用一致性散列來確定存儲池中的對象的位置(一個或多個)。
在本發(fā)明的一個實施例中,所述系統(tǒng)不包括專用的元數據服務器;相反,用于對象的ol遍布存儲池分布。換句話說,每個存儲服務器包括ol和包括客戶端數據的對象的組合,其中,ol可以或者可以不與存儲在存儲服務器上的特定對象相關聯(lián)。因為本發(fā)明的實施例不包括專用的元數據服務器,所以本發(fā)明的實施例使得能夠在沒有延遲不利后果和與元數據服務器相關聯(lián)的縮放限制的情況下不受限制地縮放存儲池的容量。
為了本發(fā)明的目的,i/o請求是如下的請求,該請求指定存儲在客戶端上的對象(即,數據)的邏輯地址、或者存儲在操作地連接到客戶端的存儲器或永久性儲存器中的對象的邏輯地址。i/o請求還可以包括其他信息,諸如對象的大小。在本發(fā)明的一個實施例中,邏輯地址可以是n元組:<對象id,偏移>。在不脫離本發(fā)明的情況下,可以使用任何類型的邏輯地址。i/o請求的例子包括但不限于,讀請求(即,從存儲在存儲池中的對象獲得數據的請求)和寫請求(即,將數據寫到存儲池中的對象的請求)。
圖1示出根據本發(fā)明的一個或多個實施例的系統(tǒng)。該系統(tǒng)包括一個或多個客戶端(100a、100b)、通信結構(104)和存儲池(112),存儲池(112)包括一個或多個存儲服務器(106a、106b)。下面描述這些組件中的每個。
在本發(fā)明的一個實施例中,客戶端(100a、100b)是包括向存儲服務器(106a、106b)發(fā)出i/o請求的任何物理系統(tǒng)。在本發(fā)明的一個實施例中,客戶端可以包括處理器(未示出)、存儲器(未示出)和永久性儲存器(未示出)??蛻舳诉€包括執(zhí)行一個或多個應用程序(未示出)的功能。應用程序可以是用戶級應用程序和/或內核級應用程序。應用程序被配置為發(fā)出i/o請求,其中,應用程序發(fā)出的i/o請求被存儲控制器裝置驅動器(scdd)(102a、102b)接收和處理。
存儲控制器裝置驅動器(scdd)(102a、102b)被配置為根據圖5-9中所示的實施例接收和處理i/o請求。在本發(fā)明的一個實施例中,scdd在客戶端的用戶級(與內核級完全不同)上執(zhí)行。
在本發(fā)明的一個實施例中,存儲池(112)包括一個或多個存儲服務器(106a、106b),其中,每個存儲服務器包括存儲控制器(108a、108b)和儲存器(110a、110b)。
存儲控制器(108a、108b)被配置為實現本發(fā)明的根據圖3-9的各種實施例。在本發(fā)明的一個實施例中,存儲控制器包括被配置為執(zhí)行實現本發(fā)明的一個或多個實施例的指令的處理器(未示出),其中,這些指令被存儲在位于存儲控制器內的或者操作地連接到存儲控制器的非暫時性計算機可讀介質(未示出)上??商娲兀鎯刂破骺梢允褂帽慌渲脼樘峁┣笆龉δ艿募呻娐穪韺崿F。可替代地,存儲控制器可以使用fpga、asic、其他專門的硬件或者它們的任何組合來實現。在不脫離本發(fā)明的情況下,存儲控制器可以使用軟件和/或硬件的任何組合來實現。
在本發(fā)明的一個實施例中,儲存器(110a、110b)包括一個或多個永久性存儲裝置,包括,但不限于,磁性存儲裝置、光學存儲裝置、固態(tài)存儲裝置、相變存儲裝置、任何其他合適類型的永久性存儲裝置、或者它們的任何組合。
在本發(fā)明的一個實施例中,通信結構(104)使得客戶端(100a、100b)與存儲池(112)之間能夠通信。通信結構可以使用任何有線、無線或混合(有線和無線)連接來使得客戶端(100a、100b)與存儲池(112)之間能夠通信。
通信結構可以包括單個交換機或多個互連的交換機(未示出)。如果通信結構包括多個交換機,則每個交換機可以連接到每一個其他的交換機,可以連接到交換機結構中的交換機的子集,或者可以僅連接到一個其他的交換機。在本發(fā)明的一個實施例中,每個交換機是被配置為使得客戶端(100a、100b)與存儲池(112)之間可以通信的硬件和邏輯的組合(例如使用集成電路實現)(根據通信結構實現的協(xié)議定義)。
通信結構可以促進使用任何通信協(xié)議的通信。這樣的通信協(xié)議的例子可以包括,但不限于,外圍組件互連(pci)、pci-express(pcie)、pci-extended(pci-x)、非易失性存儲器高速(nvme)、通過pci-express結構的非易失性存儲器高速(nvme)、通過以太網結構的非易失性存儲器高速(nvme)、以及通過無限帶寬結構的非易失性存儲器高速(nvme)。本發(fā)明不限于前述協(xié)議。
在不脫離本發(fā)明的情況下,可以使用除了圖1中所示的系統(tǒng)配置之外的系統(tǒng)配置。
圖2a-2c示出根據本發(fā)明的一個或多個實施例的數據結構和數據結構之間的關系。
全局命名空間布局(gl)指定存儲池(或者其一部分)在該存儲池(或者其該部分)的壽命期間的狀態(tài)。在給定時間,存儲池的狀態(tài)指定(i)在存儲池中哪些存儲服務器是可寫的,以及(ii)存儲池中可寫的存儲服務器之間的寫分布。更具體地講,當數據可以被寫到存儲服務器上的對象時,該存儲服務器被視為“可寫的”。就這點而論,可能存在如下的情況,即,在存儲池中存在n個存儲服務器,但是僅m個存儲服務器是“可寫的”,其中,m<n。不管存儲服務器是否是“可寫的”,該存儲服務器都可以根據例如圖8為讀請求服務。關于可寫的存儲服務器之間的寫分布,可寫的存儲服務器之間的寫分布確定用于給定對象的數據可以被存儲到這些可寫的存儲器服務器中的哪些。換句話說,當寫請求被接收到時,可寫的存儲服務器之間的寫分布確定數據最終將被存儲到存儲服務器中的哪些。
翻到圖2a,gl(200)包括gl序號(202)、節(jié)點計數(204)以及一個或多個服務器條目(206a、206b)。下面描述這些組件中的每個。
gl序號(202)唯一地標識在存儲池的整個壽命期間的gl的版本。節(jié)點計數(204)指定在存儲池中的存儲服務器的數量;然而,如上所述,并非所有的存儲服務器都是“可寫的”。
每個服務器條目(206a、206b)指定特定服務器在給定時間的寫分布。更具體地講,服務器條目可以包括,但不限于,(i)唯一地標識存儲池中的(或者存儲池的與gl相關聯(lián)的部分內的)存儲服務器的節(jié)點標識符(id)(208a、208b)、(ii)一個或多個節(jié)點標點(210a、210b)(下面描述)、以及(iii)指定該服務器條目適用的gl序號的節(jié)點序號(212a、212b)。
關于節(jié)點標點,散列函數應用于每個節(jié)點id以產生一個或多個值,其中,這些值映射到數值范圍[0,…,n]。這些值隨后除以n,從而得到映射到數值范圍[0,…,1]的節(jié)點標點,這些節(jié)點標點從概念上講可以被看作單位圓(即,半徑為1的圓)。用于所有存儲服務器的在數值范圍[0,…,1]內的節(jié)點標點的數量和分布描述存儲服務器在特定gl序號的寫分布。如果特定存儲服務器在給定gl序號不具有節(jié)點標點,則該特定存儲服務器在該gl序號不是“可寫的”。在不脫離本發(fā)明的情況下,寫分布可以使用其他的有限數值范圍(即,除了[0,…,1]之外的數值范圍)來指定。
在本發(fā)明的一個實施例中,當(i)用于存儲池(或者其一部分)中的任何一個存儲服務器的節(jié)點標點(一個或多個)改變、或者(ii)新的存儲服務器被添加到存儲池(參見例如圖4)時,gl序號被更新。用于一個或多個存儲服務器的節(jié)點標點(一個或多個)可以基于每個存儲服務器的空閑的存儲容量而被修改,以便使寫偏向于一個或多個存儲服務器和/或遠離一個或多個存儲服務器。可替代地,用于一個或多個存儲服務器的節(jié)點標點(一個或多個)可以被修改,以便確保當新的存儲服務器添加到存儲池時存儲池中的存儲服務器之間的數據分布是均勻的??商娲?,用于一個或多個存儲服務器的節(jié)點標點(一個或多個)可以被修改,以便將單個的服務器的帶寬和/或i/o請求處理能力考慮在內。
圖2b示出根據本發(fā)明的一個實施例的對象布局(ol)。ol(214)包括ol序號(216)、虛擬id(vid)(218)以及條帶寬度(224)。下面描述這些組件中的每個。
ol序號(216)對應于與ol(214)相應的對象第一次被創(chuàng)建時gl(200)的gl序號(202)。虛擬id(218)包括節(jié)點id(220)和對象id(222)。節(jié)點id(220)標識產生vid(218)并且包括vid(218)的副本(通常存儲在適當的ol中,參見例如圖6)的存儲服務器。對象id(222)在全局命名空間中唯一地標識對象(即,對象id對于全局命名空間橫跨的存儲服務器中的所有其他的對象id都是唯一的)。條帶寬度(224)對應于在前進到gl中的下一個存儲服務器標點之前順序地傳送到存儲服務器(gl標識)的數據單位。例如,如果條帶寬度(sw)是64kb,并且將被寫到存儲池的對象用對象id和偏移(o)=256k標識,并且將被寫到對象的數據的大小是128kb,則將發(fā)出兩個寫請求,其中,每個請求包括64kb的數據,并且其中,每個寫請求可以由不同的存儲服務器服務。具體地講,用于對象的ol使用散列<vid,-1>標識。用于第一個64kb的第一個寫請求被發(fā)到使用散列<對象id,256>和gl標識的存儲服務器,和用于第二個64kb的第二個寫請求被發(fā)到使用散列<對象id,256+64>和gl標識的存儲服務器。下面描述使用前述散列值的特定存儲服務器的選擇。在本發(fā)明的一個實施例中,條帶寬度被設置為等于存儲服務器和/或通信結構所支持的最大傳輸單位(mtu)。
在存儲池中對于每個對象存在單個ol。在本發(fā)明的一個實施例中,一旦被創(chuàng)建,用于對象的ol就不會改變。ol用于標識與ol相應的對象被創(chuàng)建時gl的狀態(tài)。通過該信息,對象(或者其一部分)可以被安置在存儲池中。(參見例如圖7和8)。
圖2c示出根據本發(fā)明的一個或多個實施例的散列值與物理存儲位置之間的關系。每個ol具有唯一的vid,并且被存儲在節(jié)點id所標識的存儲服務器中的至少一個物理位置中,節(jié)點id在vid中指定。(參見例如圖2b,218)。在本發(fā)明的一個實施例中,物理存儲位置(228)(即,存儲ol的物理位置)映射到節(jié)點id所標識的存儲服務器中的散列表條目。散列表條目與通過對<vid,-1>(226)進行散列變換而產生的散列值相關聯(lián)。散列表條目還可以包括ol的副本在存儲服務器的非易失性存儲器中的位置。在不脫離本發(fā)明的情況下,可以使用任何散列函數和任何特殊偏移(不只是-1)。
圖3-9示出根據本發(fā)明的一個或多個實施例的流程圖。雖然每個流程圖中的各個步驟是按順序呈現和描述的,但是普通技術人員將意識到,這些步驟中的一些或全部可以按不同次序執(zhí)行,可以組合或省略,并且這些步驟中的一些或全部可以并行執(zhí)行。在本發(fā)明的一個實施例中,圖3-9中所示的一個或多個步驟可以與圖3-9中所示的一個或多個其他并行執(zhí)行。
圖3示出根據本發(fā)明的一個或多個實施例的用于初始化存儲池的流程圖。圖3中所示的處理可以由存儲池中的一個存儲服務器執(zhí)行,或者由系統(tǒng)中的客戶端之一執(zhí)行。在步驟300中,標識將被包括在存儲池中的存儲服務器。在步驟302中,選擇在步驟300中標識的存儲服務器之一。在步驟304中,獲得用于在步驟302中選擇的存儲服務器的節(jié)點id??梢允褂萌魏我阎挠糜讷@得和/或產生id的機制來獲得和/或產生節(jié)點id。
在步驟306中,將散列函數應用于節(jié)點id以獲得一個或多個節(jié)點標點??梢曰诳蛻舳酥付ǖ牟呗?、基于一個或多個存儲服務器指定的策略、或者基于與存儲池相關聯(lián)的默認策略來確定分配給給定的存儲服務器的節(jié)點標點的數量。在步驟308中,創(chuàng)建與在步驟302中標識的存儲服務器相應的服務器條目,并且使用節(jié)點id、節(jié)點標點(一個或多個)和節(jié)點序號來填充該服務器條目。節(jié)點序號對應于當前gl序號。例如,如果服務器條目是在gl序號為0時創(chuàng)建的,則節(jié)點序號被設置為0。圖3示出初始gl的產生。因此,即使gl中的gl序號在這個階段可能未在gl中正式設置,gl序號也將是初始gl序號值,例如,1,就這點而論,節(jié)點序號可以在正式設置初始gl之前被設置。
在步驟310中,確定是否存在附加的要處理的存儲服務器。如果存在附加的要處理的存儲服務器,則所述處理進入步驟302;否則,所述處理進入步驟312。在步驟312中,在gl中設置gl序號。圖3示出初始gl的產生。因此,gl序號被設置為初始gl序號值,例如,1。在步驟314中,設置節(jié)點計數,其中,節(jié)點計數對應于存儲池中的存儲服務器的數量。在步驟316中,將gl存儲在存儲池中的每個服務器中。
圖4示出根據本發(fā)明的一個或多個實施例的用于將存儲服務器添加到存儲池的流程圖。在步驟400中,標識要添加到存儲池的附加的存儲服務器。通常,該步驟在圖3中所示的處理已經被執(zhí)行之后的時刻(例如,當添加附加的存儲服務器來增加存儲池的存儲容量時)發(fā)生。
在步驟402中,獲得用于所述附加的存儲服務器的節(jié)點id??梢允褂萌魏我阎挠糜讷@得和/或產生id的機制來獲得和/或產生節(jié)點id。在步驟404中,將散列函數應用于節(jié)點id以獲得一個或多個節(jié)點標點。節(jié)點標點(一個或多個)可以以使得新的寫請求偏向于所述附加的存儲服務器的方式產生。在步驟406中,創(chuàng)建與在步驟400中標識的附加的存儲服務器相應的服務器條目,并且使用節(jié)點id、節(jié)點標點(一個或多個)和節(jié)點序號來填充該服務器條目。節(jié)點序號對應于當前gl序號加1。將服務器條目添加到gl來獲得更新的gl。
在步驟408中,在更新的gl中更新gl序號。例如,將gl序號加1。用于在步驟406中創(chuàng)建的服務器條目的節(jié)點序號等于更新的gl序號。在步驟410中,更新節(jié)點計數來反映存儲池中的附加的存儲服務器。在步驟412中,將更新的gl存儲在存儲池中的每個服務器中。在本發(fā)明的一個實施例中,在每個存儲服務器上僅存儲一個gl,就這點而論,當更新的gl被存儲服務器接收時,以前的gl被從該存儲服務器刪除或者以其他方式從該存儲服務器移除。在本發(fā)明的一個實施例中,更新的gl可以由存儲服務器根據圖5中所描述的處理而獲得。
圖5示出根據本發(fā)明的一個或多個實施例的用于將客戶端連接到存儲池的流程圖。在本發(fā)明的一個實施例中,圖5中所示的處理由scdd(圖1中的102a、102b)執(zhí)行。
在步驟500中,存儲池中的存儲服務器之一從客戶端接收連接請求。在步驟502中,響應于連接請求,存儲服務器將其當前的gl提供給客戶端。在步驟504中,客戶端確定它是否已經具有gl。在本發(fā)明的一個實施例中,如果客戶端先前已經連接到了存儲池中的另一個存儲服務器,則該客戶端已經包括gl(該gl可以或者可以不與在步驟502中獲得的當前gl相同)。如果客戶端已經具有另一個gl,則所述處理進入步驟506;否則,所述處理結束。
在步驟506中,確定在步驟502中獲得的gl是否是用于存儲池的最當前的gl。更具體地講,確定在步驟502中獲得的gl的序號是否大于客戶端先前獲得的gl的序號。如果在步驟502中獲得的gl的序號大于客戶端先前獲得的gl的序號,則所述處理進入步驟508;否則,所述處理結束。在步驟508中,客戶端將先前存儲的gl(即,具有比它提供給客戶端的gl的gl序號大的gl序號的gl)發(fā)送到存儲服務器。
圖6示出根據本發(fā)明的一個或多個實施例的用于創(chuàng)建對象并且將數據存儲在該對象中的流程圖。在本發(fā)明的一個實施例中,圖6中所示的處理由scdd(圖1中的102a、102b)執(zhí)行。
在步驟600中,接收創(chuàng)建新對象的請求。在本發(fā)明的一個實施例中,該請求由在客戶端上執(zhí)行的應用程序發(fā)出,并且被scdd接收。
在步驟602中,選擇存儲服務器。在本發(fā)明的一個實施例中,從存儲池隨機地選擇或者使用圓羅賓(roundrobin)算法選擇存儲服務器。在不脫離本發(fā)明的情況下,可以使用任何的從存儲池選擇存儲服務器的方法。
在步驟604中,將產生新的虛擬id(vid)的請求發(fā)送到在步驟602中標識的存儲服務器。vid包括節(jié)點id,節(jié)點id標識存儲服務器,和對象id,對象id標識存儲池中的新對象。
在步驟606中,創(chuàng)建用于對象的對象布局(ol)。ol可以由存儲服務器或者由scdd創(chuàng)建。具體地講,存儲服務器和scdd都包括填充用于對象的ol所必需的信息。
在步驟608中,對<vid,-1>進行散列變換以獲得第一散列值。如以上所討論的,在不脫離本發(fā)明的情況下,可以使用任何的特殊偏移(除了-1之外)。在步驟610中,使用第一散列值將用于對象的ol存儲在存儲服務器中。如上所述,第一散列值與存儲服務器上的散列表條目相關聯(lián),其中,散列表條目與存儲服務器的儲存器中的存儲ol的至少一個物理位置相關聯(lián)。在這個階段,對象和相應的ol已經被創(chuàng)建;然而,數據尚未被存儲在對象中。下列步驟描述數據最初是如何存儲在對象中的。
在步驟612中,對<對象id,偏移id>進行散列變換以獲得第二散列值。更具體地講,客戶端上的應用程序請求與vid和偏移相關聯(lián)的數據被存儲在對象中。作為響應,scdd從vid獲得對象id,和偏移id則通過將基于條帶寬度的位掩碼應用于偏移而獲得。
在步驟614中,使用用于對象的第二散列值、gl和ol來標識存儲池中的目標存儲服務器。更具體地講,從ol提取ol序號,并且使用該ol序號來確定當ol被創(chuàng)建時哪些存儲服務器是“可寫的”。在本發(fā)明的一個實施例中,確定哪些存儲服務器是“可寫的”包括:(i)標識所有的具有小于或等于ol序號的節(jié)點序號的服務器條目;(ii)分析任何的具有相同的節(jié)點id的服務器條目以確定當ol被創(chuàng)建時可寫的一個或多個節(jié)點標點;(iii)從(i)和(ii)產生最終的一組節(jié)點標點;以及(iv)使用一致性散列、連同第二散列值和節(jié)點標點來標識目標服務器。關于圖10a-10j進一步描述一致性散列。
以下是確定當ol被創(chuàng)建時哪些存儲服務器是“可寫的”的例子。這個例子并非意圖限制本發(fā)明的范圍。
考慮gl具有下列服務器條目的情況:
e1:[nodea,[a1,a2],s1]
e2:[nodea,[a3],s2]
e3:[nodeb,[b1],s1]
e4:[nodec,[c1,c2],s2]
e5:[noded,[d1],s3]
進一步,用于對象的ol如下:
ol:[s2,vid,sw]
因此,具有小于或等于ol序號的節(jié)點序號的服務器條目是e1、e2、e3和e4。此外,e1和e2具有相同的節(jié)點id,即,節(jié)點a,但是具有在不同節(jié)點序號的不同節(jié)點標點,因此,對e1和e2進行分析以確定哪些節(jié)點應與在s2被標識為節(jié)點a的存儲服務器相關聯(lián)。在這個例子中,在s2,僅存在一個節(jié)點標點a3。因此,最終的一組節(jié)點標點是a3、b1、c1和c2。
繼續(xù)參照圖6,在步驟616,將數據存儲在對象中的寫請求發(fā)送到目標服務器,其中,該請求標識對象id和偏移。在不脫離本發(fā)明的情況下,前述請求可以使用任何邏輯地址。
圖7示出根據本發(fā)明的一個或多個實施例的用于將數據寫到存儲池中的先前創(chuàng)建的對象的流程圖。在本發(fā)明的一個實施例中,圖7中所示的處理由scdd(圖1中的102a、102b)執(zhí)行。
在步驟700中,接收<vid,offset>。在步驟702中,從vid提取節(jié)點id。在步驟704中,對<vid,-1>進行散列變換以獲得第一散列值。如上所述,在不脫離本發(fā)明的情況下,可以使用任何的特殊偏移(除了-1之外)。在步驟706中,使用第一散列值從節(jié)點id所標識的存儲服務器獲得ol。如果scdd以前獲得了ol(例如,當執(zhí)行圖6中的各個步驟時),則步驟702-706可能不需要執(zhí)行,相反,客戶端可以使用先前高速緩存的ol。
在步驟708中,對<objectid,offsetid>進行散列變換以獲得第二散列值。在本發(fā)明的一個實施例中,對象id從vid獲得,偏移id則通過將基于條帶寬度的位掩碼應用于偏移而獲得。在步驟710中,使用用于對象的第二散列值、gl和ol標識存儲池中的目標存儲服務器。使用與圖6中的步驟614中所描述的處理相同的處理標識目標服務器。在步驟712中,將數據存儲在對象中的請求發(fā)送到目標服務器,其中,該請求指定對象id和偏移。在不脫離本發(fā)明的情況下,前述請求可以使用任何邏輯地址。在步驟714中,確定目標存儲服務器是否包括ol。如果目標存儲服務器包括ol,則所述處理結束;否則,所述處理進入步驟716。在步驟716中,使用第一散列值將ol存儲在目標存儲服務器中。以這種方式,將給定ol的附加副本存儲在存儲池中的各個存儲服務器中。這使得客戶端可以使用散列<vid,-1>來獲得用于除了節(jié)點id所標識的服務器之外的服務器的ol。
圖8示出根據本發(fā)明的一個或多個實施例的用于從存儲池中的對象讀數據的流程圖。在本發(fā)明的一個實施例中,圖8中所示的處理由scdd(圖1中的102a、102b)執(zhí)行。
在步驟800中,接收<vid,偏移>。在步驟802中,從vid提取節(jié)點id。在步驟804中,對<vid,-1>進行散列變換以獲得第一散列值。如以上所討論的,在不脫離本發(fā)明的情況下,可以使用任何的特殊偏移(除了-1之外)。在步驟806中,使用第一散列值從節(jié)點id所標識的存儲服務器獲得ol。如果scdd先前已經獲得了ol,則步驟802-806可能不需要執(zhí)行。相反,scdd可以搜索客戶端來獲得ol。
在步驟808中,對<對象id,偏移id>進行散列變換以獲得第二散列值。在本發(fā)明的一個實施例中,對象id從vid獲得,偏移id則通過將基于條帶寬度的位掩碼應用于偏移而獲得。在步驟810中,使用用于對象的第二散列值、gl和ol來標識存儲池中的目標存儲服務器。使用與在圖6中的步驟614中所描述的處理相同的處理來標識目標服務器。在步驟812中,將對象中的讀請求發(fā)送到目標服務器,其中,該請求指定對象id和偏移。在不脫離本發(fā)明的情況下,前述請求可以使用任何邏輯地址。
圖9示出根據本發(fā)明的一個或多個實施例的用于刪除存儲池中的對象的流程圖。在本發(fā)明的一個實施例中,圖9中所示的處理由scdd(圖1中的102a、102b)執(zhí)行和/或發(fā)起。
在步驟900中,獲得vid,其中,該vid對應于將從存儲池刪除的對象。在步驟902中,從vid提取節(jié)點id。在步驟904中,對<vid,-1>進行散列變換以獲得第一散列值。如上所述,在不脫離本發(fā)明的情況下,可以使用任何的特殊偏移(除了-1之外)。在步驟906中,將刪除標志寫到通過節(jié)點id標識的存儲服務器中、與第一散列值相應的散列表條目。在步驟908中,使存儲池中的所有的其他的存儲服務器中的所有的與第一散列值相應的散列表條目失效。在步驟910中,使通過節(jié)點id標識的存儲服務器中的與第一散列值相應的散列表條目失效。在這個階段,可以使用任何已知的存儲回收算法來回收先前分配給存儲現在失效的對象和/或ol的物理儲存器。
圖10a-10j示出根據本發(fā)明的一個或多個實施例的例子。例子并非意圖限制本發(fā)明的范圍。此外,在圖10a-10j中,為清晰起見,省略了客戶端和存儲服務器中的各種組件。
考慮系統(tǒng)包括連接到最初包括兩個存儲服務器的存儲池的客戶端。圖10a示出用于存儲池的初始gl。參照圖10a,gl包括用于每個存儲服務器的服務器條目(服務器條目a、服務器條目b)。具體地講,服務器條目a對應于存儲服務器a(參見圖10b),并且指定下列信息:(i)節(jié)點ida,其在存儲池中唯一地標識存儲服務器a;(ii)節(jié)點標點:a1、a2(參見圖10d);以及(iii)節(jié)點序號a:1,其指當gl序號等于1時服務器條目a被添加到gl。類似地,服務器條目b對應于存儲服務器b(參見圖10b),并且指定下列信息:(i)節(jié)點idb,其在存儲池中唯一地標識存儲服務器b;(ii)節(jié)點:b1(參見圖10d);以及(iii)節(jié)點序號b:1,其指當gl序號等于1時服務器條目b被添加到gl。gl還包括被設置為1的gl序號,因為這是初始gl,并且節(jié)點計數被設置為2,因為在存儲池中存在兩個存儲服務器。
參照圖10b,在某一稍后的時刻,客戶端a將對于新對象的請求發(fā)送到服務器a。如以上所討論的,客戶端a可以將對于新對象的請求發(fā)送到存儲池中的可寫的存儲服務器中的任何一個。響應于該請求,存儲服務器a產生vid,其中,vid包括節(jié)點ida和用于存儲池中的新對象的對象id。存儲服務器a隨后產生用于該新對象的對象布局(ol)。圖10c示出存儲服務器a產生的ol。參照圖10c,ol包括下列信息:(i)ol序號:1,其指示當gl序號等于1時ol條目被創(chuàng)建;(ii)vid,其事先由存儲服務器a產生;以及(iii)條帶寬度:64kb。
返回到圖10b,在產生ol之后,存儲服務器a使用散列<vid,-1>存儲ol,并且還將ol的副本發(fā)送到客戶端a。在某一稍后的時間,在客戶端a上執(zhí)行的應用程序(未示出)請求將數據寫到<對象id,偏移1>。響應于該請求,客戶端a使用ol(參見圖10c)、gl(參見圖10a)和散列<對象id,偏移1>來標識目標服務器,其中,偏移id通過用從ol(參見圖10c)獲得的條帶寬度掩蔽偏移1而產生。
如前面所討論的,ol用于確定在ol被創(chuàng)建時在全局命名空間中哪些存儲服務器是“可寫的”。在這個例子中,ol序號為1。因此,在ol被創(chuàng)建時在全局命名空間中可寫的存儲服務器將在gl中具有其節(jié)點序號小于或等于1的服務器條目。參照圖10a中的gl,服務器條目a和服務器條目b都具有等于1的節(jié)點序號,就這點而論,當ol被創(chuàng)建時在全局命名空間中是可寫的。用于每個存儲服務器的節(jié)點標點(即,a1、a2和b1)從相應的服務器條目獲得。
隨后使用節(jié)點標點(即,a1、a2和b1)和散列<對象id,偏移id1>來標識目標服務器。更具體地講,參照圖10d,每一個節(jié)點標點(即,a1、a2和b1)從概念上講均可以被看作是單位圓上的標點,其中,節(jié)點標點(即,a1、a2和b1)的值規(guī)定每個節(jié)點標點在單位圓上的位置。此外,散列<對象id,偏移id1>從概念上講也可以被看作是單位圓上的標點。應用一致性散列的原理,從散列<對象id,偏移id1>限定的標點開始,并且在順時針方向上移動,所遇到的第一個節(jié)點標點將用于標識目標服務器。在這個例子中,散列<對象id,偏移id1>位于a1與b1之間。在順時針方向上移動,所遇到的第一個節(jié)點標點是b1。b1是與存儲服務器b相關聯(lián)的節(jié)點標點。因此,存儲服務器b被標識為目標服務器。
參照圖10b,客戶端a隨后將指定(散列<對象id,偏移1>,數據)的寫請求發(fā)送到存儲服務器b。存儲服務器b隨后存儲數據。因為存儲服務器b不包括ol的副本,所以客戶端a還將ol的副本發(fā)送到存儲服務器b。當接收到時,存儲服務器b使用散列<vid,-1>存儲ol。
參照圖10e,在某一稍后的時間,將存儲服務器c添加到存儲池。結果,gl被更新來反映新存儲服務器的添加。更新的gl包括服務器條目c。服務器條目c對應于存儲服務器c(參見圖10f),并且指定下列信息:(i)節(jié)點idc,其在存儲池中唯一地標識存儲服務器c;(ii)節(jié)點:c1(參見圖10g);以及(iii)節(jié)點序號c:2,其指示當gl序號等于2時服務器條目c被添加到gl。gl還包括被設置為2的指示gl已經被更新的gl序號、以及被設置為3的節(jié)點計數,因為在存儲池中存在三個存儲服務器。
參照圖10f,在gl被更新(參見圖10e)在之后,客戶端a接收從<vid,offset2>讀數據的請求。因為ol對應于先前提供給客戶端的vid(參見圖10b)所標識的對象,所以不需要向存儲池請求ol。
客戶端a使用ol(參見圖10c)、gl(參見圖10e)和散列<對象id,偏移id2>來標識目標服務器,其中,偏移id2通過用從ol(參見圖10c)獲得的條帶寬度掩蔽偏移2而產生。
如前面所討論的,ol用于確定在ol被創(chuàng)建時在全局命名空間中哪些存儲服務器是“可寫的”。在這個例子中,ol序號是1。因此,在ol被創(chuàng)建時在全局命名空間中可寫的存儲服務器將在gl中具有節(jié)點序號小于或等于1的服務器條目。參照圖10e中的gl,服務器條目a和服務器條目b都具有等于1的節(jié)點序號,就這點而論,當ol被創(chuàng)建時在全局命名空間中是可寫的。雖然gl包括服務器條目c,但是因為節(jié)點序號c為2,所以存儲服務器c在ol被創(chuàng)建時是不可寫的,就這點而論,不用于標識目標服務器。用于存儲服務器a和b的節(jié)點標點(即,a1、a2和b1)從相應的服務器條目獲得。
隨后使用節(jié)點標點(即,a1、a2和b1)和散列<對象id,偏移id2>來標識目標服務器。更具體地講,參照圖10g,節(jié)點標點(即,a1、a2和b1)從概念上講均可以被看作是單位圓上的標點,其中,節(jié)點標點(即,a1、a2和b1)的值規(guī)定每個節(jié)點標點在單位圓上的位置。此外,散列<對象id,偏移id2>從概念上講也可以被看作是單位圓上的標點。應用一致性散列的原理,從散列<對象id,偏移id2>限定的點開始,并且在順時針方向移動,所遇到的第一個節(jié)點標點將用于標識目標服務器。在這個例子中,散列<對象id,偏移id2>位于b1與a2之間。在順時針方向上移動,所遇到的第一個節(jié)點標點是a2。a2是與存儲服務器a相關聯(lián)的節(jié)點。因此,存儲服務器a被標識為目標服務器。
參照圖10f,客戶端a隨后將指定<對象id,偏移2>的讀請求發(fā)送到存儲服務器a。存儲服務器a隨后獲得所請求的數據,并且將它送回到客戶端a。
參照圖10h,在gl被更新(參見圖10e)之后,客戶端a接收讀用于<vid2,偏移3>的數據的請求??蛻舳薬從vid2(參見圖10i)提取節(jié)點idb(其標識存儲服務器b),隨后使用散列<vid2,-1>將對于ol2的請求發(fā)送到存儲服務器b。響應于該請求,存儲服務器b獲得ol2,并且將它送回到客戶端a。
客戶端a然后使用ol2(參見圖10j)、gl(參見圖10e)和散列<對象id2,偏移id3>來標識目標服務器,其中,偏移id3通過用從ol2(參見圖10j)獲得的條帶寬度掩蔽偏移3而產生。
如前面所討論的,ol用于確定在ol被創(chuàng)建時在全局命名空間中哪些存儲服務器是“可寫的”。在這個例子中,ol序號是2(參見圖10j)。因此,在ol2被創(chuàng)建時在全局命名空間中可寫的存儲服務器將在gl中具有其節(jié)點序號小于或等于2的服務器條目。參照圖10e中的gl,服務器條目a、服務器條目b和服務器條目c全都具有小于或等于2的節(jié)點序號,就這點而論,當ol2被創(chuàng)建時在全局命名空間中是可寫的。用于每個存儲服務器的節(jié)點標點(即,a1、a2和b1)從相應的服務器條目獲得。
隨后使用節(jié)點標點(即,a1、a2、b1、c1)和散列<對象id2,偏移id3>來標識目標服務器。更具體地講,參照圖10j,每個節(jié)點(即,a1、a2和b1)從概念上講均可以被看作是單位圓上的標點,其中,節(jié)點標點(即,a1、a2、b1、c1)的值規(guī)定每個節(jié)點標點在單位圓上的位置。此外,散列<對象id2,偏移id3>從概念上講也可以被看作是單位圓上的標點。應用一致性散列的原理,從散列<對象id2,偏移id3>限定的點開始,并且在順時針方向上移動,所遇到的第一個節(jié)點標點將用于標識目標服務器。在這個例子中,散列<對象id2,偏移id3>位于b1與c1之間。在順時針方向上移動,所遇到的第一個節(jié)點標點是c1。c1是與存儲服務器c相關聯(lián)的節(jié)點。因此,存儲服務器c被標識為目標服務器。
參照圖10h,客戶端a隨后將指定(<對象id2,偏移3>)的讀請求發(fā)送到存儲服務器c。存儲服務器c隨后獲得所請求的數據,并且將它送回到客戶端a。
雖然已經關于有限數量的實施例描述了本發(fā)明,但是受益于本公開的本領域的技術人員將意識到,可以設想不脫離如本文中所公開的本發(fā)明的范圍的其他實施例。因此,本發(fā)明的范圍僅應由所附權利要求書限制。