ceph解讀:crush分散式資料分佈的問題

pengcheng發表於2018-01-05
      對於分散式儲存系統,資料分佈在各個節點中,需要一種有效的資料分佈機制,不但能夠被快速定址,並且資料的分佈能夠考慮到容量均衡和負載均衡。目前現有分散式儲存系統的資料分佈實現中,很多采用中心節點分配資料分佈地址並查表索引,隨著資料量的增大,定址開銷也越來越大。
     其他分散式儲存系統,比如CEPH的資料分佈採用雜湊計算定址,可以解決上面的問題,但也存在幾個不足:
  1. 雜湊計算分配資料地址,存在一定的隨機性,隨著系統的使用,各個儲存節點的容量使用很不均衡,在一些不利配置的條件下,最大和最小容量之間最高相差50%,即使對資料進行復雜的重新分佈均衡優化,也僅能達到90%左右的容量使用率。造成容量的浪費;
  2. 擴容或硬碟故障會導致資料分佈發生變化,導致幾乎整個系統產生資料遷移。比如在Ceph中,資料最小地址單位(比如CEPH的歸置組Placement group)是動態變化的,當儲存池中出現故障或擴容時,會導致大量資料發生遷移,由於雜湊分佈的隨機性,當輸入發生變化後,輸出是整系統聯動的,會導致整個儲存池都參與資料的重新分佈,過分影響使用者的正常使用;

資料分佈原理

osd map

       osd map是個樹形結構,其中HDD,SSD等儲存裝置作為葉子節點OSD。其他節點根據物理結構進行抽象,比如機房抽象,主機抽象,主機由於存在唯一的IP等資訊可以被軟體實時檢測並自動抽象,其他節點可以人工配置抽象。其中資料中心,機房,機架,主機等中間層級都是可選的,可以根據實際需要配置。它可以作為crush演算法的輸入屬性,用來生成對應歸置組Placemen group的osd列表,如下圖所示:

ceph解讀:crush分散式資料分佈的問題


crush演算法

        crush演算法主要是用來控制資料分佈,它的輸入包括osd map,x(pgid),定位規則rule,輸出是一組osd Dev配對列表(osd0, osd1, osd2 … osdn)。其中pgid是資料最小地址單位Placement Group,pgid根據資料冗餘規則包含了多個osd配對列表,比如pgid1=(1,2),pgid2=(2,3),資料通過雜湊演算法對映到不同的pgid,並且再進一步分佈到不同的儲存osd Dev中。

        crush演算法利用強大的多重整數hash函式根據osd map、定位規則rule、以及pgid計算出獨立的完全確定可靠的對映關係 :

CRUSH(x=pgid,osd map, rule) = (osd0, osd1, osd2 … osdn)       

        pg內的儲存裝置配對應該儘量滿足故障域分離,比如分佈到不同的host或者不同的機架,以便達到分散式容災的效果。大致過程如下,crush演算法遍歷osd map的葉子節點,通過偽隨機演算法分配一個osd,接著根據crush中定義的take type型別,尋找不同(disk,host,rack等)下的其他葉子節點osd,依據同樣規則分配足夠crush中定義的osd size個數。最後會得到一個該pgid下的osd列表,其中osd是不同的,並且分別屬於不同故障域(比如在不同的主機host中)。如下圖所示。

ceph解讀:crush分散式資料分佈的問題

資料定址流程

      如上圖所示,一個PG會被對映到n個OSD上,而每個OSD上都會承載大量的PG,即PG和OSD之間是“多對多”對映關係。在實踐當中,n至少為2,如果用於生產環境,則至少為3。一個OSD上的PG則可達到數百個。事實上,PG數量的設定牽扯到資料分佈的均勻性問題。

     資料寫入時,資料object先對映到PG,首先要根據object名稱計算資料object的Hash值並將結果和PG數目取餘,以得到資料object對應的PG編號。然後,通過CRUSH演算法將PG對映到一組OSD中。最後把資料object存放到PG對應的OSD中。這個過程中包含了兩次對映,第一次是資料object到PG的對映,第二次是PG到osd的對映。PG是抽象的儲存節點,它不會隨著物理節點的加入或則離開而增加或減少,因此資料到PG的對映是穩定的。

      

原因分析

     通過上面的原理分析,我們繼續分析,為何會產生前言提到的兩個缺點。

       第一,容量不均衡。在資料分佈的兩次對映中,物件到PG的對映是通過雜湊值取模,物件名是不可控的,因此只有在資料量大的情況,可以達到一個大致的均衡分佈。再就是第二次對映,ceph會生成一系列的pg數目,包含了一些osd列表,它是一種偽隨機演算法,pg的數目也會影響資料均衡的效果,也會產生一些不穩定因素。

       第二,擴容或故障導致大量資料重建。在crush演算法中,PG是相對穩定的,但是osd map包含了osd的裝置狀態,當osd map中增加新的裝置,或者某些裝置發生了故障,會導致PG內的osd列表發生變化以便可以進行資料重建或均衡。比如某個host0的osd0發生了故障,因為osd和pg之間的關係是多對多的關係,所以包含osd0的pg都要進行資料重建,基本上這些pg會分佈到幾乎所有主機host上,並在所有主機上產生資料遷移,並影響整體系統效能。而且這種效能衰減並非線性的,硬碟的特點是要麼寫要麼讀,隨機讀寫的混合任何產生伴隨著巨大的效能衰退。

總結

    由於時間關係,本文未對解決方案進一步展開,總而言之,ceph在資料分佈方面有一些改進空間,期待在後續版本中有所體現。


作者:luciham@gmail.com
出處:https://juejin.im/user/5a4e11d96fb9a01c9f5b3367
本文歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。複製程式碼


相關文章