分布式存储ceph之crush规则配置
一 命令生成osd树形结构
# 创建数据中心:datacenter0 ceph osd crush add-bucket datacenter0 datacenter # 创建机房:room0 ceph osd crush add-bucket room0 room # 创建机架:rack0、rack1、rack2 ceph osd crush add-bucket rack0 rack ceph osd crush add-bucket rack1 rack ceph osd crush add-bucket rack2 rack # 把机房room0移动到数据中心datacenter0下 ceph osd crush move room0 datacenter=datacenter0 # 把机架rack0、rack1、rack2移动到机房room0下 ceph osd crush move rack0 room=room0 ceph osd crush move rack1 room=room0 ceph osd crush move rack2 room=room0 # 把主机osd01移动到:datacenter0/room0/rack0下 ceph osd crush move osd01 datacenter=datacenter0 room=room0 rack=rack0 # 把主机osd02移动到:datacenter0/room0/rack1下 ceph osd crush move osd02 datacenter=datacenter0 room=room0 rack=rack1 # 把主机osd03移动到:datacenter0/room0/rack2下 ceph osd crush move osd03 datacenter=datacenter0 room=room0 rack=rack2
查看
[root@admin ~]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -9 0.17537 datacenter datacenter0 -10 0.17537 room room0 -11 0.05846 rack rack0 -3 0.05846 host osd01 0 hdd 0.01949 osd.0 up 1.00000 1.00000 1 hdd 0.01949 osd.1 up 1.00000 1.00000 2 hdd 0.01949 osd.2 up 1.00000 1.00000 -12 0.05846 rack rack1 -5 0.05846 host osd02 3 hdd 0.01949 osd.3 up 1.00000 1.00000 4 hdd 0.01949 osd.4 up 1.00000 1.00000 5 hdd 0.01949 osd.5 up 1.00000 1.00000 -13 0.05846 rack rack2 -7 0.05846 host osd03 6 hdd 0.01949 osd.6 up 1.00000 1.00000 7 hdd 0.01949 osd.7 up 1.00000 1.00000 8 hdd 0.01949 osd.8 up 1.00000 1.00000 -1 0 root default
二 crushmap信息介绍
我们可以通过命令导出集群当前的crushmap信息
# 把二进制格式的crush map导出到test.bin文件中 ceph osd getcrushmap -o test.bin # 用 crushtool 工具把 test.bin 里的二进制数据转换成文本形式保存到 test.txt 文档里。 crushtool -d test.bin -o test.txt
crushmap配置中最核心的当属rule了,crush rule决定了三点重要事项:
- 1、从OSDMap中的哪个节点开始查找
- 2、使用那个节点作为故障隔离域
- 3、定位副本的搜索模式(广度优先 or 深度优先)。
# rules rule egon_ruleset #规则集的命名,创建pool时可以指定rule集 { id 1 #rules集的编号,顺序编即可 type replicated #定义pool类型为replicated(还有esurecode模式) min_size 1 #pool中最小指定的副本数量不能小1\ max_size 10 #pool中最大指定的副本数量不能大于10 step take default #定义pg查找副本的入口点 step chooseleaf firstn 0 type host #选叶子节点、深度优先、隔离host step emit #结束 }
总结
pg 选择osd的过程,首先要知道在rules中 指明从osdmap中哪个节点开始查找,入口点默认为default也就是root节点, 然后隔离域为host节点(也就是同一个host下面不能选择两个子节点)。由default到3个host的选择过程, 这里由default根据节点的bucket类型选择下一个子节点,由子节点再根据本身的类型继续选择,直到选择到host,然后在host下选择一个osd。