我們一起在 Ceph 指定OSD 創建 pool
背景
在我們的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
crushtool -d crushmapdump -o crushmapdump-decompiled
編輯crushmapdump文件,并在root default配置之后添加以下部分,分別創建ssd和sata兩個bucket,將osd [0,2,4]作為ssd bucket,osd[1,3,5]作為sata bucket。
root ssd {
id -5
alg straw
hash 0
item osd.0 weight 0.010
item osd.2 weight 0.010
item osd.4 weight 0.010
}
root sata {
id -6
alg straw
hash 0
item osd.1 weight 0.010
item osd.3 weight 0.010
item osd.5 weight 0.010
}
創建crush rule
crush map包含crush rule的概念。每個池都有自己的crush ruleset和rule。
rule ssd-pool {
ruleset 1
type replicated
min_size 1
max_size 10
step take ssd
step chooseleaf firstn 0 type osd
step emit
}
rule sata-pool {
ruleset 2
type replicated
min_size 1
max_size 10
step take sata
step chooseleaf firstn 0 type osd
step emit
}
在ceph急群眾編譯并注入新的crush map。
crushtool -c crushmapdump-decompiled -o crushmapdump-compiled
ceph osd setcrushmap -i crushmapdump-compiled
添加下列參數到ceph.conf配置文件中,防止下次重啟時crush恢復回默認配置。
osd_crush_update_on_start=false
將crushmap映射到ceph集群后,查看osd tree分布,這里由于我是虛擬機,所以所有的磁盤都是別hdd,這點請忽略。
創建并驗證ssd-pool。
ceph osd pool create ssd-pool 8 8
查看crush_rule為0。
修改規則集為1,把ssd-pool放到ssd磁盤下。
ceph osd pool set ssd-pool crush_rule ssd-pool
可以看到ssd-pool的池已經使用crush_rule 1了 我們再創建sata-pool池,并做上面操作測試,可以看到sata-pool的池已經使用crush_rule 2了。
分別往兩個池里寫入數據測試
rados -p <pool_name> put <object_name> <file_name>
現在驗證對象是否存儲在正確的osd上,ssd的osd集合為[0 2 4],sata的osd集合為[1,3,5],下圖與我們定義的配置完全相同。