編輯crush map:html
一、獲取crush map;node
二、反編譯crush map;算法
三、至少編輯一個設備,桶, 規則;安全
四、從新編譯crush map; 服務器
五、從新注入crush map;app
要獲取集羣的crush map,執行命令:工具
ceph osd getcrushmap -o {compiled-crushmap-filename}性能
ceph將crush輸出(-o)到你指定的文件,因爲crush map是已編譯的,因此須要反編譯;優化
要反編譯crush map, 執行命令:ui
crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
ceph將反編譯(-d)二進制crush圖,且輸出(-o)到你指定的文件;
要編譯crush map,執行命令:
crushtool -c {decompiled-crushmap-filename} -o {compiled-crushmap-filename}
ceph將已編譯的crush map保存到你指定的文件;
要把crush map應用到集羣,執行命令:
ceph osd setcrushmap -i {compiled-crushmap-filename}
ceph 將把你指定的已編譯的crush map輸入到集羣;
CRUSH 圖主要有 4 個主要段落。
若是你用咱們的某個「入門手冊」配起了 Ceph ,應該注意到了,你並不須要建立 CRUSH 圖。 Ceph 部署工具生成了默認 CRUSH 運行圖,它列出了你定義在 Ceph 配置文件中的 OSD 設備、並把配置文件 [osd] 段下定義的各 OSD 主機聲明爲桶。爲保證數據安全和可用,你應該建立本身的 CRUSH 圖,以反映出本身集羣的故障域
Note : 生成的 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裏的第二個列表定義了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算法根據各設備的權重、大體統一的機率把數據對象分佈到存儲設備中,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 。支持的桶類型有:
- Uniform: 這種桶用徹底相同的權重匯聚設備。例如,公司採購或淘汰硬件時,通常都有相同的物理配置(如批發)。當存儲設備權重都相同時,你能夠用uniform 桶類型,它容許 CRUSH 按常數把副本映射到 uniform 桶。權重不統一時,你應該採用其它算法。
- List: 這種桶把它們的內容匯聚爲鏈表。它基於 RUSH P 算法,一個列表就是一個天然、直觀的擴張集羣:對象會按必定機率被重定位到最新的設備、或者像從前同樣仍保留在較老的設備上。結果是優化了新條目加入桶時的數據遷移。然而,若是從鏈表的中間或末尾刪除了一些條目,將會致使大量不必的挪動。因此這種桶適合永不或極少縮減的場景。
- Tree: 它用一種二進制搜索樹,在桶包含大量條目時比 list 桶更高效。它基於 RUSH R 算法, tree 桶把歸置時間減小到了 O(log n) ,這使得它們更適合管理更大規模的設備或嵌套桶。
- 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 圖支持「 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 上,可是其中一些存儲池映射到使用高速 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 所對應的 CRUSH 圖條目,執行 ceph osd crush set 命令:
ceph osd crush set {id-or-name} {weight} root={pool-name} [{bucket-type}={bucket-name} ...]
要調整在線集羣中一 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