cursh class為新增的管理裝置類的功能,可以将特定一組裝置指定為類,建立rule的時候直接指定class即可,以前也可以實作該功能,隻不過需要編輯crushmap,手動添加class。該功能隻需要指令行就可以實作。
轉載請注明出處:http://xiaqunfeng.cc/2017/07/04/ceph-Luminous%E6%96%B0%E5%8A%9F%E8%83%BD%E4%B9%8Bcrush-class/
本文摘自個人部落格,更多幹貨,也詳見該部落格:夏天的風
-
- 前言
- 關于之前的crush
- 完全手動管理crush
- CEPH-CRUSH-LOCATION 挂鈎
- CRUSH devices class
- 目的
- 建立兩個 class
- 目前OSD 分布
- 為class添加osd
- 再檢視osd分布
- 建立rule
- 手動來建立rule
- 測試一下rule 綁定 class是否成功
前言
叢集情況和上一篇文章一樣
# ceph -s
cluster:
id: c7ec5af-cbd3-fd-c96-c77660d4
health: HEALTH_OK
services:
mon: daemons, quorum luminous0,luminous1,luminous2
mgr: luminous0(active)
mds: // up {=luminous0=up:active}
osd: osds: up, in
data:
pools: pools, pgs
objects: objects, bytes
usage: MB used, MB / MB avail
pgs: active+clean
關于之前的crush
完全手動管理crush
1、在
ceph.conf
配置中将挂鈎關掉
2、部署OSD
3、手動建立所有的 CRUSH buckets
4、手動在每個 buckets 中放置 OSD
每當新加入、移除一個節點,或者将OSD從一個 host 移到另一個 host 時,也必須手動更改 CRUSH map。
CEPH-CRUSH-LOCATION 挂鈎
定義 osd_crush_location_hook,它可以讓你定義一個路徑去執行腳本,允許你自動處理以上過程。
調用方式:
叢集名通常是 ceph , id 是守護程序辨別符( OSD 号)。
CRUSH devices class
目的
這麼做的目的是為ceph不同類型的裝置(HDD,SSD,NVMe)提供一個合理的預設,以便使用者不必自己手動編輯指定。這相當于給磁盤組一個統一的class标簽,根據class建立rule,然後根據role建立pool,整個操作不需要手動修改crushmap。
建立兩個 class
# ceph osd crush class ls
[]
# ceph osd crush class create hdd
created class hdd with id 0 to crush map
# ceph osd crush class create ssd
created class ssd with id 1 to crush map
# ceph osd crush class ls
[
"hdd",
"ssd"
]
根據class,可以對osd進行以下兩種操作:
1、部署OSD時指定 class,比如,指定部署磁盤所在的 OSD 到指定 class 中:
2、将現有 osd 加入到指定 class 中,指令如下:
* 以下對第二種操作進行實驗,也是使用最多的。*
目前OSD 分布
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
- .814 root default
- .938 host luminous
1 0.00969 osd.1 up 1.00000 1.00000
5 0.00969 osd.5 up 1.00000 1.00000
- .938 host luminous2
0 0.00969 osd.0 up 1.00000 1.00000
4 0.00969 osd.4 up 1.00000 1.00000
- .938 host luminous1
2 0.00969 osd.2 up 1.00000 1.00000
3 0.00969 osd.3 up 1.00000 1.00000
為class添加osd
将0、1、2分到hdd class,3、4、5分到ssd class
# for i in 0 1 2; do ceph osd crush set-device-class osd.$i hdd; done
set-device-class item id name 'osd' device_class hdd
set-device-class item id name 'osd' device_class hdd
set-device-class item id name 'osd' device_class hdd
# for i in 3 4 5; do ceph osd crush set-device-class osd.$i ssd; done
set-device-class item id name 'osd' device_class ssd
set-device-class item id name 'osd' device_class ssd
set-device-class item id name 'osd' device_class ssd
再檢視osd分布
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
- .907 root default~ssd
- .969 host luminous~ssd
5 0.00969 osd.5 up 1.00000 1.00000
- .969 host luminous2~ssd
4 0.00969 osd.4 up 1.00000 1.00000
- .969 host luminous1~ssd
3 0.00969 osd.3 up 1.00000 1.00000
- .907 root default~hdd
- .969 host luminous~hdd
1 0.00969 osd.1 up 1.00000 1.00000
- .969 host luminous2~hdd
0 0.00969 osd.0 up 1.00000 1.00000
- .969 host luminous1~hdd
2 0.00969 osd.2 up 1.00000 1.00000
- .814 root default
- .938 host luminous
1 0.00969 osd.1 up 1.00000 1.00000
5 0.00969 osd.5 up 1.00000 1.00000
- .938 host luminous2
0 0.00969 osd.0 up 1.00000 1.00000
4 0.00969 osd.4 up 1.00000 1.00000
- .938 host luminous1
2 0.00969 osd.2 up 1.00000 1.00000
3 0.00969 osd.3 up 1.00000 1.00000
建立rule
# ceph osd crush rule create-simple hdd-rule default~ssd host firstn
Invalid command: invalid chars ~ in default~ssd
osd crush rule create-simple <name> <root> <type> {firstn|indep} : create crush rule <name> to start from <root>, replicate across buckets of type <type>, using a choose mode of <firstn|indep> (default firstn; indep best for erasure pools)
Error EINVAL: invalid command
這裡出現錯誤,我在想,是不是 class name 不用帶上
default~
這個符号,于是
# ceph osd crush rule create-simple hdd-rule ssd host firstn
Error ENOENT: root item ssd does not exist
依然出錯,這是個bug,還在 merge 中
先跳過這個直接建立rule關聯class的指令,後續BUG修複了再來實驗
手動來建立rule
首先檢視目前rule的狀況
# ceph osd crush rule ls
[
"replicated_rule"
]
隻有一個預設的rule
* 第一步:擷取crushmap *
第二步:反編譯crushmap
編輯crushmap
在
# rule
那一欄
replicated_rule
的後面添加
hdd_rule
和
ssd_rule
# rules
rule replicated_rule {
ruleset
type replicated
min_size
max_size
step take default
step chooseleaf firstn type host
step emit
}
rule hdd_rule {
ruleset
type replicated
min_size
max_size
step take default class hdd
step chooseleaf firstn type osd
step emit
}
rule ssd_rule {
ruleset
type replicated
min_size
max_size
step take default class ssd
step chooseleaf firstn type osd
step emit
}
第三步:編譯crushmap
第四步:注入crushmap
此時,檢視rule
# ceph osd crush rule ls
[
"replicated_rule",
"hdd_rule",
"ssd_rule"
]
有了新建立的兩個rule
測試一下,rule 綁定 class是否成功
1、在 ssd_rule 上建立一個 pool
# ceph osd pool create testpool 64 64 ssd_rule
pool 'testpool' created
2、寫一個對象
3、檢視對象的osdmap
# ceph osd map testpool object1
osdmap e46 pool 'testpool' () object 'object1' -> pg bac5debc (c) -> up ([,,], p5) acting ([,,], p5)
發現對象确實隻寫在 ssd class 所對應的 3個OSD(osd.3 osd.4 osd.5)上,rule綁定成功。