CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data

論文翻譯。

摘要

新興的大規模分布式存儲系統,是為解決PB級的數據分散的存放在成千上萬個存儲設備上的問題。類似的系統需要保證系統擴展和管理硬件故障的同時,還要平均的分布數據和負載,從而有效的使用資源和最大化系統性能。我們開發了CRUSH,一個為分布式對象存儲系統設計的可擴展偽隨機數分布函數,可以不依賴中心目錄高效映射數據對象到存儲設備上。由于大系統天生的變化特性,CRUSH設計處理添加或移除存儲時,盡量最小化不必要的數據移動。這個算法適用于各種數據副本和可靠性機制,也適用于將數據副本分布到不同容錯域的用戶自定義數據分布策略。

1 介紹

基于對象的存儲是一種可提高可管理性、可擴展性和性能的新興架構。與傳統基于塊的磁盤不同,基于對象的存儲設備(OSDs,object-based storage devices)內部管理磁盤塊分配,對外暴露叫做對象的接口,允許不同大小的讀寫。在這樣的系統中,每個文件的數據被分成較小的對象,分布在整個存儲集群中。為了防止故障時導致數據丟失,對象在多個設備上存有副本(或者其它的數據冗余方式)。基于對象的存儲系統,通過用小的對象列表替換大的塊列表和分散底層塊分配問題,簡化數據布局(layout)。盡管這樣可極大提高可擴展性,減少文件分配的元數據和降低復雜度,但將數據分布到大量不同容量和性能存儲設備的基本工作依然存在。 大部分系統只是簡單的寫入新數據的方式不充分利用設備,這種方式解決的是數據一旦寫入就很少移動的問題。存儲擴容時,即使完美的分布式系統,也會變得平衡,因為新磁盤要么是空的,要么只包含新數據。大部分情況下,只有新的或老的磁盤處于忙的狀態,具體與系統負載有關。 一個健壯的解決方案是將系統的所有數據都隨機分布到可用的存儲設備上,新老數據混合在一起就有可能平衡分布。當新設備添加時,一部分現有的數據遷移到新存儲上回復平衡。這種方式最大的好處就是,所有設備都保持相似的負載,系統處于任何負載時都可以良好的運作。除此之外,在大的存儲系統之中,單個的大文件會被隨機的分布到多個設備上,可以提供更高的并發度和匯聚帶寬。然而,簡單的哈希分布在設備數量變化時會有問題,大致大量的數據抖動。現有的副本隨機分布方法,在設備出現一致性故障時,有很高的數據丟失風險。 我們開發的CRUSH(Controlled Replication Under Scalable Hashing),一個可以高效健壯的將對象副本分散到異構的結構化存儲集群中的偽隨機數據分布算法。CRUSH是一個實現的一致性偽隨機函數,輸入值通常是一個對象或對象組標識符(object group identifier),映射到存放對象副本的設備列表。與傳統的實現不同之處在于,數據的位置不依賴于任何類型的文件或對象目錄,CRUSH只需要一個簡潔的存儲設備拓撲結構描述和副本位置策略。這種方式有2個關鍵優勢:首先,是完全分布式,大系統的任何參與部分都可獨立計算任何對象的位置;其次,需要的元數據很少且基本固定,僅在設備添加或刪除時改變。 CRUSH設計考慮了數據分布充分利用可用資源,存儲設備添加刪除時高效重組數據,通過靈活的副本位置限制最大化硬件故障或其它意外發生時的數據安全性。支持各種各樣的數據安全機制,包括多路復制(鏡像)、RAID奇偶校驗或其它校驗碼。這些特性使CRUSH適用于在對擴展性、性能和可靠性都很關鍵的超大規模(幾PB)存儲系統中管理對象分布。

2 相關工作

基于對象的存儲作為提高存儲系統擴展性的一種方法,最近獲得不少關注。很多研究和生產環境的文件系統都使用基于對象的方式,包括開創性的NASD文件系統、Pnasas文件系統、Lustre等。其它基于塊的分布式文件系統,如GPFS和FAB也面臨類似的數據分布問題。在這些系統中,使用半隨機或啟發式的方法在可用的存儲上分配新數據,但很少重新分配保持分布的平衡。更重要的是,所有這些系統都通過某種元數據目錄定位數據,而CRUSH只是依賴于簡潔的集群描述和特定的映射函數。在寫數據時,系統通過CRUSH可以計算任何新數據的存儲位置,而不需要查詢中心分配器,這才是最大的區別。Storento存儲系統使用的一致性哈希與CRUSH最相似,但缺少平衡數據分布的設備權重和提高數據安全的容錯域支持。 盡管數據遷移問題在顯示分配映射系統中被大量的研究過,但類似實現都需要大量元數據,而CRUSH沒有。Choy在描述數據在磁盤間分布的算法中,在磁盤添加時會移動部分對象,但不支持權重、復制或磁盤刪除。Brinkmann用哈希函數分布數據到異構系統中,但只是靜態集群。SCADDAR提到了存儲添加和刪除,但只支持特定的副本策略。他們都沒有CRUSH的靈活性和提高可靠性的容錯域。

3 CRUSH算法

CRUSH算法根據每個設備權重值在存儲中分布數據對象,盡可能的達到概率統一。分布由表示可用資源和組成的邏輯元素拓撲映射控制。如,一個大規模部署包括很多排服務器機柜,機柜中有硬盤架,硬盤架里有存儲設備。數據分布策略在位置規則(placement rules)中定義,包括幾個目標副本以及副本存放的限制。如,3個鏡像副本放在不同物理機柜的設備上,他們使用不同的電源。 給一個整型輸入值x,CRUSH輸出一個表示n個存儲目標的有序列表R。CRUSH使用參數包括x的多整型輸入哈希函數,僅使用集群拓撲描述表、位置規則和x讓映射完全確定且可計算。分布是偽隨機的,從相似的輸入得到的輸出結果沒有明顯的關聯性。我們稱CRUSH產生偽集群(declustered)副本分布,輸出的這組設備共享數據副本,但彼此又表現出無關聯性。

3.1 集群拓撲映射

集群映射(cluster map)由設備(devices)和桶(buckets)組成,他們都有數字描述符和權重值。桶可以包含任意數量的設備或其它的桶,允許他們在存儲拓撲結構中形成內部節點,設備總是葉節點。給存儲設備分配權重是為了管理他們需要負責存儲的相對數據量。盡管大型系統中包含各種不同容量和性能的設備,數據隨機分布時的統計顯示設備使用率與負載有關,也就是說設備平均負載與存儲的數據量是成比例的。這就產生了一個位置標準,權重,應該由設備容量來。桶的權重定義為它包含的所有項的權重之和。 桶可以由存儲拓撲中的任何元素組成,如,在最底層用硬盤架(shelf)桶表示一組相同的硬盤,然后用機柜(cabinet)桶將放在一起的硬盤架組合在一起。機柜還可以再組成排(row)或機房(room)桶,表示整個大系統。通過偽隨機哈希函數遞歸選擇嵌套的桶元素,最終決定數據存放的位置。與傳統的哈希技術在目標(設備)數量變化時,就會產生大量數據抖動相比,CRUSH基于4個不同的桶類型,每個都對應不同的數據移動算法和計算復雜度。

3.2 副本位置

CRUSH設計的目的就是要讓數據分布在設備上,達到存儲利用率和設備帶寬資源的平衡。副本在存儲拓撲中的位置也會對數據安全性造成極大影響。根據安裝時的底層物理架構,CRUSH可以建模,進而定位與設備故障相關的潛在問題源。典型的包括,相近物理設備、共用電源和共享網絡。通過將這些信息編碼到集群映射表(cluster map)中,CRUSH位置策略可以將對象副本放到不同的容錯域中,同時保持需要的分布。如,為了定位并發故障的發生,需要保證數據副本在不同的機架、機柜、電源、控制器或物理位置。 為了適應各種不同的應用場景,包括數據副本策略和底層硬件配置,CRUSH為每個副本策略定義了位置規則,讓系統或管理員可以精確指定對象副本的位置。如,為2個副本選擇兩個存儲目標,為3個副本在2個數據中心選擇3個存儲目標。 算法1的偽代碼,在簡單的執行環境中,每個規則由一系列應用到的操作組成。

CRUSH函數的輸入,x,通常是一個對象的名字或其它描述符,如副本需要放到相同設備上的一組對象的描述符。操作選擇存儲拓撲中的一個元素(通常是桶)然后給它分一個向量,它會作為后續操作的輸入。操作遍歷每個元素,然后在該點的子集中選擇n個類型t的離散元素。存儲設備都有已知的特定類型,而且系統中的桶包含用于區分不同類型桶的類型字段(如rows和cabinets)。每個, 迭代調用 ,同時對中間的桶按降序遞歸,根據在每個桶中隨機選擇一個嵌套的元素,找到需要的t類型元素時停止。中間結果$$n vec i vec iselect(n,t)emit$$操作后放入結果向量。

[站外圖片上傳中...(image-98b9b6-1600946895444)][站外圖片上傳中...(image-c6a8bf-1600946895444)]

用個例子進行說明,表1是定義的規則,圖1是一個集群拓撲映射圖。從拓撲的根部(root)開始,選擇一個row類型的桶(row2),接下來的選擇3個嵌在row2下的機柜(cabinets),分別是(cab21,cab23,cab24),最后的遍歷前面的3個機柜得到下面的一個硬盤。最終的的結果是得到同一排不同機柜下的3塊硬盤。這種方式可以讓副本分散開,但同時限制在某個類型之內,即保證了可靠性,有考慮了性能。規則由多個take,emit塊組成,允許從不同的存儲池獲取存儲目標,適用于遠程復制場景(一個副本存在異地)和分層存儲(高速近線存儲和大容量慢速磁盤陣列)。

3.2.1 沖突,故障和過載

為了定位類型下的個離散元素,操作需要遍歷存儲拓撲中的很多層,遞歸由副本數量決定。在這個過程中,CRUSH可能會重新選擇一個修改了的輸入,有3種情況:如果一個元素已經在當前組set中(沖突,結果必須不同);設備故障(failed);設備過載(overloaded)。標記故障或過載的設備仍會保留在集群拓撲中,是為了避免不必要的數據遷移。CRUSH會根據集群映射表的信息,主要是報告的過度使用情況,選擇性的隨機移動一些過載設備的數據。對于故障或過載的設備,CRUSH重新開始遞歸過程(見算法1的11行),將元素均勻的分布到整個存儲集群。對于沖突的情況,在遞歸中用替換參數在本地嘗試查找,從而遠離容易發生沖突的子樹,避免數據分布不均。

3.2.2 復制排名

奇偶校驗和糾刪碼方案與副本方式對位置需求有些不同。在主(primary)拷貝復制方案中,在故障發生時,更希望之前的副本(已經有一個數據拷貝)成為新的主。在類似情形中,CRUSH可以通過重新選擇作為”first n”,其中f是當前嘗試的故障位置次數。奇偶校驗和糾刪碼方案中,因為每個目標存儲數據對象的不同位,存儲設備在CRUSH輸出的排名或位置更重要。特別是存儲失敗的情況,需要替換其在CRUSH輸出的列表中相應的位置,這樣列表的其它設備的排名保持不變(如圖2)。在這種場景下,CRUSH重新選擇輸入,其中 是在r上的失敗重試次數,為每個副本排名定義一系列獨立故障的候選。與此不同,RUSH沒有專門針對故障設備的處理,而是在結果中跳過故障設備,這使得在奇偶校驗方案中很難處理。

[站外圖片上傳中...(image-25a820-1600946895444)]

3.3 映射改變和數據移動

在大型系統中,添加和刪除存儲資源的處理是影響數據分布的關鍵因素。CRUSH為了避免負載和相關的資源使用率不對稱,總是保持數據均衡分布。當單個設備故障時,CRUSH對該設備進行標記但仍然留在拓撲結構中,然后根據位置算法(見3.2.1)將其移除(rejected)并重新分布它存儲的內容。這樣的集群映射改變會產生一定的碎片(最小化), (W是所有設備總權重),由于故障設備被移除,上面的所有數據都會重新映射到新的存儲目標上。 由于有存儲資源添加或刪除,集群映射結構改變的情況更復雜。CRUSH映射過程使用集群映射作為加權層次決策樹,會產生超過理論最優值()外的數據移動。在拓撲的每一層,子樹的相對權重改變會影響數據分布,一部分數據對象會從權重下降的子樹移到權重增加的子樹中。由于拓撲中每個節點的隨機位置決策都是完全獨立的,數據移入的節點下面是均衡分布的,不需要映射到最終引起權重變化的葉節點。只有位置處理的更深層數據改變,才會引起相應的相對分布。這個影響在表3的二叉樹例子中闡述:

wBP8Cq.png

拓撲層次的數據移動量有個更低的限度,要分布到新加設備上的數據權重是。移動數據量隨拓撲層次高度h增加,上限是。因為每一步遞歸要移動到子樹的數據對象,被映射到更小相對權重元素上的概率很小,當相對于W很小時,數據移動量達到上限。

3.4 桶類型

一般而言,CRUSH設計是為了調和兩個對立的目標:映射算法的效率和擴展性,當添加或刪除設備導致集群變化時遷移最少的數據恢復分布平衡。最后,CRUSH定義了4種不同類型的桶來表示內部節點(不是葉節點):一致桶(uniform)、鏈表桶(list)、樹結構桶(tree)和簽桶(straw)。每個桶基于不同的內部數據結構,并在副本定位過程中使用不同的函數選擇內嵌元素,也對應計算與組織效率的不同權衡。通用桶只限于所有權重一致的場景(更像一個通用基于哈希的分布函數),其它類型桶可以包含不同權重的元素。這些桶的區別可參考表2:

[站外圖片上傳中...(image-cb7415-1600946895444)]

3.4.1 一致桶

在大型系統中設備很少單獨添加。新存儲通常是部署一些相同的設備,如一個機架或整個機柜。設備達到使用年限時,整體停止使用(排除單個故障),這樣很自然的將它們當做一個整體。CRUSH一致桶適用于這種設備都相同的場景。它最大的優勢是性能:可以在常量時間內映射副本到桶中。在不滿足一致性要求的情況,可以使用其它類型桶。 給CRUSH一個輸入值x和副本數r,用函數從大小為m的一致桶中選擇一個元素,p是隨機選擇(但確定)的一個大于m的素數。時,通過一些簡單的數列定理選擇不同的值。時,兩個不同的r與相同的x會定位到同一個元素。實際上,使用位置算法(見3.2.1)的沖突和后續回退發生的概率很小。 如果一致桶大小改變,數據在設備之間完全重組,更像一個通用的哈希分布策略。

3.4.2 鏈表桶

鏈表桶將它的內容組成鏈表,可以包含任意權重。為了存放一個副本,CRUSH從最近添加元素的鏈表頭開始,對比它與剩余元素權重之和對比。根據的值,有一定概率選擇當前元素,或者繼續遞歸鏈表。這種方法來源于RUSH,重述那個位置問題“最近添加元素,或者更舊的元素”。這是擴展型集群最自然的選擇,對象有一定概率重新分到新存儲上,也可能繼續留在老設備上。當新元素加入到桶里,會產生一定的數據遷移。元素從鏈表中間或尾部移動會產生大量不必要的移動,所以適合存儲不減少后很少減少的場景。 RUSH算法與由包含很多一致桶的單鏈表桶組成的2層CRUSH拓撲相似。用位置規則解決了集群發現過程,CRUSH故障域控制數據存放增強可靠性。

3.4.3 樹結構桶

與其它鏈表結構相似,運行時間的算法復雜度是線性階,鏈表桶對小規模元素很有效,但規模變大時可能不適用。樹結構桶是RUSH的變種,通過將元素保存在二叉樹中解決這個問題。將時間復雜度降到對數階,適合處理更大規模的設備和嵌套桶。RUSH與由包含很多一致桶的單個樹結構桶組成的兩層CRUSH結構相同。 3個桶的結構是一個元素作為葉子節點的權重二叉搜索樹。每個內部節點都知道它左右子樹的整體權重,并用固定的策略標記。為了在桶中選擇一個元素,CRUSH從樹根開始,計算輸入鍵值x、副本數r、桶標識符和當前節點標記(初始是跟)的哈希。結果與左右子數的權重比進行比較,然后決定接下來訪問哪邊的子節點。重復這個過程,直到到達葉子節點,就是要選擇的元素。定位一個元素需要計算哈希和比較的次數是。 桶二叉樹節點用二進制值標記,這個值生成策略要簡單、固定,但要避免樹增長或收縮時標簽變化。樹最左邊的葉子永遠標記為“1”。樹每次擴展時,舊根成為新根的左子樹,舊根標簽左移一位作為新根的標簽(1,10,100等)。樹右邊的標簽在對應左邊節點值的前面加一個“1”。圖4是一個包含6個葉節點的二叉樹。這個策略保證在桶中添加(刪除)元素時,查找現有葉節點的路徑只在根部增加(刪除)額外節點,即位置決策樹的開始。一個對象存放的位置確定在某個子樹,最終的映射只與子樹內的權重和標簽相關,只要子樹不變映射也不會變。盡管決策樹在嵌套元素之間引入了一些額外的數據遷移,但這個策略將數據移動控制在合理范圍以內,同時為大規模桶提供了高效的映射。

[站外圖片上傳中...(image-4f56bd-1600946895444)]

3.4.4 簽桶

鏈表和樹結構桶結構中,選擇元素時還是需要一定次數的哈希計算和權重比較。在做的過程中,采用給特定元素優先權(如表頭部分)或忽略部分子樹的分治方法處理。可以提高選擇副本位置過程的性能,但在添加、刪除或調整權重等改變桶內容的情況發生時,會引入欠優組織重組行為。 簽桶通過模擬抽簽的方式允許所有的元素完全公平的競爭副本位置。確定副本位置時,為桶中的每個元素分一個隨機長度的簽,簽最長的元素勝出。每個簽的長度有個固定范圍,由CRUSH輸入鍵值x、副本數r和桶元素i的哈希決定。每個簽長度會乘以一個根據元素權重得到的因素,這樣更高權重的元素更有可能在抽簽過程中勝出,如。盡管這個過程要比鏈表桶慢兩倍,甚至比樹結構桶還要慢(對數階增長),但內嵌元素變化時它的數據移動更優。 可以根據集群預期的增長類型,在映射計算和數據移動效率之間進行權衡來決定要選擇的桶類型。當桶都比較固定(如相同硬盤的機架),一致桶是最快的。如果桶只是擴展,鏈表桶將新元素加到表頭是優化的數據移動策略,它將盡量多的數據移到新設備上,而其它桶不會有抖動。缺點是,舊元素移出或調整權重時,映射速度是,且有額外數據移動。在可能移出和對重組效率敏感的場景下,簽桶在子樹間的遷移行為有優化。樹結構桶是各種場景的中和,提供良好的性能和適合的重組效率。

4 評價

CRUSH設計基于各種不同目標,包括異構存儲設備的權重平衡分布、添加刪除設備(包括單個磁盤故障)時最小化數據移動、通過將副本存入不同故障域提高系統可靠性、靈活的集群描述和數據分布規則。通過模擬分配到設備的對象,然后檢查分布結果的方式,評價 RUSH 和 RUSH 類型集群類似的CRUSH配置的行為。RUSH 和 RUSH 與由包含很多一致桶的單鏈表或樹結構桶組成的2層CRUSH拓撲相似。盡管RUSH用位置規則解決了集群發現過程,故障域控制數據存放增強可靠性,我們主要考慮數據移動性能。

4.1 數據分布

CRUSH的數據分布應該看起來是隨機的,在相同權重設備上均衡分布,與對象描述符x和存儲目標都沒有關系。我們用經驗方法測量了對象在不同類型桶設備上的分布,并與理論上的均等隨機過程的二項式概率分布時磁盤使用對比。當用放每個對象到給定設備i的概率為分布n個對象,根據二項式的預期設備使用是,標準偏移是。在包含很多設備的大系統中,可以近似認為,標準偏移是,當數據對象足夠大時使用率最平均。與預期的一致,在同構集群和混合權重設備上,CRUSH分布都與二項式偏差一致。

4.1.1 過載保護

盡管CRUSH在對象數量很多時可以過得良好的均衡(使用率差別小),但在一些特殊設備上分配的還是比預期的要多,在隨機過程中也翻譯為非零概率(non-zero probability)。與現有的概率映射算法(包括RUSH)不同,CRUSH包含每個設備的過載修正機制可以重新分布設備上的部分數據。當設備有過度使用的風險時,這個機制可以選擇性的穩定過載設備。在1000個設備的集群容量使用超過99%時,盡管在47%的設備上進行過載調整,CRUSH映射執行時間增加不到20%,且方差降低了4倍(與預期的一致)。

4.1.2 差異性與局部故障

之前的研究表明,實際環境中數據隨機分布的系統性能可與仔細做過數據分塊的相比(略慢一點)。作為分布式對象存儲系統的一部分,在我們自己的CRUSH性能測試中,由于OSD負載(與使用率有關)的差異,隨機對象位置會導致大概5%的寫性能損失。然而,在實際中,這些差別只與同質的負載相關(通常是寫),通過仔細分塊策略可以有效解決。更一般的場景,負載是混合的,當它們到達硬盤時已經看起來是隨機的(至少與硬盤結構無關),導致設備負載和性能也存在相似的差異(除了仔細布局),同時降低總帶寬。 這個分析假設設備容量是固定的。然而,根據實際系統的經驗,分布式存儲系統經常被少量的慢、過載、碎片化或其它性能差的設備拖累。傳統上,顯示的分配方法可以人為的避免這些問題設備,而哈希分布函數不能解決問題。CRUSH可以用現有的過載矯正機制將降級(degenetate)設備作為部分故障(partial failure)處理,將一部分數據和負載轉移,避免性能瓶頸,并慢慢平衡負載。 如DSPTF算法展示的,通過將讀負載分散到不同數據副本,這種存儲系統優化負載平衡可以緩和設備負載差異。這種方法雖然是一種補充,但超出了CRUSH映射函數和這篇論文的范圍。

4.2 結構重組數據移動

我們在7290個設備組成的集群上,用CRUSH和RUSH評估了由存儲添加和刪除引起的數據移動。CRUSH集群有4層:10個存儲設備組成一個機架,9個機架組成一個機柜,9個機柜組成一排,共9排。RUSH 和 RUSH與由包含729個一致桶(每個桶10個設備)的單鏈表或樹結構桶組成的2層CRUSH拓撲相似。結果與理論上的優化移動數量對比, 是存儲設備添加或刪除的組合權重,W是系統的總權重。例如系統容量加倍時,在優化的情況下,一半的現有數據需要移動到新設備上。

[站外圖片上傳中...(image-ca1522-1600946895444)]

圖5用術語移動因素(movement factor)表示結構重組效率,1表示最優的對象移動,更大的值表示額外的移動。X軸是添加或刪除的OSD數量,Y軸是移動因素的對數。在所有情況下,更大權重的變化(相對于整個系統)的重組效率更高。 RUSH(一個大鏈表桶)是一個極端,添加時移動最優但刪除時移動最多(性能嚴重損耗)。CRUSH多層拓撲架構的鏈表或簽桶的移動是第二少。CRUSH的樹結構桶略低效,但比RUSH好25%(因為樹桶里存在不平衡的9項二叉樹)。與預測的一致(見3.3),CRUSH鏈表樹在刪除的場景中性能差。

[站外圖片上傳中...(image-af01f4-1600946895444)]

圖6是內嵌元素添加或刪除時的不同類型桶的重組效率。修改樹結構桶的移動因素上限是log n,n是二叉樹的深度。往簽桶或鏈表桶添加元素差不多是最優的。一致桶中的修改導致所有數據的重排。鏈表尾部的修改(刪除舊數據)也會產生整個桶的數據移動。除了特別限制,鏈表桶適合與存儲很少減少的場景。在大部分重組情況下,一致、鏈表、樹和簽桶組合的方式可以最小化數據移動,并保持良好的映射性能。

4.3 算法性能

計算CRUSH映射算法被設計得盡量快,n個OSDs的集群復雜度是,可以快速定位對象,或集群映射變化時重新選擇合適的存儲對象。我們通過在上百萬個到不同規模集群的映射,與RUSH 和 RUSH對比檢查CRUSH的性能。圖7是映射一組副本到CRUSH集群的平均時間(微秒),CRUSH集群由8項樹和一致桶(拓撲深度可變)組成,RUSH集群由固定的兩層架構。X軸是系統設備數量的對數,與存儲拓撲深度對應。CRUSH性能是相對應設備數量的對數。 RUSH由于編碼更簡單,比CRUSH樹結構桶略勝一籌,緊接著是鏈表和簽桶。在測試中RUSH線性增長,盡管在實際場景中,根據新部署的磁盤是隨著時間指數增長的特性,可以優化實現線性,但32768個設備時花費的時間是CRUSH的25倍。測試使用的是2.8 GHz的奔騰4處理器,所有映射在數十微秒內完成。

[站外圖片上傳中...(image-fce061-1600946895444)]

CRUSH的效率依賴與存儲拓撲深度和使用的桶類型。圖8比較了c(r,x)從每種類型桶中選擇單個副本需要的時間(Y),X軸是桶的大小。在上層,CRUSH整體按對數階增加(相對于拓撲深度是線性的),對于特定桶可能是線性階(鏈表和簽桶),不會超過特定的最大值。什么時候在哪里使用特定類型的桶,依賴于可能的添加、刪除或權重修改數量。盡管在刪除時有額外的數據移動,鏈表桶比簽桶在性能上略有優勢。對于規模很大且修改平凡的桶,樹桶是個不錯的選擇,可以減少計算和重組損耗。 CRUSH性能的核心是使用的整型哈希函數,包括執行時間和結果質量。偽隨機數通過基于Jenkin的32位哈希mix的多輸入整型哈希函數計算。當前的版本,CRUSH映射函數大概有45%的時間花費在哈希值上,哈希值成了提高整體速度和分布質量以及成熟系統的優化目標。

[站外圖片上傳中...(image-4e1876-1600946895444)]

4.3.1 疏忽老化

因為故障通常是臨時的,也為了避免低效的數據重組,CRUSH將故障的設備留在了存儲拓撲中。如果忽略了存儲系統的老化,設備故障且沒有替換的數量就會很多。盡管CRUSH會將數據重新放到正常設備上,由于位置算法更高的回溯概率,還是會有一些性能損耗。我們評估了在1000個設備集群中標記不同比率設備故障時的映射速度。對于一半設備故障這種相對極端的場景,計算映射的時間增加了71%。(這種使之黯然失色的情況可能是由于每個設備的工作負載加倍而嚴重降低了I/O性能。)

4.4 可靠性

在大規模存儲系統中,硬件故障經常發生,數據安全至關重要。像CRUSH這種隨機分布策略,分散副本的方式很特別,因為它們與任何設備共享數據擴展伙伴的數量。這有兩個相互競爭且對立的影響,第一,在故障之后恢復會并行產生,因為少部分的副本數據。分布到更大規模的對象中,減少恢復時間和額外錯誤發生的窗口。第二,更大規模伙伴組意味著二次故障丟失共享數據的概率變大。在兩路鏡像中,大于兩個副本的數據安全性在分離時增加。 然而,多故障的關鍵因素是,不能保證彼此獨立,在很多情況下,如斷電或物理中斷這種單個故障會引發多個設備和更大規模的伙伴分散副本,從而增加數據丟失的風險。CRUSH在用戶定義的故障域中分散副本(在RUST或現有的哈希方法中不存在)是為了專門防止這種巧合設計的,從源頭修正數據丟失的故障。盡管風險明顯減少了,但是在缺少特定存儲集群配置和相關歷史故障數據的情況下還是很難保證可以顯著提高整個系統的可靠性。雖然我們希望在將來進行這方面的研究,但是它超出了這篇論文的范圍。

5 后續工作

CRUSH作為Ceph的一部分,一個幾PB的分布式文件系統。當前的研究包括一個基于CRUSH特性的智能可靠分布式對象存儲。當前CRUSH使用的原始規則結構已經足以支持我們當前可見的數據分布策略。一些有特殊需求的系統可以通過更強大的規則結構來滿足。 盡管數據安全相關的故障概率是設計CRUSH的原始動機,在用Markov或其他量化模型評估它們對系統數據丟失平均時間(MTTDL)的準確影響前,需要研究真實系統的故障確定他們的特征和頻率。 CRUSH的性能極大的依賴于強大又合適的整型哈希函數。因為他同時影響算法正確性,即結果的分布,和速度,對高速哈希技術的研究是讓CRUSH更加健壯的保證。

6 總結

分布式存儲系統對數據位置的可擴展性提出挑戰。CRUSH通過一個偽隨機函數分散數據位置的方式應對挑戰,并消除傳統方式中對位置元數據的需求,而是用基于可用存儲的權重拓撲結構代替。集群映射結構反映了底層物理組織架構和基礎設施,如用存儲設備組成機架、機柜和數據中心的排,允許自定義位置規則分散對象副本到不同的故障域(獨立電源和網絡)。這種方式,CRUSH可以降低現有非集群副本偽隨機系統中設備故障相關的漏洞。CRUSH也通過最小的計算消耗,從過載設備上選擇性轉移數據,處理隨機的設備過載風險。 CRUSH在計算效率和需要的元數據兩個方面,都以極高的效率完成這些事情。計算映射的執行時間復雜度為,處理上千個設備只需要幾十微秒。CRUSH的高效、可靠和靈活,非常適合與大規模分布式存儲系統。

7 感謝

8 源碼下載

The CRUSH source code is licensed under the LGPL, and is

available at:

http://www.cs.ucsc.edu/~sage/crush

參考文獻

注:

  1. hierarchy:拓撲,拓撲層次
  2. 文中所有的“隨機”均代表“偽隨機”(pseudo-random)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。