ceph之crush map

 編輯crush map:html

  一、獲取crush map;node

  二、反編譯crush map;算法

  三、至少編輯一個設備,桶, 規則;安全

  四、從新編譯crush map; 服務器

  五、從新注入crush map;app

獲取crush  map

  要獲取集羣的crush map,執行命令:工具

    ceph osd  getcrushmap -o {compiled-crushmap-filename}性能

  ceph將crush輸出(-o)到你指定的文件,因爲crush map是已編譯的,因此須要反編譯;優化

反編譯crush map

  要反編譯crush map, 執行命令:ui

     crushtool -d {compiled-crushmap-filename}  -o {decompiled-crushmap-filename}

  ceph將反編譯(-d)二進制crush圖,且輸出(-o)到你指定的文件;

編譯crush map

  要編譯crush map,執行命令:

    crushtool -c  {decompiled-crushmap-filename}  -o {compiled-crushmap-filename}

  ceph將已編譯的crush map保存到你指定的文件;

注入crush map

  要把crush map應用到集羣,執行命令:

    ceph osd  setcrushmap -i {compiled-crushmap-filename}

  ceph 將把你指定的已編譯的crush  map輸入到集羣;

crush map 參數:

CRUSH 圖主要有 4 個主要段落。

  1. 設備 由任意對象存儲設備組成,即對應一個 ceph-osd 進程的存儲器。 Ceph 配置文件裏的每一個 OSD 都應該有一個設備。
  2. 桶類型: 定義了 CRUSH 分級結構裏要用的桶類型( types ),桶由逐級匯聚的存儲位置(如行、機櫃、機箱、主機等等)及其權重組成。
  3. 桶例程: 定義了桶類型後,還必須聲明主機的桶類型、以及規劃的其它故障域。
  4. 規則: 由選擇桶的方法組成。

若是你用咱們的某個「入門手冊」配起了 Ceph ,應該注意到了,你並不須要建立 CRUSH 圖。 Ceph 部署工具生成了默認 CRUSH 運行圖,它列出了你定義在 Ceph 配置文件中的 OSD 設備、並把配置文件 [osd] 段下定義的各 OSD 主機聲明爲桶。爲保證數據安全和可用,你應該建立本身的 CRUSH 圖,以反映出本身集羣的故障域

  Note : 生成的 CRUSH 圖沒考慮大粒度故障域,因此你修改 CRUSH 圖時要考慮上,像機櫃、行、數據中心。

CRUSH 圖之設備:

  爲把歸置組映射到 OSD , CRUSH 圖須要 OSD 列表(即配置文件所定義的 OSD 守護進程名稱),因此它們首先出如今 CRUSH 圖裏。要在 CRUSH 圖裏聲明一個設備,在設備列表後面新建一行,輸入 device 、以後是惟一的數字 ID 、以後是相應的 ceph-osd 守護進程例程名字。

  #devices

  device {num}  {osd.name}

  例如:

    #devices

    device  0 osd.0

    device  1 osd.1

    device  2 osd.2

    device  3 osd.3

  通常來講, 一個OSD映射到一個單獨的硬盤或raid

crush map 之桶類型:

  crush map裏的第二個列表定義了bucket(桶)類型,桶簡化了節點和葉子層次。節點(或非葉)桶在分級結構裏通常表示物理位置,節點匯聚了其它節點或葉子,葉桶表示 ceph-osd 守護進程及其對應的存儲媒體。

  Tip:CRUSH 中用到的 bucket 意思是分級結構中的一個節點,也就是一個位置或一部分硬件。可是在 RADOS 網關接口的術語中,它又是不一樣的概念。

要往 CRUSH 圖中增長一種 bucket 類型,在現有桶類型列表下方新增一行,輸入 type 、以後是唯一數字 ID 和一個桶名。按慣例,會有一個葉子桶爲 type 0 ,然而你能夠指定任何名字(如 osd 、 disk 、 drive 、 storage 等等):

  #types:

  type  {num} {bucket-name}

例如:

  #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

crush map 之桶層次

  crush算法根據各設備的權重、大體統一的機率把數據對象分佈到存儲設備中,crush根據你定義的集羣運行圖分佈對象及其副本,crush map表達了可用存儲設置以及包含它們的邏輯單元;

  要把歸置組映射到跨故障域的OSD,一個crush圖須要定義一些列分級桶類型(即現有crush圖的#type下)。建立桶分級結構的目的是按故障域隔離葉節點,像主機,機箱,機櫃,電力分配單元,集羣,行,房間和數據中心。除了表示葉節點的OSD,其餘分級結構都是任意的,你能夠按需定義;

  咱們建議 CRUSH 圖內的命名符合貴公司的硬件命名規則,而且採用反映物理硬件的例程名。良好的命名可簡化集羣管理和故障排除,當 OSD 和/或其它硬件出問題時,管理員可輕易找到對應物理硬件。

  在下例中,桶分級結構有一個名爲 osd 的分支、和兩個節點分別名爲 host 和 rack 。

  

    Note :編號較高的 rack 桶類型匯聚編號較低的 host 桶類型

 

 

位於 CRUSH map起始部分、 #devices 列表內是表示葉節點的存儲設備,不必聲明爲桶例程。位於分級結構第二低層的桶通常用於匯聚設備(即它一般是包含存儲媒體的計算機,你能夠用本身喜歡的名字描述,如節點、計算機、服務器、主機、機器等等)。在高密度環境下,常常出現一機框內安裝多個主機/節點的狀況,所以還要考慮機框故障——好比,某一節點故障後須要拉出機框維修,這會影響多個主機/節點和其內的 OSD 。

  聲明一個桶例程時,你必須指定其類型、唯一名稱(字符串)、唯一負整數 ID (可選)、指定和各條目總容量/能力相關的權重、指定桶算法(一般是 straw )、和哈希(一般爲 0 ,表示哈希算法 rjenkins1 )。一個桶能夠包含一到多條,這些條目能夠由節點桶或葉子組成,它們能夠有個權重用來反映條目的相對權重。

  你能夠按下列語法聲明一個節點桶:

  [bucket-type] [bucket-name] {

        id [a unique negative numeric ID]

    weight [the relative capacity/capability of the  item(s)]

    alg [the bucket type: uniform |list | tree | straw ]

    hash [the hash type: 0 by default]

    item [item-name] weight [weight]

 }

 例如,用上面的圖表,咱們定義兩個主機桶和一個機櫃桶,OSD被聲明爲主機桶內的條目:

host node1 {
        id -1
        alg straw
        hash 0
        item osd.0 weight 1.00
        item osd.1 weight 1.00
}

host node2 {
        id -2
        alg straw
        hash 0
        item osd.2 weight 1.00
        item osd.3 weight 1.00
}

rack rack1 {
        id -3
        alg straw
        hash 0
        item node1 weight 2.00
        item node2 weight 2.00
}

Note:在前述示例中,機櫃桶不包含任何 OSD ,它只包含低一級的主機桶、以及其內條目的權重之和。

 

桶類型

 

Ceph 支持四種桶,每種都是性能和組織簡易間的折衷。若是你不肯定用哪一種桶,咱們建議 straw ,關於桶類型的詳細討論見 CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data ,特別是 Section 3.4 。支持的桶類型有:

 
  1. Uniform: 這種桶用徹底相同的權重匯聚設備。例如,公司採購或淘汰硬件時,通常都有相同的物理配置(如批發)。當存儲設備權重都相同時,你能夠用uniform 桶類型,它容許 CRUSH 按常數把副本映射到 uniform 桶。權重不統一時,你應該採用其它算法。
  2. List: 這種桶把它們的內容匯聚爲鏈表。它基於 RUSH P 算法,一個列表就是一個天然、直觀的擴張集羣:對象會按必定機率被重定位到最新的設備、或者像從前同樣仍保留在較老的設備上。結果是優化了新條目加入桶時的數據遷移。然而,若是從鏈表的中間或末尾刪除了一些條目,將會致使大量不必的挪動。因此這種桶適合永不或極少縮減的場景。
  3. Tree: 它用一種二進制搜索樹,在桶包含大量條目時比 list 桶更高效。它基於 RUSH R 算法, tree 桶把歸置時間減小到了 O(log n) ,這使得它們更適合管理更大規模的設備或嵌套桶。
  4. Straw: list 和 tree 桶用分而治之策略,給特定條目必定優先級(如位於鏈表開頭的條目)、或避開對整個子樹上全部條目的考慮。這樣提高了副本歸置進程的性能,可是也致使了從新組織時的次優結果,如增長、拆除、或重設某條目的權重。 straw 桶類型容許全部條目模擬拉稻草的過程公平地相互「競爭」副本歸置
 

Hash

  各個桶都用了一種哈希算法,當前 Ceph 僅支持 rjenkins1 ,輸入 0 表示哈希算法設置爲 rjenkins1 。

調整桶的權重

  Ceph 用雙整形表示桶權重。權重和設備容量不一樣,咱們建議用 1.00 做爲 1TB 存儲設備的相對權重,這樣 0.5 的權重大概表明 500GB 、 3.00 大概表明 3TB 。較高級桶的權重是全部枝葉桶的權重之和。

  一個桶的權重是一維的,你也能夠計算條目權重來反映存儲設備性能。例如,若是你有不少 1TB 的硬盤,其中一些數據傳輸速率相對低、其餘的數據傳輸率相對高,即便它們容量相同,也應該設置不一樣的權重(如給吞吐量較低的硬盤設置權重 0.8 ,較高的設置 1.20 )。

CRUSH map之規則

    CRUSH 圖支持「 CRUSH 規則」概念,用以肯定一個存儲池裏數據的歸置。對大型集羣來講,你可能建立不少存儲池,且每一個存儲池都有它本身的 CRUSH 規則集和規則。默認的 CRUSH 圖裏,每一個存儲池有一條規則、一個規則集被分配到每一個默認存儲池,它們有:

  data  /  metadata / rbd

Note:大多數狀況下,你都不須要修改默認規則。新建立存儲池的默認規則集是 0 。

  CRUSH 規則定義了歸置和複製策略、或分佈策略,用它能夠規定 CRUSH 如何放置對象副本。例如,你也許想建立一條規則用以選擇一對目的地作雙路複製;另外一條規則用以選擇位於兩個數據中心的三個目的地作三路鏡像;又一條規則用 6 個設備作 RAID-4 。關於 CRUSH 規則的詳細研究見 CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data ,主要是 Section 3.2 。

  規則格式以下:

 rule <rulename> {

    ruleset <ruleset>

    type  [replicated | raid4 ]

    min_size <min-size>

    max_size <max-size>

    step  take <bucket-type>

    step  [choose | chooseleaf] [firstn|indep ] <N> <bucket-type>

    set emit

}

 ruleset 

   Description: 區分一條規則屬於某個規則集的手段。給存儲池設置規則集後激活。   

   Purpose: 規則掩碼的一個組件。
     Type: Integer
   Required: Yes
     Default: 0

type

  Description: 爲硬盤(複製的)或 RAID 寫一條規則。  
  Purpose: 規則掩碼的一個組件。
  Type: String
  Required: Yes
  Default: replicated  
  Valid Values: Currently only replicated

 

min_size

  Description: 若是一個歸置組副本數小於此數, CRUSH 將不該用此規則。
  Type: Integer
  Purpose: 規則掩碼的一個組件。
  Required: Yes
  Default: 1

max_size

  Description: 若是一個歸置組副本數大於此數, CRUSH 將不該用此規則。
  Type: Integer
  Purpose: 規則掩碼的一個組件。
  Required: Yes
  Default: 10

step take <bucket-name>

  Description: 選取桶名並迭代到樹底。
  Purpose: 規則掩碼的一個組件。
  Required: Yes
  Example: step take data

step choose firstn {num} type {bucket-type}

  Description:  選取指定類型桶的數量,這個數字一般是存儲池的副本數(即 pool size )。
    若是 {num} == 0 選擇 pool-num-replicas 個桶(全部可用的);
    若是 {num} > 0 && < pool-num-replicas 就選擇那麼多的桶;
    若是 {num} < 0 它意爲 pool-num-replicas - {num} 。
  Purpose:  規則掩碼的一個組件。
  Prerequisite: 跟在 step take 或 step choose 以後。
  Example:

    step choose firstn 1 type row

step chooseleaf firstn {num} type {bucket-type}

  Description:  
    選擇 {bucket-type} 類型的一堆桶,並從各桶的子樹裏選擇一個葉子節點。集合內桶的數量一般是存儲池的副本數(即 pool size )。
        若是 {num} == 0 選擇 pool-num-replicas 個桶(全部可用的);
      若是 {num} > 0 && < pool-num-replicas 就選擇那麼多的桶;
      若是 {num} < 0 它意爲 pool-num-replicas - {num} 。
  Purpose:  規則掩碼的一個組件。 它的使用避免了經過兩步來選擇一設備。
  Prerequisite:  Follows step take or step choose.
  Example:
    step chooseleaf firstn 0 type row
step emit

  Description: 輸出當前值並清空堆棧。一般用於規則末尾,也適用於相同規則應用到不一樣樹的狀況。
  Purpose: 規則掩碼的一個組件。
  Prerequisite: Follows step choose.
  Example: step emit

   Important: 把規則集編號設置到存儲池,才能用一個通用規則集編號激活一或多條規則。

主親和性:

  某一Ceph 客戶端讀寫數據時,老是鏈接 acting set 裏的主 OSD (如 [2, 3, 4] 中, osd.2 是主的)。有時候某個 OSD 與其它的相比並不適合作主 OSD (好比其硬盤慢、或控制器慢),最大化硬件利用率時爲防止性能瓶頸(特別是讀操做),你能夠調整 OSD 的主親和性,這樣 CRUSH 就儘可能不把它用做 acting set 裏的主 OSD 了。

    ceph osd primary-affinity  <osd-id>  <weight>

  主親和性默認爲 1 (就是說此 OSD 可做爲主 OSD )。此值合法範圍爲 0-1 ,其中 0 意爲此 OSD 不能用做主的, 1 意爲 OSD 可用做主的;此權重小於 1 時, CRUSH 選擇主 OSD 時選中它的可能性低。

給存儲池指定 OSD:

  假設你想讓大多數存儲池坐落到使用大硬盤的 OSD 上,可是其中一些存儲池映射到使用高速 SSD 的 OSD 上。在同一個 CRUSH 圖內有多個獨立的 CRUSH 樹是可能的,定義兩棵樹、分別有本身的根節點——一個用於硬盤(如 root platter )、一個用於 SSD (如 root ssd ),如:

  1 device 0 osd.0
  2 device 1 osd.1
  3 device 2 osd.2
  4 device 3 osd.3
  5 device 4 osd.4
  6 device 5 osd.5
  7 device 6 osd.6
  8 device 7 osd.7
  9 
 10       host ceph-osd-ssd-server-1 {
 11               id -1
 12               alg straw
 13               hash 0
 14               item osd.0 weight 1.00
 15               item osd.1 weight 1.00
 16       }
 17 
 18       host ceph-osd-ssd-server-2 {
 19               id -2
 20               alg straw
 21               hash 0
 22               item osd.2 weight 1.00
 23               item osd.3 weight 1.00
 24       }
 25 
 26       host ceph-osd-platter-server-1 {
 27               id -3
 28               alg straw
 29               hash 0
 30               item osd.4 weight 1.00
 31               item osd.5 weight 1.00
 32       }
 33 
 34       host ceph-osd-platter-server-2 {
 35               id -4
 36               alg straw
 37               hash 0
 38               item osd.6 weight 1.00
 39               item osd.7 weight 1.00
 40       }
 41 
 42       root platter {
 43               id -5
 44               alg straw
 45               hash 0
 46               item ceph-osd-platter-server-1 weight 2.00
 47               item ceph-osd-platter-server-2 weight 2.00
 48       }
 49 
 50       root ssd {
 51               id -6
 52               alg straw
 53               hash 0
 54               item ceph-osd-ssd-server-1 weight 2.00
 55               item ceph-osd-ssd-server-2 weight 2.00
 56       }
 57 
 58       rule data {
 59               ruleset 0
 60               type replicated
 61               min_size 2
 62               max_size 2
 63               step take platter
 64               step chooseleaf firstn 0 type host
 65               step emit
 66       }
 67 
 68       rule metadata {
 69               ruleset 1
 70               type replicated
 71               min_size 0
 72               max_size 10
 73               step take platter
 74               step chooseleaf firstn 0 type host
 75               step emit
 76       }
 77 
 78       rule rbd {
 79               ruleset 2
 80               type replicated
 81               min_size 0
 82               max_size 10
 83               step take platter
 84               step chooseleaf firstn 0 type host
 85               step emit
 86       }
 87 
 88       rule platter {
 89               ruleset 3
 90               type replicated
 91               min_size 0
 92               max_size 10
 93               step take platter
 94               step chooseleaf firstn 0 type host
 95               step emit
 96       }
 97 
 98       rule ssd {
 99               ruleset 4
100               type replicated
101               min_size 0
102               max_size 4
103               step take ssd
104               step chooseleaf firstn 0 type host
105               step emit
106       }
107 
108       rule ssd-primary {
109               ruleset 5
110               type replicated
111               min_size 5
112               max_size 10
113               step take ssd
114               step chooseleaf firstn 1 type host
115               step emit
116               step take platter
117               step chooseleaf firstn -1 type host
118               step emit
119       }

  而後設置一個存儲池,讓它使用SSD規則:

    ceph osd pool  set <poolname>  crush_ruleset  4

  一樣,用ssd-primary規則將使存儲池內的各歸置組用SSD做主OSD, 普通硬盤做副本;

增長/移動 OSD

  要增長或刪除在線集羣裏 OSD 所對應的 CRUSH 圖條目,執行 ceph osd crush set 命令:

    ceph osd crush set {id-or-name} {weight} root={pool-name}  [{bucket-type}={bucket-name} ...]

調整一OSD的crush權重:

   要調整在線集羣中一 OSD 的 CRUSH 權重,執行命令:

      ceph osd crush reweight {name} {weight}

刪除OSD:

  要從在線集羣裏把一 OSD 踢出 CRUSH 圖,執行命令:

    ceph osd crush remove {name}

增長桶:

  要在運行集羣的 CRUSH 圖中新建一個桶,用 ceph osd crush add-bucket 命令:

     ceph osd crush add-bucket {bucket-name} {bucket-type}

  http://mirrors.myccdn.info/ceph/doc/docs_zh/output/html/rados/operations/crush-map/

    http://xxlazy.appspot.com/How-to-use-v2ex-setup-bbs.html

相關文章
相關標籤/搜索