天天看點

ceph Luminous新功能之crush class

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綁定成功。

繼續閱讀