zoukankan      html  css  js  c++  java
  • ceph luminous 新功能之磁盘智能分组

    前言

    本篇是luminous一个新功能介绍,关于磁盘智能分组的,这个在ceph里面叫crush class,这个我自己起名叫磁盘智能分组,因为这个实现的功能就是根据磁盘类型进行属性关联,然后进行分类,减少了很多的人为操作

    以前我们需要对ssd和hdd进行分组的时候,需要大量的修改crush map,然后绑定不同的存储池到不同的 crush 树上面,现在这个逻辑简化了很多

    ceph crush class {create,rm,ls} manage the new CRUSH device

    class feature. ceph crush set-device-class

    will set the clas for a particular device.

    Each OSD can now have a device class associated with it (e.g., hdd or

    ssd), allowing CRUSH rules to trivially map data to a subset of devices

    in the system. Manually writing CRUSH rules or manual editing of the CRUSH is normally not required.

    这个是发布的公告里面关于这两个功能的说明的,本篇就来看看这个功能怎么用

    实践

    首先创建分类的规则

    创建一个ssd的分组

    [root@lab8106 ceph]# ceph osd crush class create  ssd
    created class ssd with id 0 to crush map
    

    也就是一个名称,这里我认为是ssd的分组就创建名词为ssd

    再创建一个hdd的分组

    [root@lab8106 ceph]# ceph osd crush class create  hdd
    created class hdd with id 1 to crush map
    

    查询分组规则

    [root@lab8106 ceph]# ceph osd crush class ls
    [
        "ssd",
        "hdd"
    ]
    

    把osd绑定不同的属性(属性名称就是上面的分类)

    [root@lab8106 ceph]# ceph osd crush set-device-class osd.0  ssd
    set-device-class item id 0 name 'osd.0' device_class ssd
    [root@lab8106 ceph]# ceph osd crush set-device-class osd.2  ssd
    set-device-class item id 2 name 'osd.2' device_class ssd
    [root@lab8106 ceph]# ceph osd crush set-device-class osd.1  hdd
    set-device-class item id 1 name 'osd.1' device_class hdd
    [root@lab8106 ceph]# ceph osd crush set-device-class osd.3  hdd
    set-device-class item id 3 name 'osd.3' device_class hdd
    

    查询设置以后的效果

    [root@lab8106 ceph]# ceph osd tree
    ID WEIGHT  TYPE NAME            UP/DOWN REWEIGHT PRIMARY-AFFINITY 
    -6 0.54559 root default~hdd                                       
    -5 0.54559     host lab8106~hdd                                   
     1 0.27280         osd.1             up  1.00000          1.00000 
     3 0.27280         osd.3             up  1.00000          1.00000 
    -4 0.54559 root default~ssd                                       
    -3 0.54559     host lab8106~ssd                                   
     0 0.27280         osd.0             up  1.00000          1.00000 
     2 0.27280         osd.2             up  1.00000          1.00000 
    -1 1.09119 root default                                           
    -2 1.09119     host lab8106                                       
     0 0.27280         osd.0             up  1.00000          1.00000 
     1 0.27280         osd.1             up  1.00000          1.00000 
     2 0.27280         osd.2             up  1.00000          1.00000 
     3 0.27280         osd.3             up  1.00000          1.00000 
    

    这个就是这个功能比较核心的地方,会根据磁盘类型不同,自动的创建了不同的树,并且把磁盘放入到了树里面去了

    根据根创建规则(这个地方有bug,下面会提及)

    [root@lab8106 ceph]# ceph osd crush rule create-simple ssd default~ssd host firstn
    

    检查创建的rule规则:

    [root@lab8106 build]# ceph   osd  crush rule  dump ssd
    {
        "rule_id": 1,
        "rule_name": "ssd",
        "ruleset": 1,
        "type": 1,
        "min_size": 1,
        "max_size": 10,
        "steps": [
            {
                "op": "take",
                "item": -4,
                "item_name": "default~ssd"
            },
            {
                "op": "chooseleaf_firstn",
                "num": 0,
                "type": "host"
            },
            {
                "op": "emit"
            }
        ]
    }
    

    根据rule创建存储池

    ceph  osd pool create testpool 64 64 ssd
    ceph   osd dump|grep pool
    pool 3 'testpool' replicated size 3 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 27 flags hashpspool stripe_width 0
    

    这里有个验证规则的小bug 代码在src/mon/MonCommands.h

     COMMAND("osd crush rule create-simple " 
    "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " 
    "name=root,type=CephString,goodchars=[A-Za-z0-9-_.] " 
    "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] " 
    

    默认的goodchars不包含'~',这里不清楚社区是准备去改创建的逻辑去掉这个特殊符号,还是去改创建rule相关的规则,我已经提交了issue#20446,等待社区的修改方案

    功能逻辑

    现在方法

    创建一个磁盘类型的class,给磁盘标记class的统一标签,自动会根据class的类型创建一个树,根据树创建rule,根据rule创建存储池,整个操作没有动crushmap的操作

    增加或修改盘的时候,设置下属性即可

    以前的方法

    先添加盘,手动创建树,新加的osd要找下原来的树的名称,然后把osd放到这个树里面去,然后创建规则,根据rule创建存储池

    增加盘或修改盘的时候,需要查找下,然后根据查找的规则进行相关操作

    总结

    现在方法对用户操作来说更透明,直接对磁盘进行分类打标签即可,减少了一些复杂的操作逻辑,是一个很不错的功能

    更新

    后面会在crush rule创建的时候指定一个class的选项,就可以不改规则,也不改命令了
    https://www.spinics.net/lists/ceph-devel/msg37343.html,下个版本的rc应该会解决

    变更记录

    Why Who When
    创建 武汉-运维-磨渣 2017-06-28
    更新进度 武汉-运维-磨渣 2017-06-28
  • 相关阅读:
    3.1.3、控制结构
    3.1.2、变量
    3.1.1、渲染模板
    3.1、Jinja2模板引擎
    第3章 模板
    2.6、Flask扩展
    2.5.4、响应
    2.5.3、请求钩子
    2.5.2、请求调度
    2.5.1、程序和请求上下文
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575453.html
Copyright © 2011-2022 走看看