合的并集來全局確定節(jié)點分類概率分布。這一方式具有更高 算法成本并且可能在退化情況下造成偽(spurious)數(shù)據(jù)迀移。在一些實施例中,原先可以 針對位置層級的最低級(諸如具體盤)計算親和性,并且因此避免貫穿子位置的任何迭代。
[0074] 盡管統(tǒng)計方法可以指示一些對象針對一個特定位置具有極端親和性,但是對于負 載平衡和容錯而言希望避免過于強烈的偏置。任何這樣的調(diào)整不應(yīng)改變按照優(yōu)先的位置排 序并且應(yīng)當總是引向均勻分布。對于引向均勻分布的強度而言希望隨著偏置的強度增加。 具有這些性質(zhì)的一種系統(tǒng)如下: (1)系統(tǒng)將d維概率矢量釋為(tM)單形(simplex)中的點。
[0075] (2)(心1)單形的質(zhì)心是
。這也代表均勻概率分布。
[0076] (3)將優(yōu)先矢量計算為7? =G矢量球和為0,因而將不由添加的任何倍 數(shù)而違反M和為1這一重要性質(zhì)。如果施]所有項是〇 (也就是說產(chǎn)=0,則未完成縮 放。系統(tǒng)取產(chǎn)=餅且計算完成。
[0077] (4)發(fā)現(xiàn)最大k,使得M+漢E所有非負概率的可行區(qū)域中。這可以通過發(fā)現(xiàn)最 小A使得
來完成。然后
[0078] (5)在k給定時計算最大不公平(unfair)矢量
[0079] (6)在縮放函數(shù)0U)(該函數(shù)根據(jù)不公平度比提供標量系數(shù))給定時,計算最終調(diào) 整的概率矢量:
縮放函數(shù)Q(x)應(yīng)當具有域和范圍[0,1]。對于低輸入,所需輸出在1附近,因為很少 鼓勵忽略弱偏置。當輸入在1附近時,輸出根據(jù)存在于集群中的節(jié)點總數(shù)應(yīng)當更小。在 (對于n個位置的集群)附近的最大輸出提供在性能和可靠性的沖突需要之間的恰當平衡。 由于對于更低輸入而言希望保持與它們的原始值接近,所以縮放函數(shù)應(yīng)當非線性。一個具 有這些性質(zhì)的縮放函數(shù)是
這一要求然后迫使
[0080] 在來自[0061]的例子中(見[0058]以及下文等等),如果文件存儲于洛杉磯、紐 約、倫敦或者東京的設(shè)施之一終,則發(fā)現(xiàn)如下親和性矢量,該矢量指示每次訪問的平均成 本:
通過取矢量中的每個元素的倒數(shù)并且然后將所得元素除以所有結(jié)果之和來發(fā)現(xiàn)所得 概率矢量,使得矢量現(xiàn)在求和為1 :
然后調(diào)整矢量以求更佳分布:
由于倫敦位置具有最高概率,所以假設(shè)已經(jīng)隨機選擇它。如果倫敦位置包含三個節(jié)點 (應(yīng)當^的時間選擇其中之一并且應(yīng)當i的時間選擇每個其他節(jié)點),則形成用于這些節(jié)點的 新概率矢量:
這一過程針對如存在于策略中那樣多的層級級別而繼續(xù)。盡管由設(shè)施和節(jié)點構(gòu)成的兩 級策略便于說明,但是這一過程可以應(yīng)用于任意深度的層級。在一個實施例中,存儲系統(tǒng)的 管理員定義層級的任意數(shù)量的上級,而層級的最低級由盤占用。在另一實施例中,可以在所 有底級存儲位置內(nèi)做出單級概率選擇。后一個實施例可以引起對象中的更少翻動(churn) 并且更好地保留底層散列函數(shù)的單調(diào)性質(zhì),而前一個實施例可能對大量存儲位置和復(fù)雜存 儲策略規(guī)則更高效。
[0081] 在對象的高速緩存副本與對象的負責副本之間區(qū)分是有用的。負責副本在對象改 變時參與合意協(xié)議并且認識到高速緩存副本。這創(chuàng)建用于每個對象的在對象修改和刪除時 密切涉及到的節(jié)點的小群體。對于負責副本數(shù)量而言希望為小從而在每次修改中不涉及到 過多數(shù)量的節(jié)點,但是大到足以使得故障不可能使對象不可用。對象的最長壽命副本是負 責副本,而高速緩存副本用于短暫(ephemeral)存儲。關(guān)于合意協(xié)議的文獻經(jīng)常討論提議 者、接受者和學習者的角色。在該框架內(nèi),負責副本扮演接受者和學習者的角色,而高速緩 存副本可以僅參與學習者的角色以維持高速緩存的新鮮度。在一些實施例中,所有節(jié)點可 以作為提議者來參與。在其他實施例中,用于合意目的的提議者角色限于保持負責副本的 節(jié)點集合。
[0082] 一致地預(yù)測對象將存儲于何處消除了對保持全局對象索引的需要。然而不可 預(yù)測的情形(諸如資源耗盡或者故障)可能需要在如下節(jié)點的存儲選擇,該節(jié)點并非優(yōu)先 列表中的絕對第一。在這一情況下,對于搜索網(wǎng)絡(luò)的客戶端而言希望具有如下一致回退 (fallback)策略,該回退策略允許它們發(fā)現(xiàn)在更少優(yōu)選的位置存儲的幾個對象。也將希望 客戶端快速和決定性地能夠確定對象標識符未存在于系統(tǒng)中的任何地方。對象的每個副本 將具有如下元數(shù)據(jù),該元數(shù)據(jù)標識當前負責對象副本和引用的其他節(jié)點。這一元數(shù)據(jù)對于 快速標識資源的附近副本而言以及對于知心可靠刪除操作而言均有用。當懷疑節(jié)點已經(jīng)出 故障時,所有其他節(jié)點可以快速搜索它們的本地元數(shù)據(jù)索引以標識不再滿足它們的最少復(fù) 制策略的對象。當資源可用時,當前負責對象的節(jié)點分發(fā)高速緩存副本,并且然后與負責節(jié) 點關(guān)于高速緩存副本已經(jīng)變成負責副本達成協(xié)定。相似過程出現(xiàn)于放置統(tǒng)計的改變引起用 于某些對象集合的節(jié)點優(yōu)先改變時。系統(tǒng)限制對象迀移使得網(wǎng)絡(luò)拓撲改變未引起削弱重新 定位水平。
[0083] 圖10A是圖示用于從分布式內(nèi)容存儲刪除對象的過程的一個實施例的流程圖。在 所示例子中,接收對刪除對象的請求(1002)。例如以與圖9中相同的方式發(fā)現(xiàn)對象的實例 (1004)。讀取并且使用如與對象一起存儲于發(fā)現(xiàn)實例的節(jié)點的與對象關(guān)聯(lián)的元數(shù)據(jù)對對象 的所有"負責"(與高速緩存的相對)副本(1006)定位,也就是為了滿足關(guān)于(一個或多個) 存儲位置、冗余程度等的管理策略而存儲的副本。刪除所有負責副本(1008)。在各種實施 例中,例如一旦確定高速緩存對象副本不再與如存儲于任何節(jié)點中的有效負責副本對應(yīng), 就通過正常高速緩存操作清除任何高速緩存副本(如果有的話)。
[0084] 圖10B是圖示用于可靠刪除對象的負責副本的過程的一個實施例的流程圖。在一 些實施例中,圖10B的過程實現(xiàn)圖10A的步驟1008。為了在網(wǎng)絡(luò)分區(qū)的情況下安全刪除文 件,在一些實施例中,文件刪除請求經(jīng)過若干階段繼續(xù)。在第一階段中,節(jié)點可以擦除對象 的內(nèi)容、但是必須保留如下元數(shù)據(jù),該元數(shù)據(jù)指示文件與關(guān)于刪除過程的當前階段的信息 一起刪除(1022)。在一些實施例中,可以使用分布式合意協(xié)議來維持刪除過程的狀態(tài)。在 一些實施例中,這一保持的元數(shù)據(jù)可以跟蹤哪些其他節(jié)點已經(jīng)確認將文件標記為刪除。替 代地,節(jié)點可以針對其他負責節(jié)點的刪除狀態(tài)定期查詢它們以標識其中所有參與者已經(jīng)進 入至少第一刪除階段的任何文件。一旦已知所有負責副本已經(jīng)開始刪除過程,第二刪除階 段就可以開始(1024)。在一些實施例中,節(jié)點可以選擇向所有負責對等節(jié)點通知第二階段 已經(jīng)開始。在第二階段中,可以去除用于文件的元數(shù)據(jù)(1026)。
[0085] 圖11是圖示用于在分布式內(nèi)容存儲中保存改變的過程的一個實施例的流程圖。 在所示例子中,接收用于保存對對象的改變的指示(1102)。更新對象的本地負責副本以反 映改變(1104)。指示其他負責副本的位置的本地存儲的元數(shù)據(jù)用來向其他負責副本傳播改 變(1106)。在一些實施例中,一旦接收已經(jīng)更新所有負責副本以反映待保存的改變的確認, 就向請求客戶端/應(yīng)用通知已經(jīng)完成保存。如果由于合意協(xié)議的失敗或者拒絕而在成功完 成之前放棄改變,則還原改變(1108)。替代地,在一些實施例中,不應(yīng)用改變直至被所有負 責節(jié)點接受之后。例如通過正常高速緩存管理處理清除對象的被取代版本的高速緩存副本 (1110)。
[0086] 圖12是圖示用于對存儲于分布式內(nèi)容存儲中的對象進行改變的過程的一個實施 例的流程圖。在所示例子中,獲得對內(nèi)容對象的所有權(quán)"鎖定"(1202)。該鎖定向其他節(jié)點 通知必須通過保持鎖定的節(jié)點協(xié)調(diào)對對象的改變。在各種實施例中,這使節(jié)點能夠在一段 時間內(nèi)進行相繼改變而不必與存儲對象的負責副本的其他節(jié)點協(xié)調(diào)。獲得鎖定的節(jié)點協(xié)調(diào) 在/由其他節(jié)點進行的改變(包括通過仲裁或者否則解決任何沖突)并且對如本地存儲的對 象實現(xiàn)在任何節(jié)點承諾的改變(1204)。一旦節(jié)點完成更新對象(1206),它就向存儲對象的 負責副本的其他節(jié)點傳播在保持鎖定的時間期間在/由任何節(jié)點進行的累積改變并且釋 放鎖定(1208)。
[0087]在各種實施例中,節(jié)點通過在包含該對象的負責副本的節(jié)點集合內(nèi)向分布式合意 協(xié)議提供改變表示來發(fā)起對內(nèi)容對象的改變。向所有負責節(jié)點提供這些改變的表示。分布 式合意協(xié)議可以提供用于應(yīng)用改變的全部或者部分排序。這可以減少為了跨越對象的所有 副本進行改變而需要的網(wǎng)絡(luò)業(yè)務(wù)量并且允許在修改內(nèi)容對象時增加的并行量。
[0088] 在各種實施例中,例如如果例如由于一個或者多個節(jié)點不可用等而不能確定用來 以滿足所有適用管理策略的方式存儲對象的節(jié)點的指定數(shù)量和混合和/或應(yīng)當已經(jīng)造成 成功取回請求的對象的多個訪問嘗試都已經(jīng)失敗,則異常策略確定如何存儲對象和/或從 何處嘗試訪問它。
[0089] 在任何M中的N異常策略之下,向客戶端確保在優(yōu)先列表中的前M個節(jié)點之中,它 們中的至少N個節(jié)點將包含對象的副本或者至少包含對可以發(fā)現(xiàn)副本的位置的引用。這要 求客戶端在回退到全局異常索引之前聯(lián)絡(luò)至少#-#+ 1個節(jié)點。僅在聯(lián)絡(luò)至少,價1個 節(jié)點并且檢查全局異常索引之后,客戶端才可以決定性地認為對象不存在。仍然應(yīng)當與優(yōu) 先列表的開始盡可能接近地存儲對象以減少為了發(fā)現(xiàn)對象而必需的總網(wǎng)絡(luò)往返。在#=1 特殊情況下,任何M中的1異常策略要求客戶端在檢查異常列表之前聯(lián)絡(luò)所有M個節(jié)點。
[0090]在前N個異常策略之下,客戶端具有前N個節(jié)點必須都具有對象副本或者引用的 更強確保。在前N個節(jié)點中的任何節(jié)點的故障情況下,客戶端將回退到優(yōu)先列表中的后續(xù) 節(jié)點。如果所有N個節(jié)點不可用,則客戶端將引用異常列表。如果任何節(jié)點可用并且沒有 請求的對象的副本,則客戶端將回到檢查異常列表。盡管這與任何M中的N策略相比減少 了對異?;蛘卟淮嬖诘奈募ㄎ欢枰木W(wǎng)絡(luò)往返數(shù)量,但是它也增加存儲全局異常列表 而必需的存儲數(shù)量,在#= 1的特殊情況下,優(yōu)先列表直接用作選擇功能。如果對象未存儲 于優(yōu)先列表中的第一節(jié)點上,則必須在全局異常索引中列舉它。
[0091]圖13是圖示用于存儲對象的過程的一個實施例的流程圖。在所示例子中,接收對 存儲對象的請求(1302)。例如基于如上所述的訪問概率、成本和/或管理策略確定將在其 存儲對象的一個或者多個優(yōu)選節(jié)點(1304)。嘗試在優(yōu)選節(jié)點存儲對象(1306)。確定是否已 經(jīng)滿足適用異常策略(1308)(例如對象是否成功存儲于M個優(yōu)選節(jié)點中的至少任何N個節(jié) 點中)。如果滿足異常策略(即無異常)(1310),則該過程結(jié)束。如果未滿足異常策略,則選 擇并且使用一個或者多個替代位置(未優(yōu)選)用于存儲對象(1312)并且更新全局異常索引 以反映(附加