專利名稱:已分區(qū)的、可縮放的、并且可用的結(jié)構(gòu)化存儲(chǔ)中的分區(qū)管理的制作方法
已分區(qū)的、可縮放的、并且可用的結(jié)構(gòu)化存儲(chǔ)中的分區(qū)管理
背景技術(shù):
包括服務(wù)器農(nóng)場、web服務(wù)等的分布式系統(tǒng)對于提供巨大量的計(jì)算和存儲(chǔ)資源已變得日益常見。例如,分布式存儲(chǔ)系統(tǒng)被用來為各種應(yīng)用存儲(chǔ)并檢索巨大量的數(shù)據(jù)。在一些情況下,存儲(chǔ)系統(tǒng)利用結(jié)構(gòu)化存儲(chǔ)來更高效地存儲(chǔ)、檢索以及查詢數(shù)據(jù)。結(jié)構(gòu)化存儲(chǔ)系統(tǒng)可以跨遍及網(wǎng)絡(luò)的多個(gè)節(jié)點(diǎn)來存儲(chǔ)數(shù)據(jù)。隨著提供這樣的存儲(chǔ)所需的計(jì)算資源量的增加, 這樣的存儲(chǔ)系統(tǒng)可以通過添加附加計(jì)算設(shè)備而“擴(kuò)展”,從而提供可以按需添加附加資源的靈活的拓?fù)浣Y(jié)構(gòu)。因此,結(jié)構(gòu)化存儲(chǔ)系統(tǒng)可例如從千萬億字節(jié)的存儲(chǔ)數(shù)據(jù)擴(kuò)展成百萬萬億字節(jié)的存儲(chǔ)數(shù)據(jù)。結(jié)果,管理這樣的結(jié)構(gòu)化存儲(chǔ)系統(tǒng)內(nèi)的數(shù)據(jù)以使得數(shù)據(jù)總是可供訪問并且持久以防止數(shù)據(jù)丟失通常是復(fù)雜的。概述提供本概述是為了以簡化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本發(fā)明內(nèi)容不旨在標(biāo)識(shí)所要求保護(hù)的主題的關(guān)鍵特征或本質(zhì)特征,也不旨在用于幫助確定所要求保護(hù)的主題的范圍。本發(fā)明的各實(shí)施例涉及結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)系統(tǒng)中的分區(qū)管理。在該存儲(chǔ)中,結(jié)構(gòu)化數(shù)據(jù)被劃分成可由不同的服務(wù)器提供的多個(gè)分區(qū)。使用分區(qū)圖來跟蹤這些分區(qū)的所在之處。更具體地,使用分區(qū)圖,客戶機(jī)可以找出哪一服務(wù)器正在提供特定數(shù)據(jù)段。跟蹤各分區(qū)的詳細(xì)負(fù)載信息。各分區(qū)可以在服務(wù)器之間移動(dòng),以跨各服務(wù)器來達(dá)到負(fù)載平衡。在一些實(shí)施例中,為了達(dá)到更好的負(fù)載平衡,標(biāo)識(shí)具有高負(fù)載的分區(qū)來進(jìn)行拆分。確定拆分該分區(qū)的位置,并且將該分區(qū)拆分以創(chuàng)建子分區(qū),在一些實(shí)施例中,這些子分區(qū)可被卸載到另一服務(wù)器。更新分區(qū)圖以反映該分區(qū)已被拆分成各子分區(qū)。在一些實(shí)施例中,標(biāo)識(shí)兩個(gè)或更多個(gè)分區(qū)來進(jìn)行歸并。歸并這些分區(qū)并更新分區(qū)圖來反映經(jīng)歸并的分區(qū)。結(jié)構(gòu)化存儲(chǔ)是在流系統(tǒng)的頂層構(gòu)建的,該流系統(tǒng)呈現(xiàn)只可添加(append-only)的文件系統(tǒng)界面。流類似于只可添加的文件。每一分區(qū)具有與它相關(guān)聯(lián)的一組流。該分區(qū)的所有持久狀態(tài)都保持在與它相關(guān)聯(lián)的這一組流中。在該組流中,存在該分區(qū)的元數(shù)據(jù)流,它包含到該分區(qū)的所有其他流的指針以及該分區(qū)的必要信息,該必要信息諸如是該分區(qū)中包括的所有行的分區(qū)鍵范圍。附圖簡述下面參考附圖詳細(xì)描述本發(fā)明,附圖中
圖1是適用于實(shí)現(xiàn)本發(fā)明的各實(shí)施例的示例性計(jì)算環(huán)境的框圖;圖2描繪根據(jù)本發(fā)明的一實(shí)施例的表結(jié)構(gòu);圖3是其中可以實(shí)現(xiàn)本發(fā)明的各實(shí)施例的示例性系統(tǒng)的框圖;圖4是根據(jù)本發(fā)明的一實(shí)施例的示出一個(gè)分區(qū)的框圖;圖5是根據(jù)本發(fā)明的一實(shí)施例的示出用于拆分一分區(qū)的方法的流程圖;圖6描繪根據(jù)本發(fā)明的一實(shí)施例的被拆分成兩個(gè)子分區(qū)的父分區(qū)的示例;圖7是根據(jù)本發(fā)明的另一實(shí)施例的示出用于拆分一分區(qū)的方法的流程圖;圖8是根據(jù)本發(fā)明的一實(shí)施例的示出用于將各分區(qū)歸并成一個(gè)經(jīng)歸并的分區(qū)的方法的流程圖;圖9是根據(jù)本發(fā)明的一實(shí)施例的示出用于恢復(fù)破壞分區(qū)的方法的流程圖;以及圖10是根據(jù)本發(fā)明的一實(shí)施例的示出用于分區(qū)版本化和升級(jí)的方法的流程圖。詳細(xì)描述此處用細(xì)節(jié)來描述本發(fā)明的主題以滿足法定要求。然而,該描述本身并非旨在限制本專利的范圍。相反,發(fā)明人設(shè)想所要求保護(hù)的主題還可結(jié)合其他當(dāng)前或未來技術(shù)按照其他方式來具體化,以包括不同的步驟或類似于本文中所描述的步驟的步驟組合。此外,盡管術(shù)語“步驟”和/或“框”可在此處用于指示所采用的方法的不同元素,但除非而且僅當(dāng)明確描述了各個(gè)步驟的順序,否則該術(shù)語不應(yīng)被解釋為意味著此處公開的各個(gè)步驟之中或之間的任何特定順序。本發(fā)明的各實(shí)施例提供可縮放的、可用的、并且持久的結(jié)構(gòu)化存儲(chǔ)。該結(jié)構(gòu)化存儲(chǔ)由多個(gè)表來表示,這些表中的每一個(gè)包括多個(gè)行,每一行表示一數(shù)據(jù)實(shí)體。表被分成多個(gè)分區(qū),每一分區(qū)包括來自該表的一定范圍的行。各分區(qū)存儲(chǔ)在表服務(wù)器上并且被使用表主機(jī)來進(jìn)行管理。在一些實(shí)施例中,各分區(qū)是出于負(fù)載分布的目的來被拆分的。跟蹤各表服務(wù)器和各分區(qū)的負(fù)載分布信息?;谠撠?fù)載分布信息,表主機(jī)可以決定對各分區(qū)進(jìn)行負(fù)載平衡,并將各分區(qū)重新分配給不同的節(jié)點(diǎn)以分布負(fù)載。另外,對于一些分區(qū),表主機(jī)可以決定將拆分一分區(qū)以分布當(dāng)前負(fù)載。表主機(jī)確定拆分比率,并查詢提供該分區(qū)的表服務(wù)器以尋找用于定位該拆分的鍵信息?;趶谋矸?wù)器接收到的鍵信息,表主機(jī)指令該表服務(wù)器拆分該分區(qū)。在接收到拆分請求后,表服務(wù)器卸載目標(biāo)分區(qū),創(chuàng)建子分區(qū),并開始提供該子分區(qū)。在一些實(shí)施例中,子分區(qū)被分配給另一表服務(wù)器。更新分區(qū)圖以反映提供子分區(qū)的表服務(wù)器。在一些實(shí)施例中,各分區(qū)被歸并。同樣,跟蹤各表服務(wù)器和各分區(qū)的負(fù)載分布信息?;谠撠?fù)載分布信息,標(biāo)識(shí)兩個(gè)或更多個(gè)分區(qū)來進(jìn)行歸并。提供這些分區(qū)的表服務(wù)器被指令停止提供這些分區(qū)。這些分區(qū)被歸并,并且被加載到開始提供經(jīng)歸并的分區(qū)的表服務(wù)器,更新分區(qū)圖以反映提供經(jīng)歸并的分區(qū)的表服務(wù)器。因此,在一個(gè)方面,本發(fā)明的一實(shí)施例針對由結(jié)構(gòu)化存儲(chǔ)系統(tǒng)內(nèi)的一個(gè)或多個(gè)計(jì)算設(shè)備實(shí)現(xiàn)的方法,其中結(jié)構(gòu)化存儲(chǔ)由一個(gè)或多個(gè)表來表示,每一個(gè)表包括多個(gè)行,每一行表示由該結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在多個(gè)分區(qū)之間劃分該多個(gè)行,每一分區(qū)包括來自該表內(nèi)的多個(gè)行中的一定范圍的行,其中該多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對多個(gè)表服務(wù)器的分區(qū)分配。該方法用于將一分區(qū)拆分成各子分區(qū),并且包括基于分區(qū)的負(fù)載信息來標(biāo)識(shí)要拆分的分區(qū),其中該負(fù)載信息包括指定該分區(qū)的兩個(gè)或更多個(gè)部分中的每一個(gè)部分上的負(fù)載的信息。該方法還包括由表主機(jī)基于該分區(qū)的兩個(gè)或更多個(gè)部分中的每一個(gè)部分上的負(fù)載來確定用于拆分該分區(qū)的拆分比率。該方法還包括查詢表服務(wù)器以尋找指示該分區(qū)內(nèi)的與該分區(qū)比率相對應(yīng)的實(shí)際位置的鍵信息。該方法還包括在表主機(jī)處從表服務(wù)器接收鍵信息,該鍵信息指示該分區(qū)內(nèi)的與拆分比率相對應(yīng)的實(shí)際位置。該方法還包括從表主機(jī)向表服務(wù)器發(fā)送拆分請求,該拆分請求指示基于鍵信息來拆分該分區(qū)。該方法還包括在與該鍵信息相對應(yīng)的位置處拆分該分區(qū),以創(chuàng)建子分區(qū)。該方法還包括通知表主機(jī)拆分已完成。該方法還包括基于被拆分成子分區(qū)的分區(qū)來更新分區(qū)圖,分區(qū)圖存儲(chǔ)多個(gè)分區(qū)與提供該多個(gè)分區(qū)的多個(gè)表服務(wù)器之間的映射。在本發(fā)明的另一實(shí)施例中,一個(gè)方面針對存儲(chǔ)用于執(zhí)行一種方法的計(jì)算機(jī)可使用指令的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),該方法用于管理由一個(gè)或多個(gè)表來表示的結(jié)構(gòu)化存儲(chǔ)系統(tǒng),每一個(gè)表包括多個(gè)行,每一行表示由該結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在多個(gè)分區(qū)之間劃分該多個(gè)行,每一分區(qū)包括來自該表內(nèi)的多個(gè)行中的一定范圍的行,其中該多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對多個(gè)表服務(wù)器的分區(qū)分配。該方法用于將該表的至少兩個(gè)分區(qū)歸并成經(jīng)歸并的分區(qū),并且包括跟蹤多個(gè)表服務(wù)器上的多個(gè)分區(qū)的負(fù)載信息。該方法還包括由表主機(jī)基于該負(fù)載信息來標(biāo)識(shí)要?dú)w并的至少兩個(gè)分區(qū)。該方法還包括由表主機(jī)創(chuàng)建該經(jīng)歸并的分區(qū)的元數(shù)據(jù)流。該方法還包括將該至少兩個(gè)分區(qū)從提供該至少兩個(gè)分區(qū)的至少一個(gè)表服務(wù)器上卸載。 該方法還包括由表主機(jī)將該經(jīng)歸并的分區(qū)分配給來自該多個(gè)表服務(wù)器的所選表服務(wù)器。該方法還包括在所選表服務(wù)器處加載并提供該經(jīng)歸并的分區(qū)。本發(fā)明的又一實(shí)施例針對存儲(chǔ)用于執(zhí)行一種方法的計(jì)算機(jī)可使用指令的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),該方法用于管理由一個(gè)或多個(gè)表來表示的結(jié)構(gòu)化存儲(chǔ)系統(tǒng),每一個(gè)表包括多個(gè)行,每一行表示由該結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在多個(gè)分區(qū)之間劃分該多個(gè)行,每一分區(qū)包括來自該表內(nèi)的多個(gè)行中的一定范圍的行,其中該多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對多個(gè)表服務(wù)器的分區(qū)分配。該方法用于將該表的一分區(qū)拆分成至少兩個(gè)子分區(qū),并且包括跟蹤多個(gè)表服務(wù)器上的多個(gè)分區(qū)的負(fù)載信息。該方法還包括由表主機(jī)基于該負(fù)載信息來標(biāo)識(shí)要拆分的分區(qū),其中該分區(qū)的負(fù)載信息標(biāo)識(shí)該分區(qū)的不同部分上的不同負(fù)載。該方法還包括在表主機(jī)處確定用于拆分該分區(qū)的拆分比率,其中該拆分比率是基于負(fù)載信息來指定的并且表示該分區(qū)中的點(diǎn),在該點(diǎn)處該分區(qū)的第一部分包括第一負(fù)載量并且該分區(qū)的第二部分包括第二負(fù)載量。該方法還包括從表主機(jī)向表服務(wù)器發(fā)送請求,該對鍵信息的請求標(biāo)識(shí)該分區(qū)中的與拆分比率相對應(yīng)的實(shí)際位置。該方法還包括由表服務(wù)器確定標(biāo)識(shí)該分區(qū)中的與拆分比率相對應(yīng)的實(shí)際位置的鍵信息,并將該鍵信息從表服務(wù)器傳遞給表主機(jī)。該方法還包括在表主機(jī)處構(gòu)造各子分區(qū)中的每一個(gè)子分區(qū)的元數(shù)據(jù)流。該方法還包括從表主機(jī)向表服務(wù)器發(fā)送拆分請求,并且在表服務(wù)器處構(gòu)建來自該分區(qū)的子分區(qū)。該方法還包括在該表服務(wù)器處停止提供該分區(qū),并且在該表服務(wù)器處加載并提供子分區(qū)。該方法還包括從表服務(wù)器向表主機(jī)發(fā)送拆分完成通知。該方法還包括基于被拆分成子分區(qū)的分區(qū)來更新分區(qū)圖,分區(qū)圖存儲(chǔ)多個(gè)分區(qū)與提供該多個(gè)分區(qū)的多個(gè)表服務(wù)器之間的映射。在簡要描述了本發(fā)明各實(shí)施例的概覽之后,以下描述其中可實(shí)現(xiàn)本發(fā)明的各實(shí)施例的示例性操作環(huán)境,以便為本發(fā)明各方面提供通用上下文。首先具體參考圖1,示出了用于實(shí)現(xiàn)本發(fā)明的各實(shí)施例的示例性操作環(huán)境,并將其概括地指定為計(jì)算設(shè)備100。計(jì)算設(shè)備 100只是合適的計(jì)算環(huán)境的一個(gè)示例,并且不旨在對本發(fā)明的使用范圍或功能提出任何限制。也不應(yīng)該將計(jì)算設(shè)備100解釋為對所示出的任一組件或其組合有任何依賴性或要求。本發(fā)明可以在由計(jì)算機(jī)或諸如個(gè)人數(shù)據(jù)助理或其他手持式設(shè)備之類的其他機(jī)器執(zhí)行的計(jì)算機(jī)代碼或機(jī)器可使用指令(包括諸如程序模塊之類的計(jì)算機(jī)可執(zhí)行指令)的一般上下文中描述。一般而言,包括例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等的程序模塊指的是執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的代碼。本發(fā)明可以在各種系統(tǒng)配置中實(shí)施,這些系統(tǒng)配置包括手持式設(shè)備、消費(fèi)電子產(chǎn)品、通用計(jì)算機(jī)、專用計(jì)算設(shè)備等等。本發(fā)明也可以在其中任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠(yuǎn)程處理設(shè)備執(zhí)行的分布式計(jì)算環(huán)境中實(shí)施。參考圖1,計(jì)算設(shè)備100包括直接或間接耦合以下設(shè)備的總線110 存儲(chǔ)器112、一個(gè)或多個(gè)處理器114、一個(gè)或多個(gè)呈現(xiàn)組件116、輸入/輸出端口 118、輸入/輸出組件120、 和說明性電源122??偩€110可表示一條或多條總線(諸如地址總線、數(shù)據(jù)總線、或其組合)。雖然為了清楚起見利用線條示出了圖1的各框,但是實(shí)際上,各組件的輪廓并不是那樣清楚,并且比喻性地來說,線條更精確地將是灰色的和模糊的。例如,可以將諸如顯示設(shè)備的呈現(xiàn)組件認(rèn)為是I/O組件。而且,處理器具有存儲(chǔ)器??梢哉J(rèn)識(shí)到,這是本領(lǐng)域的特性, 并且重申,圖1的圖示只是例示可結(jié)合本發(fā)明的一個(gè)或多個(gè)實(shí)施例來使用的示例性計(jì)算設(shè)備。諸如“工作站”、“服務(wù)器”、“膝上型計(jì)算機(jī)”、“手持式設(shè)備”等分類之間沒有區(qū)別,它們?nèi)慷急徽J(rèn)為是在圖1的范圍之內(nèi)的并且被稱為“計(jì)算設(shè)備”。計(jì)算設(shè)備100通常包括各種計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可由計(jì)算設(shè)備100訪問的任何可用介質(zhì),而且包含易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。作為示例而非限制,計(jì)算機(jī)可讀介質(zhì)可以包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括以用于存儲(chǔ)諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)的信息的任何方法和技術(shù)實(shí)現(xiàn)的易失性和非易失性、可移動(dòng)和不可移動(dòng)介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于, RAM、ROM、EEPR0M、閃存或其他存儲(chǔ)器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其他光學(xué)存儲(chǔ)、 磁帶盒、磁帶、磁盤存儲(chǔ)或其他磁存儲(chǔ)設(shè)備、或能用于存儲(chǔ)所需信息且可以由計(jì)算設(shè)備100 訪問的任何其他介質(zhì)。通信介質(zhì)通常以諸如載波或其他傳輸機(jī)制的已調(diào)制數(shù)據(jù)信號(hào)來體現(xiàn)計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù),并包括任意信息傳送介質(zhì)。術(shù)語“已調(diào)制數(shù)據(jù)信號(hào)”指的是其一個(gè)或多個(gè)特征以在信號(hào)中編碼信息的方式被設(shè)定或更改的信號(hào)。 作為示例而非限制,通信介質(zhì)包括有線介質(zhì),如有線網(wǎng)絡(luò)或直接線連接,以及諸如聲學(xué)、RF、 紅外及其他無線介質(zhì)之類的無線介質(zhì)。上述的任意組合也應(yīng)包含在計(jì)算機(jī)可讀介質(zhì)的范圍內(nèi)。存儲(chǔ)器112包括易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。存儲(chǔ)器可以是可移動(dòng)的、不可移動(dòng)的、或其組合。示例性硬件設(shè)備包括固態(tài)存儲(chǔ)器、硬盤驅(qū)動(dòng)器、光盤驅(qū)動(dòng)器等。計(jì)算設(shè)備100包括從諸如存儲(chǔ)器112或I/O組件120等各種實(shí)體讀取數(shù)據(jù)的一個(gè)或多個(gè)處理器。呈現(xiàn)組件116向用戶或其他設(shè)備呈現(xiàn)數(shù)據(jù)指示。示例性呈現(xiàn)組件包括顯示設(shè)備、揚(yáng)聲器、打印組件、振動(dòng)組件等等。I/O端口 118允許計(jì)算設(shè)備100在邏輯上耦合至包括I/O組件120的其他設(shè)備,其中某些設(shè)備可以是內(nèi)置的。說明性組件包括麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀、打印機(jī)、無線設(shè)備、網(wǎng)絡(luò)設(shè)備等等。高級(jí)數(shù)據(jù)模型根據(jù)本發(fā)明的各實(shí)施例,結(jié)構(gòu)化存儲(chǔ)由表來表示,其中表包含行集合。作為說明, 圖2描繪根據(jù)本發(fā)明的一個(gè)實(shí)施例的表200的一部分。表200中的每一行(如行20 表示數(shù)據(jù)實(shí)體并包含在一系列列中標(biāo)識(shí)的一組屬性,該組屬性包括屬性204、206、以及208 (為簡化和清楚起見,列208的數(shù)據(jù)值為空)。屬性/列可以是例如名稱、類型化值對、或名稱到多個(gè)類型化值的映射。行和/或每一單獨(dú)的屬性可以版本化或可以不版本化。表本身可具有固定模式,其中該表中的每一行具有相同屬性和相同類型,或可以不強(qiáng)制模式,其中每一行存儲(chǔ)了不同的一組屬性和類型。對結(jié)構(gòu)化存儲(chǔ)執(zhí)行的標(biāo)準(zhǔn)操作集合包括插入、更新和刪除表、行以及屬性的能力。 另外,提供了對表、行以及屬性進(jìn)行掃描和查詢以找出與該指定掃描/查詢相匹配的一組表、行或?qū)傩缘墓δ堋7謪^(qū)劃分(partitioning)表能長到數(shù)十億或數(shù)萬億行以及萬億字節(jié)/千萬億字節(jié)的數(shù)據(jù),并且表可能必須跨數(shù)千服務(wù)器分布以處理對表的不同部分的流量/負(fù)載。為了使結(jié)構(gòu)化存儲(chǔ)達(dá)到這一可縮放性,各實(shí)施例采用分區(qū)劃分來將各表和各行分布在各服務(wù)器上。分區(qū)劃分將表中的各行編組/斷開成各分區(qū),并且隨后這些分區(qū)被分配給不同的服務(wù)器并從這些不同的服務(wù)器提供(提供對這些分區(qū)的讀和寫訪問)。為了使表變得可縮放,表具有被稱為屬性的組成分區(qū)鍵的一個(gè)到多個(gè)鍵。例如,參考圖2的表200,表200的第一列204包括每一行/實(shí)體的分區(qū)鍵。如果給定表存在超過一個(gè)分區(qū)鍵屬性/列,則組合在一起的屬性/列形成該表的合成分區(qū)鍵。一個(gè)行的分區(qū)鍵的值被用來標(biāo)識(shí)該實(shí)體/行所屬于的分區(qū)。具有相同分區(qū)鍵值的行被認(rèn)為編組到同一分區(qū)中。除分區(qū)鍵之外,每一行具有零個(gè)到多個(gè)附加行鍵屬性/列。例如,再次參考圖2的表200,表200的第二列206包括每一行/實(shí)體的行鍵。行鍵表示分區(qū)內(nèi)的行的唯一 ID。組合了行鍵的分區(qū)鍵表示該行/實(shí)體在該表中的主鍵(唯一 ID)。主鍵表示該表中的分區(qū)的主排序次序。如果沒有行鍵,則分區(qū)鍵是主鍵并且必須唯一地標(biāo)識(shí)該表中的每一實(shí)體。雖然下文的描述按照單個(gè)分區(qū)鍵和單個(gè)行鍵討論了本發(fā)明的各實(shí)施例,但在使用多個(gè)分區(qū)鍵和/或行鍵時(shí),同樣的原理也適用。分區(qū)鍵被用來將具有相同分區(qū)鍵“值”的各行編組在一起,而行鍵表示行在分區(qū)內(nèi)的唯一 ID?;诜謪^(qū)鍵值將表的各行斷開在本文中被稱為對表進(jìn)行分區(qū)劃分。這將表的各行編組/斷開成各分區(qū)。分區(qū)是具有同一分區(qū)鍵值的行集合,所以具有同一分區(qū)鍵的所有這些行將總是被存儲(chǔ)在同一分區(qū)中。因此,具有同一分區(qū)鍵值的兩個(gè)行處于同一分區(qū)中, 并且不被拆分到跨兩個(gè)分區(qū)。另外,在一些實(shí)施例中,分區(qū)的定義被擴(kuò)展,以允許具有不同分區(qū)鍵值的多個(gè)行被編組在同一分區(qū)中,只要它們的鍵值在分區(qū)鍵名字空間中顯得鄰近即可。作為示例,參考圖2的表200,示出了四個(gè)分區(qū),第一分區(qū)(Pl 210)、第二分區(qū)(P2 212)、 第三分區(qū)(P3 214)以及第四分區(qū)(P4 216)。如圖2所示,一些分區(qū)包括具有單個(gè)分區(qū)鍵值的各行,而其他分區(qū)包括具有多個(gè)分區(qū)鍵值的各行。作為前者的示例,Pl 210包括具有分區(qū)鍵值1的所有行,并且P2 212包括具有分區(qū)鍵值2的所有行。作為后者的示例,P3 214 包括具有分區(qū)鍵值3、4、或5的所有行,并且P4 216包括具有分區(qū)鍵值6或7的所有行。分區(qū)劃分的優(yōu)點(diǎn)包括但不限于(1)通過將表斷開成各分區(qū)并基于數(shù)據(jù)的訪問模式和流量需求以將這些分區(qū)分布在各服務(wù)器上來縮放對表的訪問的能力,以及O)同一分區(qū)中的各行被編組在一起并且從同一表服務(wù)器訪問,這允許在操作的作用域處于分區(qū)內(nèi)時(shí)更高效地進(jìn)行查詢、掃描、以及高速緩存。對分區(qū)進(jìn)行掃描更加高效,因?yàn)橛捎谒菑脑摲謪^(qū)的單個(gè)表服務(wù)器訪問,因此最多只需掃描各分區(qū)內(nèi)的那些行,而非在查詢時(shí)在沒有指定分區(qū)鍵的情況下可能必須遍歷整個(gè)表。高級(jí)體系結(jié)構(gòu)
根據(jù)本發(fā)明的各實(shí)施例,一組服務(wù)器(本文中被稱為“表服務(wù)器”)存儲(chǔ)結(jié)構(gòu)化存儲(chǔ)系統(tǒng)并提供對它的訪問。另外,一組服務(wù)器(本文中被稱為“表主機(jī)”)管理這些表服務(wù)器。“表客戶機(jī)”提供對該結(jié)構(gòu)化存儲(chǔ)系統(tǒng)的應(yīng)用程序訪問?,F(xiàn)在參考圖3,提供了示出根據(jù)本發(fā)明一實(shí)施例的系統(tǒng)300的高級(jí)體系結(jié)構(gòu)的框圖。應(yīng)當(dāng)理解,此處所描述的這一和其他安排僅作為示例來闡明。除了所示的安排和元素之外,或作為其替代,可使用其他安排和元素(例如,機(jī)器、接口、功能、次序、以及功能組等), 并且可完全省略某些元素。此外,此處所描述的許多元素是可以實(shí)現(xiàn)為分立或分布式組件或結(jié)合其他組件來實(shí)現(xiàn)的、以及以任何合適的組合和在任何合適的位置的功能實(shí)體。此處被描述為由一個(gè)或多個(gè)實(shí)體執(zhí)行的各種功能可由硬件、固件和/或軟件來執(zhí)行。例如,各種功能可由執(zhí)行存儲(chǔ)在存儲(chǔ)器中的指令的處理器來執(zhí)行。雖然未示出其他組件,但系統(tǒng)300 —般包括表主機(jī)302,表服務(wù)器304、306、308、 310,以及表客戶機(jī)312。每一個(gè)都可以駐留在任何類型的計(jì)算設(shè)備上,諸如例如參考圖1描述的計(jì)算設(shè)備100。系統(tǒng)300的組件可以經(jīng)由網(wǎng)絡(luò)彼此通信,網(wǎng)絡(luò)包括但不限于一個(gè)或多個(gè)局域網(wǎng)(LAN)和/或廣域網(wǎng)(WAN)。應(yīng)當(dāng)理解,雖然圖3中只示出了單個(gè)表主機(jī)、四個(gè)表服務(wù)器、以及單個(gè)表客戶機(jī),但在本發(fā)明的各實(shí)施例的范圍內(nèi),在系統(tǒng)300中可以使用任何數(shù)量的表主機(jī)、表服務(wù)器、表客戶機(jī)。表主機(jī)302負(fù)責(zé)(1)將各分區(qū)分配給表服務(wù)器304、306、308、310 ; (2)快速確定一分區(qū)何時(shí)由于故障而沒有被提供并將該分區(qū)重新分配給不同的表服務(wù)器;C3)控制各分區(qū)在表服務(wù)器304、306、308、310之間的負(fù)載平衡;以及(4)監(jiān)視表服務(wù)器304、306、308、 310的健康。表服務(wù)器304、306、308、310中的每一個(gè)負(fù)責(zé)提供對表主機(jī)分配給自己的分區(qū)的讀和寫訪問。表服務(wù)器304、306、308、310中的每一個(gè)可以主存零個(gè)到多個(gè)分區(qū)。在圖3的示例中,TSl 304(表服務(wù)器1 304)主存分區(qū)Pl和P4,TS2 306主存分區(qū)P2和P7,TS3 308 主存分區(qū)P3,以及TS4 310主存分區(qū)P5和P6。表客戶機(jī)312被鏈接到應(yīng)用程序,并且被用來向由表服務(wù)器304、306、308、310維護(hù)的分區(qū)發(fā)出命令。表客戶機(jī)312使用分區(qū)圖來確定提供該分區(qū)的表服務(wù)器,并且它將命令發(fā)送到該表服務(wù)器。表客戶機(jī)312還從表服務(wù)器接收回結(jié)果并將它們傳遞給應(yīng)用程序。 分區(qū)圖是特殊的表,它存儲(chǔ)各分區(qū)與提供它們的表服務(wù)器之間的映射,并且由表主機(jī)302 來維護(hù)。如圖4所表示的,在內(nèi)部,在表服務(wù)器處提供的分區(qū)400包括三個(gè)主要部分更新日志402、一個(gè)到多個(gè)存儲(chǔ)器表404、以及零個(gè)到多個(gè)文件表406。更新日志402跟蹤對持久存儲(chǔ)中的分區(qū)的新近變更。存儲(chǔ)器表404是更新日志中的新近(增量)更新的存儲(chǔ)器內(nèi)版本。這些是對分區(qū)400的新近增量變更。在存儲(chǔ)器表404變得足夠大或其中具有了足夠的變更的情況下,存儲(chǔ)器表404被檢查點(diǎn)記錄(checkpoint)到持久存儲(chǔ)在存儲(chǔ)中的文件表 406。在這發(fā)生時(shí),更新日志402中的直至被檢查點(diǎn)記錄的存儲(chǔ)器表404的所有請求可以從更新日志402中移除。如上所述,分區(qū)具有存儲(chǔ)其持久狀態(tài)的一組流。更新日志402存儲(chǔ)在這些流之一中,該流被稱為更新日志流。所有文件表406被存儲(chǔ)在這些流之一中,這條流被稱為文件表流。在表服務(wù)器加載一分區(qū)時(shí),該表服務(wù)器重放更新日志中的自最新近檢查點(diǎn)以來的所有請求,以將存儲(chǔ)器表重構(gòu)回到正好在該分區(qū)被最后卸載之前的狀態(tài)。在訪問表服務(wù)器處的分區(qū)時(shí),該表服務(wù)器首先查看存儲(chǔ)器表中是否有匹配的行, 以查看所有新近的變更,并且如果沒有匹配,則在它的頁高速緩存和文件表中查找該數(shù)據(jù)。一分區(qū)可存在多個(gè)存儲(chǔ)器表和多個(gè)文件表??纱嬖诙鄠€(gè)存儲(chǔ)器表,因?yàn)樵谝粋€(gè)存儲(chǔ)器表變滿時(shí),它需要被檢查點(diǎn)記錄到文件表。在這發(fā)生時(shí),當(dāng)前存儲(chǔ)器表在被檢查點(diǎn)記錄時(shí)被設(shè)成只讀的,并為該分區(qū)創(chuàng)建新存儲(chǔ)器表以供寫入。因此,分區(qū)總是具有用于新近(增量)更新的一個(gè)存儲(chǔ)器表,并且它可以具有被懶散地進(jìn)行檢查點(diǎn)記錄的一個(gè)或多個(gè)存儲(chǔ)器表。一旦存儲(chǔ)器表被檢查點(diǎn)記錄到文件表,它可被刪除或被垃圾收集。由于對一分區(qū)做了所有檢查點(diǎn)記錄,因此該分區(qū)可存在多個(gè)文件表檢查點(diǎn)。這意味著在需要從文件表中讀取數(shù)據(jù)時(shí),可能需要查看多個(gè)文件表,并且是以從最新近到最老的次序來查看它們。這是因?yàn)樗鶎懙淖钚陆募戆摲謪^(qū)的最新近變更。在對一分區(qū)進(jìn)行檢查點(diǎn)記錄了足夠的文件表時(shí),表服務(wù)器懶散地將這些文件表壓縮/歸并在一起成為新的經(jīng)歸并的文件表,以減少為了找出一分區(qū)的被查找的數(shù)據(jù)而必須被搜索的文件表的數(shù)量??煽s放的、可用的并且持久的結(jié)構(gòu)化存儲(chǔ)本發(fā)明的各實(shí)施例采用分區(qū)劃分、負(fù)載平衡、以及扼流來提供可縮放的結(jié)構(gòu)化存儲(chǔ)系統(tǒng)??煽s放性通過以下來提供(1)將表拆分成各分區(qū)并將這些分區(qū)分布在數(shù)據(jù)中心中的多個(gè)服務(wù)器上;( 使用負(fù)載平衡來將分區(qū)從高負(fù)載的表服務(wù)器移動(dòng)到較輕負(fù)載的表服務(wù)器;以及C3)進(jìn)行扼流來丟棄對具有發(fā)送到它的過多流量的分區(qū)的請求或丟棄對具有被發(fā)送到它的過多流量的表服務(wù)器的請求。可縮放性是通過基于分區(qū)的不同部分的負(fù)載來將表自動(dòng)地拆分成各分區(qū)并隨后跨各個(gè)表服務(wù)器進(jìn)行負(fù)載平衡來提供的。負(fù)載平衡使系統(tǒng)動(dòng)態(tài)地適應(yīng)工作負(fù)載,從而將負(fù)載分布在大量機(jī)器上,從而通過高效地利用所有物理資源而達(dá)到更好的可縮放性。另外,進(jìn)行扼流保護(hù)該系統(tǒng)免于高負(fù)載,從而使該系統(tǒng)保持在高效/優(yōu)化的制度中操作。表主機(jī)通過標(biāo)識(shí)未被提供的分區(qū)、向它們分配不同的表服務(wù)器、以及更新分區(qū)圖來提供可用性,這允許表客戶機(jī)找到分區(qū)的新位置來對該分區(qū)進(jìn)行訪問。在節(jié)點(diǎn)/網(wǎng)絡(luò)故障的情況下對分區(qū)進(jìn)行快速重新分配保持了所有分區(qū)可用并且產(chǎn)生了高系統(tǒng)可用性。持久性是通過將分區(qū)數(shù)據(jù)的全部存儲(chǔ)在復(fù)制的流層中來提供的。流層提供如接口之類的文件系統(tǒng),用于向流(類似于文件)寫入數(shù)據(jù)并從流讀取數(shù)據(jù),并且流層提供用于確保數(shù)據(jù)被復(fù)制的完整功能,總是在該系統(tǒng)中的各表服務(wù)器中的任一個(gè)上持久存儲(chǔ)并可從中獲得。因此,分區(qū)信息被存儲(chǔ)在流層中,該分區(qū)信息包括分區(qū)圖、更新日志以及文件表。高效的流層操作流層提供將流的一個(gè)區(qū)域高效地硬鏈接到另一條流的能力。流層處的每一條流包括被稱為范圍的數(shù)據(jù)塊列表。該流中的數(shù)據(jù)事實(shí)上存儲(chǔ)在這些范圍內(nèi)部。流是范圍的有序列表。給定范圍可以駐留在多條流中,或甚至在同一條流的有序范圍列表中出現(xiàn)多次。流層提供接口,用于通過將駐留在一條流中的一組現(xiàn)有范圍進(jìn)行鏈接來合成另一條流。在這一過程中不涉及真實(shí)的數(shù)據(jù)復(fù)制,所以它是非常高效的。流層維護(hù)每一范圍的引用計(jì)數(shù)。一旦范圍沒有了指向它的流,則流層將從該系統(tǒng)中對這一范圍進(jìn)行垃圾收集/刪除。流層還支持在一個(gè)原子事務(wù)中具有多個(gè)流級(jí)操作的能力,如對流進(jìn)行創(chuàng)建、刪除、重命名、以及將范圍硬鏈接到流。結(jié)構(gòu)存儲(chǔ)系統(tǒng)大量使用這些特征來高效地對一分區(qū)的各條流的過時(shí)部分進(jìn)行垃圾收集。示例是一旦作出了一分區(qū)的檢查點(diǎn),更新日志中的在該檢查點(diǎn)之前的所有消息不再被使用。這些特征被用來通過原子地創(chuàng)建與更新日志流相同名稱的新流、將來自原始流的仍然使用的范圍硬鏈接到該新流、并刪除原始流,來高效地將更新日志截短。所有這些是在一個(gè)原子事務(wù)中完成的。這極大地簡化了故障處理邏輯。類似方案也被用于分區(qū)的其他流,如文件表流和元數(shù)據(jù)流。結(jié)構(gòu)化存儲(chǔ)系統(tǒng)還大量使用這些特征來高效地實(shí)現(xiàn)分區(qū)的拆分和歸并,如在稍后章節(jié)中描述的。更具體地,這些特征被用來將來自原始分區(qū)的數(shù)據(jù)高效地引用到從拆分/ 歸并創(chuàng)建的子分區(qū),而不必物理地復(fù)制或移動(dòng)任何位。對分區(qū)進(jìn)行拆分、歸并以及負(fù)載平衡本發(fā)明的一些實(shí)施例在存儲(chǔ)系統(tǒng)內(nèi)的各表服務(wù)器之間對負(fù)載分布進(jìn)行平衡。一般而言,表服務(wù)器跟蹤每一分區(qū)的負(fù)載,并且向表主機(jī)周期性地報(bào)告這一信息。表主機(jī)通過在表服務(wù)器之間移動(dòng)分區(qū)來作出負(fù)載平衡決定。這通過將目標(biāo)分區(qū)從原始表服務(wù)器卸載并將該分區(qū)分配給其他表服務(wù)器來實(shí)現(xiàn)。作為優(yōu)化,本發(fā)明的一些實(shí)施例可以使表主機(jī)在卸載分區(qū)之前或之時(shí)向表服務(wù)器發(fā)送“準(zhǔn)備卸載請求”。在接收到這一請求后,表服務(wù)器將對分區(qū)進(jìn)行檢查點(diǎn)檢查,以減少在再次加載該分區(qū)時(shí)需要重放的日志的量。提供這一點(diǎn)以滿足用于提供該分區(qū)的可用性SLA。在單個(gè)分區(qū)具有相對較高負(fù)載的情況下,將該分區(qū)拆分成兩個(gè)或更多個(gè)分區(qū)是合乎需要的,并且只有在該分區(qū)包含超過一個(gè)分區(qū)鍵值的情況下這才是可能的。因此,子分區(qū)中的一個(gè)或多個(gè)可被卸載到不同的表服務(wù)器來達(dá)到負(fù)載平衡。對于負(fù)載分布跟蹤,每一表服務(wù)器使用采樣機(jī)制來跟蹤每一分區(qū)內(nèi)的細(xì)粒度的負(fù)載信息而不消費(fèi)大量存儲(chǔ)器。為了跟蹤負(fù)載信息,分區(qū)被劃分成多個(gè)分區(qū)鍵范圍(在此稱為“桶”),并且跟蹤與每一個(gè)桶相對應(yīng)的負(fù)載。更具體地,表服務(wù)器在概率上對落入這些桶內(nèi)的請求進(jìn)行采樣,并跟蹤這些桶的負(fù)載分布。例如,參考圖2的表200內(nèi)的分區(qū)P3 214, 出于負(fù)載跟蹤目的,該分區(qū)可以被劃分成兩個(gè)桶。第一個(gè)桶將包括具有分區(qū)鍵值3的行,第二個(gè)桶將包括具有分區(qū)鍵值4和分區(qū)鍵值5的行。在各實(shí)施例中,桶邊界必須總是處于分區(qū)鍵值上。即,具有同一分區(qū)鍵值的行將總是處于同一個(gè)桶中。例如,出于負(fù)載跟蹤以及拆分的目的,具有分區(qū)鍵值3的行可被拆分成兩個(gè)桶。在一些實(shí)施例中,基于所收集的流量樣本,桶邊界可以動(dòng)態(tài)地調(diào)整以更準(zhǔn)確地跟蹤跨一分區(qū)內(nèi)的各鍵的流量分布。即,如果兩個(gè)現(xiàn)有桶與其他桶相比不具有很大負(fù)載,則它們將被歸并成單個(gè)桶;相反,如果一個(gè)桶包含比所有其他桶大得多的負(fù)載,則在可能的情況下,該桶可被拆分成兩個(gè)。例如,在先前示例中,如果第二個(gè)桶與第一個(gè)桶相比包含過多負(fù)載,則它可被拆分成兩個(gè)較小的桶,其中之一包含具有分區(qū)鍵值4的行并且其中的另一個(gè)包含具有分區(qū)鍵值5的行。此外,如果包含分區(qū)鍵值3的第一個(gè)桶具有很少負(fù)載,則它可與包含分區(qū)鍵值4的桶歸并在一起。對桶大小的這一監(jiān)視和調(diào)整全部是在進(jìn)行中動(dòng)態(tài)地完成的。除用來跟蹤跨一個(gè)分區(qū)內(nèi)的各分區(qū)鍵的負(fù)載分布的桶水平采樣方案之外,表服務(wù)器還跟蹤整個(gè)分區(qū)上的工作負(fù)載的總量。后者被傳遞給表主機(jī)。因此,在需要基于負(fù)載來拆分一分區(qū)時(shí),相當(dāng)準(zhǔn)確的負(fù)載分布信息對表服務(wù)器和表主機(jī)確定應(yīng)當(dāng)在何處拆分該分區(qū)而言都是可用的?,F(xiàn)在參考圖5,提供了示出根據(jù)本發(fā)明的一實(shí)施例的用于拆分一分區(qū)的方法500 的流程圖。在圖5的實(shí)施例中,父分區(qū)Pl被拆分成兩個(gè)子分區(qū)ΡΓ (被修改成只包括各行的子集的原始分區(qū))和P2(包括其余各行的新分區(qū))。雖然圖5討論了將一分區(qū)拆分成兩個(gè)子分區(qū),但應(yīng)當(dāng)理解,根據(jù)本發(fā)明的各實(shí)施例,一分區(qū)可被拆分成超過兩個(gè)子分區(qū)。一開始,如在框502所示,跟蹤表服務(wù)器、分區(qū)、和/或分區(qū)部分(即,“桶”)的負(fù)載分布信息。如上所述,通過在分區(qū)部分級(jí)跟蹤細(xì)粒度的負(fù)載信息,可以作出關(guān)于在何處拆分一分區(qū)的判定。負(fù)載信息由表服務(wù)器來跟蹤并被周期性地提供給表主機(jī)。在當(dāng)前實(shí)施例中,發(fā)送到表主機(jī)的負(fù)載信息包括每一分區(qū)的總負(fù)載和每一表服務(wù)器的負(fù)載。一些其他實(shí)施例可以向表主機(jī)提供所有這些負(fù)載跟蹤信息,包括桶級(jí)信息。從表服務(wù)器向表主機(jī)提供關(guān)于一分區(qū)的附加信息、約束、以及提示,以幫助進(jìn)行負(fù)載平衡和拆分決策。例如,基于桶信息的分布,表服務(wù)器可以將一分區(qū)標(biāo)記為帶有某一嚴(yán)重性程度的“難以拆分”,其中“高”意味著表主機(jī)不應(yīng)請求拆分該分區(qū),因?yàn)楸矸?wù)器不會(huì)拆分該分區(qū),其中“中”意味著在某些情況下表服務(wù)器可選擇不拆分該分區(qū)并且表主機(jī)可以不顧這一決定,并且其中“低”意味著表服務(wù)器將監(jiān)聽并采取表主機(jī)的指導(dǎo)。表主機(jī)使用該負(fù)載信息來作出負(fù)載分布決定,包括是否拆分分區(qū)、是否歸并各分區(qū)、和/或是否在表服務(wù)器之間移動(dòng)各分區(qū)。在圖5的當(dāng)前實(shí)施例中,表主機(jī)基于負(fù)載分布信息確定要拆分一分區(qū)(Pl),如在框504所示。在框506,表主機(jī)確定用于拆分該分區(qū)的拆分比率。拆分比率表示用于確定應(yīng)當(dāng)在其中拆分該分區(qū)的位置的負(fù)載比率。例如,表主機(jī)可以決定在30% /70%負(fù)載點(diǎn)處拆分一分區(qū)。換言之,該分區(qū)應(yīng)在以下點(diǎn)處拆分該分區(qū)第一部分的負(fù)載是30%并且該分區(qū)其余部分的負(fù)載是70%。在框508,表主機(jī)向主存被標(biāo)識(shí)來拆分的分區(qū)的表服務(wù)器發(fā)送請求。 具體而言,表主機(jī)請求指定與該分區(qū)中的拆分比率相對應(yīng)的位置的鍵信息。響應(yīng)于該請求, 表服務(wù)器基于拆分比率來標(biāo)識(shí)用于拆分該分區(qū)的實(shí)際分區(qū)鍵位置,如在框510所示。該實(shí)際位置嘗試與拆分比率所指定的負(fù)載分布相匹配,但實(shí)際負(fù)載分布可能不同。例如,表主機(jī)所請求的拆分比率可以是30% /70%負(fù)載分布,但可以提供的最接近的匹配是35% /65% 負(fù)載分布。在一些實(shí)施例中,用于拆分的實(shí)際位置是使用分區(qū)鍵信息來標(biāo)識(shí)的。例如,如果圖 2的分區(qū)P3 214要在分區(qū)鍵值3和4之間進(jìn)行拆分,則標(biāo)識(shí)該拆分的鍵信息可以是分區(qū)鍵值3和/或分區(qū)鍵值4。任何及所有這樣的變型都被構(gòu)想為落在本發(fā)明的各實(shí)施例的范圍內(nèi)。表服務(wù)器將拆分比率的鍵信息返回給表主機(jī),如在框512所示。表主機(jī)構(gòu)造作為子分區(qū)之一的新分區(qū)(P2)的流,如在框514所示。分區(qū)的所有持久狀態(tài)都保持在該分區(qū)的“流”中。存在該分區(qū)的元數(shù)據(jù)流,它包含到該分區(qū)的所有其他流的指針以及該分區(qū)的必要信息,該必要信息諸如是該分區(qū)中包括的所有行的分區(qū)鍵范圍。 在該步驟中,表主機(jī)負(fù)責(zé)使用對應(yīng)于拆分比率的正確的分區(qū)鍵范圍信息來創(chuàng)建新分區(qū)(P2) 的元數(shù)據(jù)流。另外,在框516,表主機(jī)將拆分請求發(fā)送到表服務(wù)器。該拆分請求可以在下一心跳中從表主機(jī)提供給表服務(wù)器。在一些實(shí)施例中,寫下適當(dāng)?shù)闹魅罩疽蕴幚砉收?。表主機(jī)在每一步驟完成之后記錄該對應(yīng)步驟,使得在主機(jī)故障的情況下,這些日志可被重放并且表主機(jī)可以從它停止的地方繼續(xù)進(jìn)行拆分。在接收到拆分請求之后,表服務(wù)器停止提供原始分區(qū)并卸載原始分區(qū)(Pl),如在框518所示。表服務(wù)器還從該原始分區(qū)中構(gòu)建兩個(gè)子分區(qū)(ΡΓ和P2),如在框520所示。 表服務(wù)器基于原始分區(qū)(Pl)中的信息來構(gòu)造新分區(qū)(P2)的流(除了元數(shù)據(jù)流之外)。更具體地,使用底層流層的特征,屬于P2的鍵范圍的數(shù)據(jù)部分將從分區(qū)Pl高效地被復(fù)制/硬鏈接到分區(qū)P2的流。子分區(qū)ΡΓ是通過調(diào)整Pl的鍵范圍來“創(chuàng)建”的。子分區(qū)ΡΓ使用與原始分區(qū)Pl相同的一組流。改變?chǔ)宝5脑獢?shù)據(jù)以調(diào)整到該減少的鍵范圍。如在框522所示,表服務(wù)器加載這兩個(gè)子分區(qū)(ΡΓ和P2)并開始提供這些分區(qū)。 另外,表服務(wù)器向表主機(jī)通知拆分已完成,如在框5M所示。這一通知可以在下一心跳中從表服務(wù)器提供給表主機(jī)。響應(yīng)于來自表服務(wù)器的拆分完成通知,表主機(jī)更新分區(qū)圖以反映新分區(qū),如在框5 所示。此時(shí),表主機(jī)可以認(rèn)為拆分已完成。表主機(jī)向表服務(wù)器發(fā)送包括新創(chuàng)建的子分區(qū)(P》的新分配,使得它與分區(qū)圖相匹配,如在框5 所示。在一些實(shí)施例中,在拆分了一分區(qū)之后,表主機(jī)可以確定將子分區(qū)從原始分區(qū)所處的表服務(wù)器移動(dòng)到另一表服務(wù)器。這允許表主機(jī)將負(fù)載高效地分布在整個(gè)網(wǎng)絡(luò)上。分區(qū)移動(dòng)是通過將分區(qū)從一個(gè)表服務(wù)器卸載并隨后將它分配給另一表服務(wù)器來實(shí)現(xiàn)的。在本發(fā)明的其他實(shí)施例中,以上參考圖5描述的拆分協(xié)議的性能可以通過在框 518處卸載原始分區(qū)之前創(chuàng)建新子分區(qū)來改進(jìn)。對本領(lǐng)域技術(shù)人員而言,上述方法500的其他變型也顯而易見并且處于本發(fā)明各實(shí)施例的范圍內(nèi)。圖6示出根據(jù)本發(fā)明的一實(shí)施例的對圖2的P3 214進(jìn)行拆分的示例。具體而言, 圖6示出圖3的表主機(jī)(TM) 302與TS3 308 (表服務(wù)器3 308)之間的用于執(zhí)行P3 214的拆分的交互,其中P3 214駐留在TS3 308上。一開始,如在602所示,表主機(jī)302向TS3 308 發(fā)送查詢鍵信息的請求以標(biāo)識(shí)拆分P3 214的位置。該請求指定0.3拆分比率,指示表主機(jī)希望在接收到P3 214上的負(fù)載的30%的P3 214的一部分與接收到該負(fù)載的70%的剩余部分之間的位置處拆分P3 214。響應(yīng)于來自表主機(jī)302的請求,TS3 308確定與表主機(jī)302所指定的拆分比率相對應(yīng)的鍵信息。該鍵信息基于被表主機(jī)302指定為拆分比率的30% /70%負(fù)載分布來表示 P3 214的兩部分之間的位置。在本示例中,TS3 308確定具有分區(qū)鍵值3的行上的負(fù)載大約具有負(fù)載的30%,而其余行上的負(fù)載大約具有負(fù)載的70%。如此,在本示例中,TS3 308 所確定的鍵信息是分區(qū)鍵值4。應(yīng)當(dāng)理解,在各實(shí)施例中,可以提供其他鍵信息來標(biāo)識(shí)應(yīng)當(dāng)在其中拆分P3 214的位置。在606,TS3 214將鍵信息(即,分區(qū)鍵值4)傳遞給表主機(jī)302。在608,表主機(jī) 302構(gòu)造新分區(qū)PN的流。另外,如在框610所示,表主機(jī)302將拆分請求發(fā)送到表主機(jī)。在本示例中,拆分請求指定子分區(qū)中的每一個(gè)的范圍。具體而言,對于一個(gè)子分區(qū)P3’,拆分請求指定低分區(qū)鍵值3和高分區(qū)鍵值4,從而指示P3’包括具有分區(qū)鍵值3的行。對于另一子分區(qū)PN,拆分請求指示低分區(qū)鍵值4和高分區(qū)鍵值6,從而指示PN包括具有分區(qū)鍵值4的行以及具有分區(qū)鍵值5的行。在612,基于拆分請求,TS3停止提供原始分區(qū)P3 214。另外,TS3 308將P3拆分成P3,和PN,如在614所示,并開始提供P3,和PN,如在616所示。TS3 308隨后向表主機(jī) 302發(fā)送拆分完成通知,如在618所示。在620,表主機(jī)302更新分區(qū)圖以反映子分區(qū)。
現(xiàn)在轉(zhuǎn)向圖7,提供了示出根據(jù)本發(fā)明的另一實(shí)施例的用于拆分一分區(qū)的方法 700的流程圖。在圖7的實(shí)施例中,父分區(qū)Pl被拆分成兩個(gè)新子分區(qū)P2和P3,其中每一子分區(qū)包括來自父分區(qū)Pl的各行的一部分。雖然圖7討論了將一分區(qū)拆分成兩個(gè)子分區(qū),但應(yīng)當(dāng)理解,根據(jù)本發(fā)明的各實(shí)施例,一分區(qū)可被拆分成超過兩個(gè)子分區(qū)。與圖5的方法500類似,一開始跟蹤負(fù)載分布信息,如在框702所示。該負(fù)載分布信息允許表主機(jī)作出負(fù)載分布決定,包括是否拆分一分區(qū)、是否歸并各分區(qū)、和/或是否在表服務(wù)器之間移動(dòng)各分區(qū)。在圖7的當(dāng)前實(shí)施例中,表主機(jī)基于負(fù)載分布信息確定要拆分一分區(qū)(Pl),如在框704所示。在框706,表主機(jī)確定用于拆分該分區(qū)的拆分比率。如上所述,拆分比率表示用于確定應(yīng)當(dāng)在其中拆分該分區(qū)的位置的負(fù)載比率。例如,表主機(jī)可以決定在30% /70%負(fù)載點(diǎn)處拆分一分區(qū)。在框708,表主機(jī)向主存被標(biāo)識(shí)來拆分的分區(qū)的表服務(wù)器發(fā)送請求。具體而言,表主機(jī)請求指定與該分區(qū)中的拆分比率相對應(yīng)的位置的鍵信息。響應(yīng)于該請求,表服務(wù)器基于拆分比率來標(biāo)識(shí)用于拆分該分區(qū)的實(shí)際位置,如在框710所示。表服務(wù)器將拆分比率的鍵信息返回給表主機(jī),如在框712所示。表主機(jī)構(gòu)造新分區(qū)(P2和P3)的元數(shù)據(jù)流,如在框714所示。在一些實(shí)施例中,寫下適當(dāng)?shù)闹魅罩疽蕴幚砉收稀1碇鳈C(jī)在每一步驟完成之后記錄該對應(yīng)步驟,使得在主機(jī)故障的情況下,這些日志可被重放并且表主機(jī)可以從它停止的地方繼續(xù)進(jìn)行拆分。另外,在框 716,表主機(jī)將拆分請求發(fā)送到表服務(wù)器。該拆分請求可以在下一心跳中從表主機(jī)提供給表服務(wù)器。響應(yīng)于該拆分請求,表服務(wù)器從原始分區(qū)(Pl)中構(gòu)建兩個(gè)子分區(qū)(P2和P3),如在框718所示。表服務(wù)器基于原始分區(qū)(Pl)來構(gòu)造新分區(qū)(P2和P3)的流(除了元數(shù)據(jù)流之外)。更具體地,使用底層流層的特征,屬于P2的鍵范圍的數(shù)據(jù)部分將從分區(qū)Pl高效地復(fù)制/硬鏈接到分區(qū)P2的流。類似地,使用底層流層的相同特征,屬于P3的鍵范圍的數(shù)據(jù)部分將從分區(qū)Pl高效地復(fù)制/硬鏈接到分區(qū)P3的流。表服務(wù)器停止提供原始分區(qū)并卸載原始分區(qū)(Pl),如在框720所示。另外,如在框722所示,表服務(wù)器加載這兩個(gè)子分區(qū)(P2和P; )并開始提供這些分區(qū)。表服務(wù)器向表主機(jī)通知拆分已完成,如在框7M所示。這一通知可以在下一心跳中從表服務(wù)器提供給表主機(jī)。響應(yīng)于來自表服務(wù)器的拆分完成通知,表主機(jī)更新分區(qū)圖以反映新分區(qū),如在框726 所示。此時(shí),表主機(jī)可以認(rèn)為拆分已完成。表主機(jī)向表服務(wù)器發(fā)送包括新創(chuàng)建的子分區(qū)(P2 和P; )的新分配,使得它與分區(qū)圖相匹配,如在框7 所示。在一些情況下,表主機(jī)可以基于例如負(fù)載分布信息來確定將兩個(gè)或更多個(gè)分區(qū)歸并成單個(gè)分區(qū)。在一實(shí)施例中,歸并是在兩個(gè)相鄰分區(qū)(即,在表中的行序列中相鄰)具有相對低的負(fù)載時(shí)執(zhí)行的。將各分區(qū)歸并成單個(gè)分區(qū)有益于減少系統(tǒng)中分區(qū)的數(shù)量。因此,圖8提供示出根據(jù)本發(fā)明的一實(shí)施例的用于歸并各分區(qū)的方法800的流程圖。如在框802所示,一開始跟蹤負(fù)載分布信息?;谠撠?fù)載分布信息,表主機(jī)確定兩個(gè)分區(qū)(Pl和P2)應(yīng)被歸并成新分區(qū)(P3),如在框804所示。在各實(shí)施例中,只有形成連續(xù)且未脫節(jié)的分區(qū)鍵范圍的分區(qū)才能被歸并。在表主機(jī)決定歸并兩個(gè)分區(qū)時(shí),表主機(jī)向提供這兩個(gè)分區(qū)的(諸)表服務(wù)器發(fā)送 (諸)‘準(zhǔn)備歸并’消息,如在框806所示。在一些情況下,這兩分區(qū)可駐留在單個(gè)表服務(wù)器上,而在其他情況下,這些分區(qū)可以駐留在不同的表服務(wù)器上?!疁?zhǔn)備歸并’消息向表服務(wù)器給出了在歸并之前對分區(qū)進(jìn)行壓縮以減少經(jīng)歸并的分區(qū)的加載時(shí)間的機(jī)會(huì)。在框808,表主機(jī)創(chuàng)建經(jīng)歸并的分區(qū)(P3)的元數(shù)據(jù)流,并且在框810,將兩個(gè)父分區(qū)$1和1^)從這些父分區(qū)所處的(諸)表服務(wù)器上卸載。表主機(jī)隨后更新分區(qū)圖(原子地移除舊分區(qū)條目,并插入新分區(qū)條目),如在框812所示。從表主機(jī)的觀點(diǎn)來看,歸并事務(wù)在此時(shí)完成,因?yàn)樵诒碇鳈C(jī)故障的情況下,新歸并的分區(qū)將在引導(dǎo)期間在持久存儲(chǔ)的分區(qū)圖中找到。表主機(jī)將經(jīng)歸并的分區(qū)(P3)分配給表服務(wù)器,如在框814所示。向其分配經(jīng)歸并的分區(qū)的表服務(wù)器可以是系統(tǒng)中的任何表服務(wù)器。例如,所分配的表服務(wù)器可以是父分區(qū)之一或兩者所處的表服務(wù)器或可以是系統(tǒng)中的不同的表服務(wù)器。在分配之后,表服務(wù)器加載經(jīng)歸并的分區(qū),如在框816所示。從經(jīng)歸并的分區(qū)的元數(shù)據(jù)流中,表服務(wù)器獲知這是經(jīng)歸并的分區(qū),并且它通過使用來自底層流層的特征來高效地復(fù)制/硬鏈接來自父分區(qū)的數(shù)據(jù)來從父分區(qū)構(gòu)造該經(jīng)歸并的分區(qū)的流。在構(gòu)造完成之后,表服務(wù)器將這一事件記錄在經(jīng)歸并的分區(qū)的元數(shù)據(jù)流中(以便下一次加載這一分區(qū)時(shí),這些流將不會(huì)被再次構(gòu)造),并刪除父分區(qū)的流。從破壞的分區(qū)狀態(tài)恢復(fù)持久的結(jié)構(gòu)化存儲(chǔ)系統(tǒng)應(yīng)當(dāng)能夠從系統(tǒng)狀態(tài)的隱錯(cuò)中恢復(fù)。為了實(shí)現(xiàn)這一能力, 本發(fā)明的一實(shí)施例中的結(jié)構(gòu)化存儲(chǔ)系統(tǒng)是構(gòu)建在只可添加的存儲(chǔ)上的,并且將所有已刪除數(shù)據(jù)保留到被認(rèn)為足以發(fā)現(xiàn)系統(tǒng)中的任何錯(cuò)誤的最小長度的時(shí)間?,F(xiàn)在參考圖9,提供了示出根據(jù)本發(fā)明的一實(shí)施例的用于將一分區(qū)從破壞的分區(qū)狀態(tài)中恢復(fù)的方法900的流程圖。最初,如在框902所示,標(biāo)識(shí)破壞的分區(qū)。如果分區(qū)被破壞并且不能被提供,則發(fā)出警報(bào),從而將該分區(qū)標(biāo)記為未被提供。這可造成對該分區(qū)中的數(shù)據(jù)的可用性的臨時(shí)丟失。如在框904所示,將破壞的分區(qū)恢復(fù)到一致的分區(qū)狀態(tài)。系統(tǒng)可以從下述兩項(xiàng)中任選其一 (a)修復(fù)該分區(qū),因?yàn)閷υ摲謪^(qū)的所有先前改變已被存儲(chǔ)在只可添加的存儲(chǔ)中, 這將在不丟失任何數(shù)據(jù)的情況下恢復(fù)該分區(qū);或(b)將該分區(qū)回退到先前數(shù)據(jù)段,這可能造成在回退到的時(shí)間與故障的時(shí)間之間發(fā)生的改變的丟失。一旦修復(fù)了分區(qū),則該分區(qū)可再次用來被提供,以供讀出和寫入結(jié)構(gòu)化數(shù)據(jù)。在分區(qū)回退期間,該系統(tǒng)找出仍然處于有效狀態(tài)的最新近的檢查點(diǎn),并使用該檢查點(diǎn)連同對應(yīng)的日志(如果它們?nèi)匀淮嬖?來重建分區(qū)狀態(tài)。在一些情況下,在分區(qū)回退期間,該分區(qū)的當(dāng)前元數(shù)據(jù)和數(shù)據(jù)內(nèi)容不足以恢復(fù)分區(qū)狀態(tài)。在這些情況下,該系統(tǒng)使用來自其他相關(guān)分區(qū)的數(shù)據(jù),包括在涉及目標(biāo)分區(qū)的最新近拆分或歸并期間的該目標(biāo)分區(qū)的父分區(qū)。更具體地,該系統(tǒng)通過歸并來自父分區(qū)和目標(biāo)分區(qū)的最新近的有效檢查點(diǎn)的狀態(tài)來重構(gòu)分區(qū)的狀態(tài)。在恢復(fù)或重建了所有分區(qū)之后,修訂分區(qū)圖來匹配經(jīng)重構(gòu)系統(tǒng)中的所有分區(qū)的鍵范圍,如在框906所示。這將系統(tǒng)帶回到全局一致的狀態(tài)。分區(qū)版本化和升級(jí)在執(zhí)行表服務(wù)器代碼的升級(jí)時(shí),一次只對表服務(wù)器的一個(gè)子集執(zhí)行該升級(jí)。如此, 表服務(wù)器被分成N個(gè)升級(jí)域,并且可以一次升級(jí)一個(gè)升級(jí)域。
參考圖10,提供了示出根據(jù)本發(fā)明的一實(shí)施例的用于在升級(jí)期間進(jìn)行分區(qū)版本化的方法1000的流程圖。如在框1002所示,在升級(jí)過程期間,分區(qū)可以從接下來要被升級(jí)的目標(biāo)升級(jí)域內(nèi)的表服務(wù)器移出。將新表服務(wù)器代碼版本部署到該目標(biāo)升級(jí)域內(nèi)的表服務(wù)器,如在框1004所示。在升級(jí)過程期間,可將分區(qū)分配給具有新表服務(wù)器代碼版本的表服務(wù)器,并且開始用可能新的數(shù)據(jù)格式來修改該分區(qū),如在框1006所示。在這一修改之后,分區(qū)可只由較新升級(jí)的表服務(wù)器來提供,并且可不由較老版本表服務(wù)器來提供。如此,一旦版本N的表服務(wù)器提供了一分區(qū),則該系統(tǒng)確保分區(qū)只由版本N或更加新的版本(或其他兼容的表服務(wù)器版本)的表服務(wù)器來提供,如在框1008所示。在本發(fā)明的各實(shí)施例的范圍內(nèi),這可以用多種不同方式來實(shí)現(xiàn)。例如,在一個(gè)實(shí)施例中,跟蹤每一分區(qū)、表服務(wù)器和表主機(jī)的版本號(hào)。在升級(jí)發(fā)生時(shí),如果提供該分區(qū)的表服務(wù)器是較高版本號(hào),則該分區(qū)采用該版本號(hào)。自此時(shí)起,該分區(qū)可以只由該版本或更高版本的表服務(wù)器來提供。在另一實(shí)施例中,每一表服務(wù)器一經(jīng)升級(jí),該表服務(wù)器就與表主機(jī)進(jìn)行通信以指示它的版本。表主機(jī)跟蹤最新表服務(wù)器版本,并且待分配的分區(qū)可只被分配給具有最新版本(或其他兼容版本)的表服務(wù)器。在又一實(shí)施例中,分區(qū)版本與分區(qū)元數(shù)據(jù)一起持久存儲(chǔ)。表服務(wù)器將分配給它們的分區(qū)的版本通知給表主機(jī)。表服務(wù)器還向表主機(jī)報(bào)告它們自己的版本號(hào)。表主機(jī)從而保持跟蹤分區(qū)版本以及表服務(wù)器版本。以此方式,表主機(jī)確保分區(qū)可被分配給兼容版本的表服務(wù)器。結(jié)論參考各具體實(shí)施例描述了本發(fā)明,各具體實(shí)施例在所有方面都旨在是說明性的而非限制性的。在不偏離本發(fā)明范圍的情況下,各替換實(shí)施例對于本發(fā)明所屬領(lǐng)域的技術(shù)人員將變得顯而易見。從前面的描述可以看出,本發(fā)明很好地適用于實(shí)現(xiàn)上文所闡述的所有目的和目標(biāo),并且具有對于該系統(tǒng)和方法是顯而易見且固有的其他優(yōu)點(diǎn)。也可理解特定的特征和子組合是有用的,并且可以加以利用而無需參考其他特征和子組合。這由權(quán)利要求所構(gòu)想的, 并在權(quán)利要求的范圍內(nèi)。
權(quán)利要求
1.一種由結(jié)構(gòu)化存儲(chǔ)系統(tǒng)內(nèi)的一個(gè)或多個(gè)計(jì)算設(shè)備實(shí)現(xiàn)的方法,其中結(jié)構(gòu)化存儲(chǔ)由一個(gè)或多個(gè)表來表示,每一個(gè)表包括多個(gè)行,每一行表示由所述結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在所述多個(gè)分區(qū)之間劃分所述多個(gè)行,每一分區(qū)包括來自所述表內(nèi)的多個(gè)行中的一定范圍的行,其中所述多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對所述多個(gè)表服務(wù)器的分區(qū)分配,所述方法用于將一分區(qū)拆分成各子分區(qū),并且包括基于分區(qū)的負(fù)載信息來標(biāo)識(shí)(504)要拆分的分區(qū),其中所述負(fù)載信息包括指定該分區(qū)中的兩個(gè)或更多個(gè)部分中的每一個(gè)部分上的負(fù)載的信息;由所述表主機(jī)基于所述分區(qū)的兩個(gè)或更多個(gè)部分中的每一個(gè)部分上的負(fù)載來確定 (506)用于拆分所述分區(qū)的拆分比率;查詢(508)所述表服務(wù)器以尋找指示所述分區(qū)內(nèi)的與所述分區(qū)比率相對應(yīng)的實(shí)際位置的鍵信息;在所述表主機(jī)處從所述表服務(wù)器接收(510)鍵信息,所述鍵信息指示所述分區(qū)內(nèi)的與所述拆分比率相對應(yīng)的實(shí)際位置;從所述表主機(jī)向所述表服務(wù)器發(fā)送(516)拆分請求,所述拆分請求指示基于所述鍵信息來拆分所述分區(qū);在與所述鍵信息相對應(yīng)的位置處拆分(518、520、52幻所述分區(qū)以創(chuàng)建所述子分區(qū);向所述表主機(jī)通知(524)拆分已完成;以及基于被拆分成所述子分區(qū)的分區(qū)來更新(526)分區(qū)圖,所述分區(qū)圖存儲(chǔ)所述多個(gè)分區(qū)與提供所述多個(gè)分區(qū)的多個(gè)表服務(wù)器之間的映射。
2.如權(quán)利要求1所述的方法,其特征在于,該方法還包括在所述表主機(jī)處構(gòu)造所述子分區(qū)中的至少一個(gè)的流。
3.如權(quán)利要求1所述的方法,其特征在于,拆分所述分區(qū)包括停止從所述表服務(wù)器提供所述分區(qū);從所述分區(qū)構(gòu)建所述子分區(qū);以及從所述表服務(wù)器加載并提供所述子分區(qū),其中停止提供所述分區(qū)包括為所述分區(qū)創(chuàng)建檢查點(diǎn),從而減少在分區(qū)重載期間要重放的日志的量,其中創(chuàng)建所述分區(qū)的檢查點(diǎn)包括在檢查點(diǎn)期間通過原子地執(zhí)行以下步驟來高效地截短日志流創(chuàng)建新日志流,將所述檢查點(diǎn)之后的范圍從舊日志流硬鏈接到所述新日志流,刪除所述舊日志流,以及將所述新日志流重命名成所述舊日志流的名稱。
4.如權(quán)利要求3所述的方法,其特征在于,從所述分區(qū)構(gòu)建所述子分區(qū)包括通過在沒有昂貴的數(shù)據(jù)復(fù)制的情況下原子地硬鏈接來自所述分區(qū)的流的范圍來高效地構(gòu)造所述子分區(qū)的流。
5.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括將所述子分區(qū)中的至少一個(gè)分配給第二表服務(wù)器,并且更新所述分區(qū)圖以指示所述子分區(qū)中的該至少一個(gè)位于該第二表服務(wù)器處。
6.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括出于負(fù)載監(jiān)視目的,基于所述負(fù)載信息通過歸并或拆分所述分區(qū)的兩個(gè)或更多個(gè)部分的至少一個(gè)子集來調(diào)整所述分區(qū)的該兩個(gè)或更多個(gè)部分的邊界。
7.一個(gè)或多個(gè)存儲(chǔ)用于執(zhí)行一種方法的計(jì)算機(jī)可使用指令的計(jì)算機(jī)存儲(chǔ)介質(zhì),所述方法用于管理由一個(gè)或多個(gè)表來表示的結(jié)構(gòu)化存儲(chǔ)系統(tǒng),每一個(gè)表包括多個(gè)行,每一行表示由所述結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在多個(gè)分區(qū)之間劃分所述多個(gè)行,每一分區(qū)包括來自所述表內(nèi)的多個(gè)行中的一定范圍的行,其中所述多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對所述多個(gè)表服務(wù)器的分區(qū)分配,所述方法用于將所述表的至少兩個(gè)分區(qū)歸并成經(jīng)歸并的分區(qū),并且包括跟蹤(80 所述多個(gè)表服務(wù)器上的多個(gè)分區(qū)的負(fù)載信息;由所述表主機(jī)基于所述負(fù)載信息來標(biāo)識(shí)(804)要?dú)w并的至少兩個(gè)分區(qū);由所述表主機(jī)創(chuàng)建(808)經(jīng)歸并的分區(qū)的元數(shù)據(jù)流;將所述至少兩個(gè)分區(qū)從提供該至少兩個(gè)分區(qū)的至少一個(gè)表服務(wù)器上卸載(810);由所述表主機(jī)將所述經(jīng)歸并的分區(qū)分配給(814)來自所述多個(gè)表服務(wù)器的所選表服務(wù)器;以及在所選表服務(wù)器處加載并提供(816)所述經(jīng)歸并的分區(qū)。
8.如權(quán)利要求7所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所述至少兩個(gè)分區(qū)被存儲(chǔ)在同一表服務(wù)器上。
9.如權(quán)利要求7所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所選表服務(wù)器包括在所述至少兩個(gè)分區(qū)被歸并成所述經(jīng)歸并的分區(qū)之前在其上駐留有該至少兩個(gè)分區(qū)中的至少一個(gè)分區(qū)的表服務(wù)器。
10.如權(quán)利要求7所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所述方法還包括基于被歸并成所述經(jīng)歸并的分區(qū)的所述至少兩個(gè)分區(qū)來更新分區(qū)圖,所述分區(qū)圖存儲(chǔ)所述多個(gè)分區(qū)與提供所述多個(gè)分區(qū)的多個(gè)表服務(wù)器之間的映射。
11.如權(quán)利要求7所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所述方法還包括從所述表主機(jī)向提供所述至少兩個(gè)分區(qū)的至少一個(gè)表服務(wù)器發(fā)送準(zhǔn)備歸并消息,其中所述準(zhǔn)備歸并消息使得所述至少一個(gè)表服務(wù)器在歸并所述至少兩個(gè)分區(qū)之前壓縮該至少兩個(gè)分區(qū)以減少所述經(jīng)歸并的分區(qū)的加載時(shí)間。
12.—個(gè)或多個(gè)存儲(chǔ)用于執(zhí)行一種方法的計(jì)算機(jī)可使用指令的計(jì)算機(jī)存儲(chǔ)介質(zhì),所述方法用于管理由一個(gè)或多個(gè)表來表示的結(jié)構(gòu)化存儲(chǔ)系統(tǒng),每一個(gè)表包括多個(gè)行,每一行表示由所述結(jié)構(gòu)化存儲(chǔ)系統(tǒng)存儲(chǔ)的數(shù)據(jù)實(shí)體并且包括用于標(biāo)識(shí)該行的一個(gè)或多個(gè)鍵,在多個(gè)分區(qū)之間劃分所述多個(gè)行,每一分區(qū)包括來自所述表內(nèi)的多個(gè)行中的連續(xù)范圍的行,其中所述多個(gè)分區(qū)存儲(chǔ)在多個(gè)表服務(wù)器上,并且其中表主機(jī)控制對所述多個(gè)表服務(wù)器的分區(qū)分配,所述方法用于將所述表的一分區(qū)拆分成至少兩個(gè)子分區(qū),并且包括跟蹤(70 所述多個(gè)表服務(wù)器上的多個(gè)分區(qū)的負(fù)載信息;由所述表主機(jī)基于所述負(fù)載信息來標(biāo)識(shí)(704)要拆分所述分區(qū),其中所述分區(qū)的負(fù)載信息標(biāo)識(shí)該分區(qū)的不同部分上的不同負(fù)載;在所述表主機(jī)處確定(706)用于拆分所述分區(qū)的拆分比率,其中所述拆分比率是基于負(fù)載信息來指定的并且表示所述分區(qū)中的點(diǎn),在該點(diǎn)處所述分區(qū)的第一部分包括第一負(fù)載量并且所述分區(qū)的第二部分包括第二負(fù)載量;從所述表主機(jī)向所述表服務(wù)器發(fā)送(708)請求,該對鍵信息的請求標(biāo)識(shí)所述分區(qū)中的與所述拆分比率相對應(yīng)的實(shí)際位置;由所述表服務(wù)器確定(710)標(biāo)識(shí)所述分區(qū)內(nèi)的與所述分區(qū)比率相對應(yīng)的實(shí)際位置的鍵信息;將所述鍵信息從所述表服務(wù)器傳遞給(71 所述表主機(jī); 在所述表主機(jī)處構(gòu)造(714)所述子分區(qū)中的每一個(gè)子分區(qū)的元數(shù)據(jù)流; 將拆分請求從所述表主機(jī)發(fā)送到(716)所述表服務(wù)器; 在所述表服務(wù)器處從所述分區(qū)構(gòu)建(718)所述子分區(qū); 停止(720)在所述表服務(wù)器處提供所述分區(qū); 在所述表服務(wù)器處加載并提供(72 所述子分區(qū); 將拆分已完成通知從所述表服務(wù)器發(fā)送到(724)所述表主機(jī);以及基于被拆分成所述子分區(qū)的分區(qū)來更新(726)分區(qū)圖,所述分區(qū)圖存儲(chǔ)所述多個(gè)分區(qū)與提供所述多個(gè)分區(qū)的多個(gè)表服務(wù)器之間的映射。
13.如權(quán)利要求12所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所述方法還包括將所述子分區(qū)中的至少一個(gè)分配給第二表服務(wù)器;并且更新所述分區(qū)圖以指示所述子分區(qū)中的該至少一個(gè)位于該第二表服務(wù)器處。
14.如權(quán)利要求12所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,停止提供所述分區(qū)包括為所述分區(qū)創(chuàng)建檢查點(diǎn),從而減少在分區(qū)重載期間要重放的日志的量,其中創(chuàng)建所述分區(qū)的檢查點(diǎn)包括在檢查點(diǎn)期間通過原子地執(zhí)行以下步驟來高效地截短日志流創(chuàng)建新日志流,將在所述檢查點(diǎn)之后的范圍從舊日志流硬鏈接到所述新日志流,刪除所述舊日志流,以及將所述新日志流重命名成所述舊日志流的名稱。
15.如權(quán)利要求12所述的一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,從所述分區(qū)構(gòu)建所述子分區(qū)包括通過在沒有昂貴的數(shù)據(jù)復(fù)制的情況下原子地硬鏈接來自所述分區(qū)的流的范圍來高效地構(gòu)造所述子分區(qū)的流。
全文摘要
提供了用于可縮放的結(jié)構(gòu)化存儲(chǔ)系統(tǒng)的分區(qū)管理。該存儲(chǔ)系統(tǒng)提供有一個(gè)或多個(gè)表來表示的存儲(chǔ),這些表中的每一個(gè)包括表示數(shù)據(jù)實(shí)體的行。表被分成多個(gè)分區(qū),每一分區(qū)包括連續(xù)范圍的行。各分區(qū)由表服務(wù)器提供并且由表主機(jī)來管理。跟蹤表服務(wù)器和分區(qū)的負(fù)載分布信息,并且表主機(jī)基于該負(fù)載分布信息來確定要拆分和/或歸并各分區(qū)。
文檔編號(hào)G06F15/16GK102197372SQ200980142662
公開日2011年9月21日 申請日期2009年10月23日 優(yōu)先權(quán)日2008年10月24日
發(fā)明者A·E·紹爾斯沃德, B·G·卡爾德, D·巴德瓦杰, J·王, N·尼拉康特恩, S·斯里瓦斯塔瓦 申請人:微軟公司