维护ceph的crushmap

安装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是按层次性分布的,见如下示意图:

crushlevel

crushmap应用的实际场景,举个例子,我们可以定义一个pool名字为SSD,它使用SSD磁盘来提高性能。再定义一个pool名字为SATA,它使用SATA磁盘来获取更好的经济性。不过我手头并没有这样的测试环境,如下配置并非针对我的测试环境进行。假设有3个ceph存储node,每个node上都有独立的osd服务。

首先在crushmap文件里增加如下节:

crushssd

上述增加2个root bucket,注意id不要冲突。item后面是ceph的node列表,我们假设node1运行SSD硬盘,node2、node3运行SATA硬盘。

再增加2条规则:

crushrule

  • 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
此条目发表在Common分类目录,贴了, 标签。将固定链接加入收藏夹。