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/
本文摘自个人博客,更多干货,也详见该博客:夏天的风
集群情况和上一篇文章一样
# ceph -s
cluster:
id: 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
health: HEALTH_OK
services:
mon: 3 daemons, quorum luminous0,luminous1,luminous2
mgr: luminous0(active)
mds: 1/1/1 up {0=luminous0=up:active}
osd: 6 osds: 6 up, 6 in
data:
pools: 7 pools, 112 pgs
objects: 240 objects, 3359 bytes
usage: 9245 MB used, 51587 MB / 60833 MB avail
pgs: 112 active+clean
1、在 ceph.conf
配置中将挂钩关掉
osd_crush_update_on_start = false
2、部署OSD
3、手动创建所有的 CRUSH buckets
4、手动在每个 buckets 中放置 OSD
每当新加入、移除一个节点,或者将OSD从一个 host 移到另一个 host 时,也必须手动更改 CRUSH map。
定义 osd_crush_location_hook,它可以让你定义一个路径去执行脚本,允许你自动处理以上过程。
调用方式:
myhook --cluster <cluster_name> --id <id> --type osd
集群名通常是 ceph , id 是守护进程标识符( OSD 号)。
这么做的目的是为ceph不同类型的设备(HDD,SSD,NVMe)提供一个合理的默认,以便用户不必自己手动编辑指定。这相当于给磁盘组一个统一的class标签,根据class创建rule,然后根据role创建pool,整个操作不需要手动修改crushmap。
# 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 中:
ceph-disk prepare --crush-device-class <class> /dev/XXX
2、将现有 osd 加入到指定 class 中,命令如下:
ceph osd crush set-device-class osd.<id> <class>
* 以下对第二种操作进行实验,也是使用最多的。*
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.05814 root default
-2 0.01938 host luminous0
1 0.00969 osd.1 up 1.00000 1.00000
5 0.00969 osd.5 up 1.00000 1.00000
-3 0.01938 host luminous2
0 0.00969 osd.0 up 1.00000 1.00000
4 0.00969 osd.4 up 1.00000 1.00000
-4 0.01938 host luminous1
2 0.00969 osd.2 up 1.00000 1.00000
3 0.00969 osd.3 up 1.00000 1.00000
将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 3 name 'osd.0' device_class hdd
set-device-class item id 4 name 'osd.1' device_class hdd
set-device-class item id 5 name 'osd.2' 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 3 name 'osd.3' device_class ssd
set-device-class item id 4 name 'osd.4' device_class ssd
set-device-class item id 5 name 'osd.5' device_class ssd
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-12 0.02907 root default~ssd
-9 0.00969 host luminous0~ssd
5 0.00969 osd.5 up 1.00000 1.00000
-10 0.00969 host luminous2~ssd
4 0.00969 osd.4 up 1.00000 1.00000
-11 0.00969 host luminous1~ssd
3 0.00969 osd.3 up 1.00000 1.00000
-8 0.02907 root default~hdd
-5 0.00969 host luminous0~hdd
1 0.00969 osd.1 up 1.00000 1.00000
-6 0.00969 host luminous2~hdd
0 0.00969 osd.0 up 1.00000 1.00000
-7 0.00969 host luminous1~hdd
2 0.00969 osd.2 up 1.00000 1.00000
-1 0.05814 root default
-2 0.01938 host luminous0
1 0.00969 osd.1 up 1.00000 1.00000
5 0.00969 osd.5 up 1.00000 1.00000
-3 0.01938 host luminous2
0 0.00969 osd.0 up 1.00000 1.00000
4 0.00969 osd.4 up 1.00000 1.00000
-4 0.01938 host luminous1
2 0.00969 osd.2 up 1.00000 1.00000
3 0.00969 osd.3 up 1.00000 1.00000
# ceph osd crush rule create-simple hdd-rule default~ssd host firstn
Invalid command: invalid chars ~ in default~ssd
osd crush rule create-simple <type> {firstn|indep} : create crush rule to start from , replicate across buckets of type <type>, using a choose mode of (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的状况
# ceph osd crush rule ls
[
"replicated_rule"
]
只有一个默认的rule
* 第一步:获取crushmap *
# ceph osd getcrushmap -o c1
11
第二步:反编译crushmap
# crushtool -d c1 -o c2.txt
编辑crushmap
# vim c2.txt
在 # rule
那一栏 replicated_rule
的后面添加 hdd_rule
和 ssd_rule
# rules
rule replicated_rule {
ruleset 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
rule hdd_rule {
ruleset 1
type replicated
min_size 1
max_size 10
step take default class hdd
step chooseleaf firstn 0 type osd
step emit
}
rule ssd_rule {
ruleset 2
type replicated
min_size 1
max_size 10
step take default class ssd
step chooseleaf firstn 0 type osd
step emit
}
第三步:编译crushmap
# crushtool -c c2.txt -o c1.new
第四步:注入crushmap
# ceph osd setcrushmap -i c1.new
12
此时,查看rule
# ceph osd crush rule ls
[
"replicated_rule",
"hdd_rule",
"ssd_rule"
]
有了新创建的两个rule
1、在 ssd_rule 上创建一个 pool
# ceph osd pool create testpool 64 64 ssd_rule
pool 'testpool' created
2、写一个对象
# rados -p testpool put object1 c2.txt
3、查看对象的osdmap
# ceph osd map testpool object1
osdmap e46 pool 'testpool' (7) object 'object1' -> pg 7.bac5debc (7.3c) -> up ([5,3,4], p5) acting ([5,3,4], p5)
发现对象确实只写在 ssd class 所对应的 3个OSD(osd.3 osd.4 osd.5)上,rule绑定成功。