背景在我们的ceph集群中,可能不仅仅只有sata盘或者ssd盘。有时ssd和sata磁盘都作为osd插入服务器。如果我们按照默认的crush分布规则,会使得所有pg均匀分布在ssd和sata磁盘上,造成sata磁盘存储空间的浪费和整个ceph集群的性能浪费。其实我们可以改变ceph默认的存储规则,让那些对io要求较高的数据存储在ssdosd组成的存储池中,备份数据或者对时效性要求不高的数据存储在osd组成的存储池中sataosd,不仅提高了性能,还降低了存储大量数据的成本。接下来,我们将演示如何使用crush为不同的数据指定不同设备的osd存储。这里我用虚拟机来演示,所以都是hdd。这里我们假设osd0、2、4是ssd设备,osd1、3、5是sata设备。获取当前crushmap并反编译cephosdgetcrushmap-ocrushmapdumpcrushtool-dcrushmapdump-ocrushmapdump-decompiled编辑crushmapdump文件,在root默认配置后添加如下部分,分别创建ssd和sata两个bucket,设置osd[0,2,4]作为ssd桶,osd[1,3,5]作为sata桶。rootssd{id-5algstrawhash0itemosd.0weight0.010itemosd.2weight0.010itemosd.4weight0.010}rootsata{id-6??algstrawhash0itemosd.1weight0.010itemosd.3weight0.010itemosd.5weight0.010}创建crushrulecrushmap包含crushrule的概念。每个池都有自己的crush规则集和规则。rulessd-pool{ruleset1typereplicatedmin_size1max_size10steptakessdstepchooseleaffirstn0typeosdstepemit}rulesata-pool{rulesata-pool{ruleset2typereplicatedmin_size1max_size10typetakeosdsatastepchooseleaf}0fir快速编译和在ceph中注入新的crushmap。crushtool-ccrushmapdump-decompiled-ocrushmapdump-compiledcephosdsetcrushmap-icrushmapdump-compiled在ceph.conf配置文件中加入如下参数,防止下次重启crush时返回默认配置。osd_crush_update_on_start=false将crushmap映射到ceph集群后,查看osd树分布。由于我是虚拟机,所有盘都不是hdd,请无视。创建并验证ssd-pool。cephosdpoolcreatessd-pool88查看crush_rule是否为0,修改规则集为1,将ssd-pool放在ssd盘下。cephosdpoolsetssd-poolcrush_rulessd-pool可以看到ssd-pool的pool已经使用了crush_rule1,我们来创建一个sata-poolpool,做上面的运行测试。可以看到sata-pool的pool已经用上了crush_rule2。分别向两个pool写入数据测试rados-p
