美文网首页CephCeph
Ceph实践之Crushmap相关

Ceph实践之Crushmap相关

作者: 咏箢 | 来源:发表于2018-11-27 19:55 被阅读114次

    初识crushmap

    CRUSH Map 包含 OSD 列表、“桶”类型、把设备汇聚为物理位置的“桶”列表、和指示 CRUSH 如何复制存储池里的数据的规则列表。

    Crushmap devices

    搭建好集群后(本文所有操作基于ceph版本luminous),在没有添加osd进集群时,此时通过'ceph osd crush dump'查看crushmap的设备,你会发现此时的devices为空。形如:


    初始devices状态.png

    那么,什么操作会导致crushmap的devices写入信息呢?答:将osd加入到集群时。我们来实践一下。


    本文使用的部署集群osd命令如下:
    ///////准备格式化LVM设备并将其与OSD关联:
    ceph-volume lvm prepare --bluestore --data {device-path}
    //////列出与Ceph相关的逻辑卷和设备;可用于查看{osd id} {osd fsid}
    ceph-volume lvm list
    //////激活发现并安装与OSD ID关联的LVM设备并启动Ceph OSD
    ceph-volume lvm activate {osd-id} {osd-fsid}
    /////当需要激活的osd较多时,可以一次性激活所有
    ceph-volume lvm activate --all


    部署集群osd后,观察crushmap devices如下:


    部署osd后devices状态.png

    Crushmap types

    Crushmap中的types定义了所有bucket的类型,集群搭建好后,这些类型就可以查看到。通过ceph osd crush dump查看如下:


    types.png

    在定义bucket分级拓扑结构中,root类型的桶为改分级结构的根节点。

    Crushmap buckets

    Ceph在存储数据的过程中,其CRUSH算法会根据各设备的权重(weight值反映)、大致统一的将数据对象分布到存储设备上。crushmap中的buckets是一系列分级桶实例的集合,其表达的是一种逻辑上的分级拓扑结构 (树型结构)。创建桶分级拓扑接口的目的是CRUSH在存储数据时按故障域隔离叶子节点(osd、host、rock....),数据冗余,达到数据安全。
    在ceph的集群中有一个特殊的名为"default"的桶分级拓扑结构,它从集群搭建好就存在。如下:


    集群搭建完成default桶实例.png

    default桶分级结构包含root、host、osd三种桶类型,其应该如实的反映集群存储设备的关系(集群几个主机、每个主机下有哪些osd).当osd出问题时,可根据该拓扑找到对应的物理硬件。


    操作crushmap bucket相关命令详述:
    1.添加一个bucket实例:
    ceph osd crush add-bucket {bucket-name} {bucket-type}
    上述命令执行后,集群crushmap会多一条形如:
    {
    "id": -9, //唯一id标识
    "name": "data", //bucket_name,该bucket_name不能重复
    "type_id": 1, //buckt_type id ,对应于crushmap的types中的一项
    "type_name": "host",//bucket 实例类型
    "weight": 0,//该bucket的权重
    "alg": "straw2",
    "hash": "rjenkins1",
    "items": []// 该bucket的子bucket信息(树形理解)
    }

    2.移动bucket层级
    ceph osd crush move {bucket-name} {args...}
    执行上述命令后,可以将{buckt-name}移动到{args}指定的层级下, 作为{args}的孩子节点,其中args形如{bucket_type}={name}。

    3.添加osd到一个分级结构
    ceph osd crush add/set osd.{osd-id} {weight} {args}
    上述命令中的{weight}值表明该osd的存储能力(容量),一般1T的盘,weight设为1,{args}知道该osd位置。

    1. 删除层级结构
      将子bucket从父bucket下删除:
      ceph osd crush rm {bucket_name} {parent_bucket_name}
      只有当一个bucket下没有子bucket时,它才能被删除,否则会报错。
      将root bucket删除:
      ceph osd crush rm {bucket_name}

    • 调整dafault层级结构真实反映物理设备情况

    如果不调整default的层级,只是将osd加入集群中,此时是没有分级结构的,如下:


    default分级结构初始态.png

    本文实践的集群环境:3个主机、每个主机下2个osd,其拓扑结构如下:


    default拓扑.png

    调整过程命令如下:

    #添加3个主机
     1082  ceph osd crush  add-bucket node81 host
     1083  ceph osd crush  add-bucket node82 host
     1084  ceph osd crush  add-bucket node85 host
     1085  ceph osd tree
    #将3个主机移动到default下
     1086  ceph osd crush move node81 root=default
     1087  ceph osd tree
     1088  ceph osd crush move node82 root=default
     1089  ceph osd crush move node85 root=default
     1090  ceph osd tree
    #添加osd.0/osd.1到node81下
     1091  ceph osd crush add osd.0 0.00977 root=default host=node81
     1092  ceph osd tree
     1093  ceph osd crush add osd.1 0.00977 root=default host=node81
    #添加osd.0/osd.1到node82下
     1094  ceph osd crush add osd.2 0.00977 root=default host=node82
     1095  ceph osd crush add osd.3 0.00977 root=default host=node82
    #添加osd.0/osd.1到node85下
     1096  ceph osd crush add osd.4 0.00977 root=default host=node85
     1097  ceph osd crush add osd.5 0.00977 root=default host=node85
     1098  ceph osd tree
     1099  history
    

    创建完成后,集群的default拓扑图如下:


    创建完成后default层级.png
    • 完整创建一个自定义分级拓扑:
    #创建root bucket
     1105  ceph osd crush add-bucket data root
    #创建各层级
     1106  ceph osd crush add-bucket data_node81 host
     1107  ceph osd crush add-bucket data_node82 host
     1108  ceph osd crush add-bucket data_node85 host
    #调整各层级
     1109  ceph osd crush move data_node81 root=data
     1110  ceph osd crush move data_node82 root=data
     1111  ceph osd crush move data_node85 root=data
    #添加osd
     1112  ceph osd crush add osd.1 0.00977 root=data host=data_node81
     1113  ceph osd crush add osd.0 0.00977 root=data host=data_node81
     1114  ceph osd crush add osd.2 0.00977 root=data host=data_node82
     1115  ceph osd crush add osd.3 0.00977 root=data host=data_node82
     1116  ceph osd crush add osd.4 0.00977 root=data host=data_node85
     1117  ceph osd crush add osd.5 0.00977 root=data host=data_node85
     1118  ceph osd tree
     1119  history
    

    完成后如下:


    6.png
    • 删除一个完整的层级结构实践
    #将osd.0、osd.1从node81删除(删除叶子节点)
     1129  ceph osd crush rm osd.0 data_node81
     1130  ceph osd crush rm osd.1 data_node81
     1131  ceph osd tree
    #将主机data_node81从data下删除
     1132  ceph osd crush rm data_node81 data
    #将osd.2、osd.3从node82删除
     1133  ceph osd crush rm osd.2 data_node82
     1134  ceph osd crush rm osd.3 data_node82
     1135  ceph osd crush rm data_node82 data
    #将osd.4、osd.5从node85删除
     1136  ceph osd crush rm osd.4 data_node85
     1137  ceph osd crush rm osd.5 data_node85
     1138  ceph osd crush rm data_node85 data
     1139  ceph osd tree
    删除root bucket(data)
     1140  ceph osd crush rm data
     1141  history
    

    Crushmap rules

    crushmap中的rules是一系列存储池规则的集合。存储池规则(rule)确定一个存储池的数据如何归置:数据的冗余份数、数据隔离级别等。下面简单的查看说明一下:

    //查看当前集群所有的的crush rule name
    [root@node81 ~]# ceph osd crush rule list
    replicated_rule
    
    //查看当前集群所有的的crush rule详情
    [root@node81 ~]# ceph osd crush rule dump
    [
        {
            "rule_id": 0,  #rule id(唯一表示)
            "rule_name": "replicated_rule",#rule name
            "ruleset": 0,#区分一条规则属于某个规则集的手段
            "type": 1,#rule 类型(纠删码或副本)
            "min_size": 1,#可以选择此规则的存储池最小副本数
            "max_size": 10,#可以选择此规则的存储池最大副本数
            "steps": [
                {
                    "op": "take",
                    "item": -1,
                    "item_name": "default" #root bucket(根节点)
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"  #隔离数据粒度(故障域级别)
                },
                {
                    "op": "emit"
                }
            ]
        }
    ]
    
    [root@node81 ~]# 
    
    

    编辑crushmap

    1.获取集群crushmap
    ceph osd getcrushmap -o {file1}
    {file1}为自定义的文件名,该文件为二进制文件,不可编辑。要想编辑此文件,需要用工具将其反编译解析,如crushtool工具。

    2反编译crushmap
    crushtool -d {file1} -o {file2}
    反编译二进制文件{file1}得到可编辑文件{file2}

    3.编辑crushmap
    按自我需求修改可编辑文件{file2}

    4.编译crushmap
    要想编辑后的文件机器能够识别,必须用工具编译它生成二进制文件。
    crushtool -c {file2} -o {file3}

    5.注入crushmap
    要想新的crushmap在集群中生效,必须将其注入要集群。
    ceph osd setcrushmap -i {file3}

    参考资料:
    1.ceph 官方文档
    更多详情,详见官网:
    http://docs.ceph.org.cn/rados/operations/crush-map/

    相关文章

      网友评论

        本文标题:Ceph实践之Crushmap相关

        本文链接:https://www.haomeiwen.com/subject/yyynxqtx.html