ceph crush的問題


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類型的磁盤上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM