背景
在我们的ceph集群中,可能不只有sata盘或者ssd盘,有些时候服务器上同时插了ssd和sata盘用作osd,那如果我们按照默认的crush分布规则,那会使所有pg均分在ssd和sata盘上,造成sata盘的存储空间浪费和整个ceph集群的性能浪费,其实我们可以改变ceph的默认存储规则,来使那些io要求较高的数据存储在由ssd的osd组成的存储池上,将备份数据或者时效性要求不高的数据存储在由sata的osd组成的存储池上,既提高了性能,又可以减少较大数据量存储的成本。
下面我们就来演示如何利用crush来对不同数据指定不同设备的osd存储,这边我是用虚拟机演示,所以都是hdd,这边假设osd0,2,4为ssd设备,osd 1,3,5为sata设备。
获取当前crushmap并反编译他
ceph osd getcrushmap -o crushmapdump<br style="visibility: visible;">crushtool -d crushmapdump -o crushmapdump-decompiled<br style="visibility: visible;"><br>
编辑crushmapdump文件,并在root default配置之后添加以下部分,分别创建ssd和sata两个bucket,将osd [0,2,4]作为ssd bucket,osd[1,3,5]作为sata bucket。
root ssd {<br> id -5<br> alg straw<br> <span style="color: #e6c07b;line-height: 26px;">hash</span> 0<br> item osd.0 weight 0.010<br> item osd.2 weight 0.010<br> item osd.4 weight 0.010<br>}<br><br>root sata {<br> id -6<br> alg straw<br> <span style="color: #e6c07b;line-height: 26px;">hash</span> 0<br> item osd.1 weight 0.010<br> item osd.3 weight 0.010<br> item osd.5 weight 0.010<br>}<br><br>
创建crush rule
crush map包含crush rule的概念。每个池都有自己的crush ruleset和rule
rule ssd-pool {<br> ruleset 1<br> <span style="color: #e6c07b;line-height: 26px;">type</span> replicated<br> min_size 1<br> max_size 10<br> step take ssd <span style="color: #5c6370;font-style: italic;line-height: 26px;">#使用ssd bucket</span><br> step chooseleaf firstn 0 <span style="color: #e6c07b;line-height: 26px;">type</span> osd<br> step emit<br>}<br>rule sata-pool {<br> ruleset 2<br> <span style="color: #e6c07b;line-height: 26px;">type</span> replicated<br> min_size 1<br> max_size 10<br> step take sata <span style="color: #5c6370;font-style: italic;line-height: 26px;">#使用sata bucket</span><br> step chooseleaf firstn 0 <span style="color: #e6c07b;line-height: 26px;">type</span> osd<br> step emit<br>}<br><br>
在ceph集群中编译并注入新的crush map。
crushtool -c crushmapdump-decompiled -o crushmapdump-compiled <br>ceph osd setcrushmap -i crushmapdump-compiled<br><br>
添加下列参数到ceph.conf配置文件中,防止下次重启时crush恢复回默认配置
osd_crush_update_on_start=<span style="color: #56b6c2;line-height: 26px;">false</span><br>
将crushmap映射到ceph集群后,查看osd tree分布,这里由于我是虚拟机,所以所有的磁盘都是别hdd,这点请忽略
创建并验证ssd-pool
ceph osd pool create ssd-pool 8 8<br>
查看crush_rule为0修改规则集为1,把ssd-pool放到ssd磁盘下
ceph osd pool <span style="color: #e6c07b;line-height: 26px;">set</span> ssd-pool crush_rule ssd-pool<br>
可以看到ssd-pool的池已经使用crush_rule 1了
我们再创建sata-pool池,并做上面操作测试,可以看到sata-pool的池已经使用crush_rule 2了
分别往两个池里写入数据测试
rados -p <pool_name> put <object_name> <file_name><br>
现在验证对象是否存储在正确的osd上,ssd的osd集合为[0 2 4],sata的osd集合为[1,3,5],下图与我们定义的配置完全相同