Ceph实践之Crushmap相关

初识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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容