在安装ceph的文档里,也提到了如何查看、编辑和更新crushmap。crushmap与ceph的存储架构有关,在实际中可能需要经常调整它。如下先把它dump出来,再反编译成明文进行查看。
$ ceph osd getcrushmap -o crushmap.original got crush map from osdmap epoch 56 $ crushtool -d crushmap.original -o crushmap
然后查看这个文件:
ceph@ceph:~$ cat crushmap # begin crush map tunable choose_local_tries 0 tunable choose_local_fallback_tries 0 tunable choose_total_tries 50 tunable chooseleaf_descend_once 1 tunable straw_calc_version 1 # devices device 0 osd.0 device 1 osd.1 device 2 osd.2 # types type 0 osd type 1 host type 2 chassis type 3 rack type 4 row type 5 pdu type 6 pod type 7 room type 8 datacenter type 9 region type 10 root # buckets host ceph2 { id -2 # do not change unnecessarily # weight 0.240 alg straw hash 0 # rjenkins1 item osd.0 weight 0.080 item osd.1 weight 0.080 item osd.2 weight 0.080 } root default { id -1 # do not change unnecessarily # weight 0.240 alg straw hash 0 # rjenkins1 item ceph2 weight 0.240 } # rules rule replicated_ruleset { ruleset 0 type replicated min_size 1 max_size 10 step take default step chooseleaf firstn 0 type osd step emit } # end crush map
这个文件包括几节,大概说明下:
- crushmap设备:见上述文件#device后面的内容。这里列举ceph的OSD列表。不管新增还是删除OSD,这个列表会自动更新。通常你无需更改此处,ceph会自动维护。
- crushmap bucket类型:见上述文件#types后面的内容。定义bucket的类型,包括root、datacenter、room、row、rack、host、osd等。默认的bucket类型对大部分ceph集群来说够用了,不过你也可以增加自己的类型。
- crushmap bucket定义:见上述文件#buckets后面的内容。这里定义bucket的层次性架构,也可以定义bucket所使用的算法类型。
- crushmap规则:见上述文件#rules后面的内容。它定义pool里存储的数据应该选择哪个相应的bucket。对较大的集群来说,有多个pool,每个pool有它自己的选择规则。
crushmap的bucket是按层次性分布的,见如下示意图:
crushmap应用的实际场景,举个例子,我们可以定义一个pool名字为SSD,它使用SSD磁盘来提高性能。再定义一个pool名字为SATA,它使用SATA磁盘来获取更好的经济性。不过我手头并没有这样的测试环境,如下配置并非针对我的测试环境进行。假设有3个ceph存储node,每个node上都有独立的osd服务。
首先在crushmap文件里增加如下节:
上述增加2个root bucket,注意id不要冲突。item后面是ceph的node列表,我们假设node1运行SSD硬盘,node2、node3运行SATA硬盘。
再增加2条规则:
- ruleset 3这个规则里,step take sata表示优先选择sata的bucket
- ruleset 4这个规则里,step take ssd表示优先选择ssd的bucket
修改完后,重新编译crushmap并且加载到集群中使之生效。
$ crushtool -c crushmap -o crushmap.new $ ceph osd setcrushmap -i crushmap.new set crush map
接下来观察ceph -s是否健康状态OK。如果健康OK,增加2个pool:
$ ceph osd pool create sata 64 64 $ ceph osd pool create ssd 64 64
给上述2个新创建的pool分配crush规则:
$ ceph osd pool set sata crush_ruleset 3 $ ceph osd pool set ssd crush_ruleset 4
查看规则是否生效:
$ ceph osd dump |egrep -i "ssd|sata"
现在写往sata pool的目标,将优先存储到SATA设备上。写往ssd pool的目标,将优先存储到SSD设备上。可以用rados命令进行测试:
$ rados -p ssd put filename file.ssd $ rados -p sata put filename file.sata
最后使用ceph osd map命令检查它们的存储位置:
$ ceph osd map ssd file.ssd $ ceph osd map sata file.sata