ceph Luminous新功能之crush class

来源:互联网 发布:mac os 显示隐藏文件 编辑:程序博客网 时间:2024/06/15 18:42

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:     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

关于之前的crush

完全手动管理crush

1、在 ceph.conf 配置中将挂钩关掉

osd_crush_update_on_start = false

2、部署OSD

3、手动创建所有的 CRUSH buckets

4、手动在每个 buckets 中放置 OSD

每当新加入、移除一个节点,或者将OSD从一个 host 移到另一个 host 时,也必须手动更改 CRUSH map。

CEPH-CRUSH-LOCATION 挂钩

定义 osd_crush_location_hook,它可以让你定义一个路径去执行脚本,允许你自动处理以上过程。

调用方式:

myhook --cluster <cluster_name> --id <id> --type osd

集群名通常是 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 hddcreated class hdd with id 0 to crush map# ceph osd crush class create ssdcreated 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>

* 以下对第二种操作进行实验,也是使用最多的。*

当前OSD 分布

# ceph osd treeID 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

为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; doneset-device-class item id 3 name 'osd.0' device_class hddset-device-class item id 4 name 'osd.1' device_class hddset-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; doneset-device-class item id 3 name 'osd.3' device_class ssdset-device-class item id 4 name 'osd.4' device_class ssdset-device-class item id 5 name 'osd.5' device_class ssd

再查看osd分布

# ceph osd treeID  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

创建rule

# ceph osd crush rule create-simple hdd-rule default~ssd host firstnInvalid command:  invalid chars ~ in default~ssdosd 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 firstnError ENOENT: root item ssd does not exist

依然出错,这是个bug,还在 merge 中

先跳过这个直接创建rule关联class的命令,后续BUG修复了再来实验

手动来创建rule

首先查看当前rule的状况

# ceph osd crush rule ls[    "replicated_rule"]

只有一个默认的rule

* 第一步:获取crushmap *

# ceph osd getcrushmap -o c111

第二步:反编译crushmap

# crushtool -d c1 -o c2.txt

编辑crushmap

# vim c2.txt

# rule 那一栏 replicated_rule 的后面添加 hdd_rulessd_rule

# rulesrule 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.new12

此时,查看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_rulepool 'testpool' created

2、写一个对象

# rados -p testpool put object1 c2.txt

3、查看对象的osdmap

# ceph osd map testpool object1osdmap 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绑定成功。

原创粉丝点击