ceph crush的問題看一遍忘一遍,現將《ceph源碼分析》一書中相關章節摘抄如下:
4.2.1 層級化的Cluster Map
例4-1 Cluster Map定義
層級化的Cluster Map定義了OSD集群具有層級關系的靜態拓撲結構。OSD的層級使得CRUSH算法在選擇OSD時實現了機架感知(rack awareness)的能力,也就是通過規則定義,使得副本可以分布在不同的機架、不同的機房中,提供數據的安全性。
層級化的Cluster Map的一些基本概念如下:
·Device:最基本的存儲設備,也就是OSD,一個OSD對應一個磁盤存儲設備。
·bucket:設備的容器,可以遞歸的包含多個設備或者子類型的bucket。bucket的類型:bucket可以有很多的類型,例如host就代表了一個節點,可以包含多個device。Rack就是機架,包含多個host等。在Ceph里默認的有root、datacenter、room、row、rack、host六個等級。用戶也可以自己定義新的類型。每個device都設置了自己的權重,和自己的存儲空間相關。bucket的權重就是子bucket(或者設備)的權重之和。
#bucket類型 # types type 0 osd type 1 host type 2 chassis type 3 rack type 4 row type 5 pdu type 6 pod type 7 room type 8 datacenter type 9 region type 10 root
下列舉例說明bucket的用法:
host test1 { //類型host,名字為test1 id -2 // bucket的id,一般為負值 # weight 3.000 //權重,默認為子item的權重之和 alg straw // bucket隨機選擇的算法 hash 0 // bucket隨機選擇的算法使用的hash函數,這里0代表使用hash函數jenkins1 item osd.1 weight 1.000 // item1:osd.1和權重值 item osd.2 weight 1.000 item osd.3 weight 1.000 } host test2{ id -3 # weight 3.000 alg straw hash 0 item osd.3 weight 1.000 item osd.4 weight 1.000 item osd.5 weight 1.000 } root default{ // root類型的bucket,名字為default id -1 // id號 # weight 6.000 alg straw //隨機選擇的算法 hash 0 // rjenkins1 item test1 weight 3.000 item test2 weight 3.000 }
4.2.2 Placement Rules
Cluster Map反映了存儲系統層級的物理拓撲結構。Placement Rules決定了一個PG的對象副本如何選擇的規則,通過這些可以自己設定規則,用戶可以設定副本在集群中的分布。其定義格式如下:
tack(a) choose choose firstn {num} type {bucket-type} chooseleaf firstn {num} type {bucket-type}、 If {num} == 0, choose pool-num-replicas buckets (all available). If {num} > 0 && < pool-num-replicas, choose that many buckets. If {num} < 0, it means pool-num-replicas - {num}. Emit
Placement Rules的執行流程如下:
1)take操作選擇一個bucket,一般是root類型的bucket。
2)choose操作有不同的選擇方式,其輸入都是上一步的輸出:
a)choose firstn深度優先選擇出num個類型為bucket-type個的子bucket。
b)chooseleaf先選擇出num個類型為bucket-type個子bucket,然后遞歸到頁節點,選擇一個OSD設備:
·如果num為0,num就為pool設置的副本數。
·如果num大於0,小於pool的副本數,那么就選擇出num個。
·如果num小於0,就選擇出pool的副本數減去num的絕對值。
3)emit輸出結果。
操作chooseleaf firstn{num}type{bucket-type}可以等同於兩個操作:
a)choose firstn{num}type{bucket-type}
b)choose firstn 1 type osd
例4-2
Placement Rules:三個副本分布在三個Cabinet中。
如圖4-2所示的Cluster Map:頂層是一個root bucket,每個root下有四個row類型bucket。每個row下面有4個cabinet,每個cabinet下有若干個OSD設備(圖中有4個host,每個host有若干個OSD設備,但是在本crush map中並沒有設置host這一級別的bucket,而是直接把4個host上的所有OSD設備定義為一個cabinet):
rule replicated_ruleset { ruleset 0 // ruleset的編號id type replicated //類型:repliated或者erasure code min_size 1 //副本數最小值 max_size 10 //副本數最大值 step take root //選擇一個root bucket,做下一步的輸入 step choose firstn 1 type row //選擇一個row,同一排 step choose firstn 3 type cabinet //選擇三個cabinet, 三副本分別在不同的cabinet step choose firstn 1 type osd //在上一步輸出的三個cabinet中,分別選擇一個osd step emit }
根據上面的定義和圖4-2的Cluster Map所示,選擇算法的執行過程如下:
1)選中root bucket作為下一個步驟的輸入。
2)從root類型的bucket中選擇一個row類的子bucket,其選擇的算法在root的定義中設置,一般設置為straw算法。
3)從上一步的輸出row中,選擇三個cabinet,其選擇的算法在row中定義。
4)從上一步輸出的三個cabinet中,分別選擇一個OSD,並輸出。
根據本rule sets,選擇出三個OSD設備分布在一個row上的三個cabinet中。
例4-3
Placement Rules:主副本分布在SSD上,其他副本分布在HDD上。
如圖4-3所示的Cluster Map:定義了兩個root類型的bucket,一個是名為SSD的root類型的bucket,其OSD存儲介質都是SSD盤。它包函兩個host,每個host上的設備都是SSD磁盤;另一個是名為HDD的root類型的bucket,其OSD的存儲介質都是HDD磁盤,它有兩個host,每個host上的設備都是HDD磁盤。
rule ssd-primary { ruleset 5 type replicated min_size 5 max_size 10 step take ssd //選擇ssd這個root bucket為輸入 step chooseleaf firstn 1 type host //選擇一個host,並遞歸選擇葉子節點osd step emit //輸出結果 step take hdd //選擇hdd這個root bucket為輸入 step chooseleaf firstn -1 type host //選擇總副本數減一個host,並分別遞歸選擇一個葉子節點osd step emit //輸出結果 }
根據圖4-3所示的Cluster Map,代碼中的rulesets的執行過程如下:
1)首先take操作選擇ssd為root類型的bucket。
2)在ssd的root中先選擇一個host,然后以該host為輸入,遞歸至葉子節點,選擇一個osd設備。
3)輸出選擇的設備,也就是ssd設備。
4)選擇hdd作為root的輸入。
5)選擇2個host(副本數減一,默認3副本),並分別遞歸選擇一個OSD設備,最終選擇出兩個hdd設備。
6)輸出最終的結果。
最終輸出3個設備,一個是SSD類型的磁盤,另外兩個是HDD磁盤。通過上述規則,就可以把PG的主副本分布在SSD類型的OSD上,其他副本分布在HDD類型的磁盤上。