
在服務(wù)器資源不足,或者測(cè)試環(huán)境下,Ceph 通常只有一個(gè)節(jié)點(diǎn),就算有多個(gè)服務(wù)器組成集群,往往存儲(chǔ)服務(wù)器也往往只有一臺(tái),Ceph 的默認(rèn)配置下,只能設(shè)置單數(shù)據(jù)備份,也就是說數(shù)據(jù)只存了一份,如果磁盤壞了,數(shù)據(jù)就丟了。雖然測(cè)試環(huán)境數(shù)據(jù)沒那么重要,總保不齊就會(huì)有關(guān)鍵數(shù)據(jù)放在上面,所以還是要想辦法在資源有限的條件下實(shí)現(xiàn)數(shù)據(jù)的高可用,另外這也是一個(gè)很好的進(jìn)一步理解 Ceph 概念的好機(jī)會(huì),接下來就讓我們來看看是如何實(shí)現(xiàn)的吧。
1. CRUSH map 規(guī)則介紹
為了把這件事說清楚,我們需要了解 CRUSH map 一些具體規(guī)則,所以先來看一下默認(rèn)的 CRUSH map。
$ cat crush-map-decompiled
...
# buckets
host rbd-osd1 {
id -3 # do not change unnecessarily
id -4 class hdd # do not change unnecessarily
# weight 130.992
alg straw2
hash 0 # rjenkins1
item osd.0 weight 5.458
item osd.1 weight 5.458
item osd.2 weight 5.458
item osd.3 weight 5.458
item osd.4 weight 5.458
item osd.5 weight 5.458
item osd.6 weight 5.458
item osd.7 weight 5.458
item osd.8 weight 5.458
item osd.9 weight 5.458
item osd.10 weight 5.458
item osd.11 weight 5.458
item osd.12 weight 5.458
item osd.13 weight 5.458
item osd.14 weight 5.458
item osd.15 weight 5.458
item osd.16 weight 5.458
item osd.17 weight 5.458
item osd.18 weight 5.458
item osd.19 weight 5.458
item osd.20 weight 5.458
item osd.21 weight 5.458
item osd.22 weight 5.458
item osd.23 weight 5.458
}
root default {
id -1 # do not change unnecessarily
id -2 class hdd # do not change unnecessarily
# weight 130.992
alg straw2
hash 0 # rjenkins1
item rbd-osd1 weight 130.992
}
# rules
rule replicated_rule {
id 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
我們可以看到,Ceph 集群中只有一臺(tái)存儲(chǔ)服務(wù)器:rbd-osd1,上面有 24 塊硬盤。
要實(shí)現(xiàn)單存儲(chǔ)上多備份,關(guān)鍵就在這行配置上:step chooseleaf firstn 0 type host
這句話的意思是,從選定的 bucket(也就是 host rbd-osd1)中,獲取默認(rèn)個(gè)(也就是 osd_pool_default_size 個(gè),這是在 /etc/ceph/ceph.conf 中配置的)葉子節(jié)點(diǎn)(也就是 rbd-osd1 中包含的那 24 個(gè) item),葉子節(jié)點(diǎn)的類型為 host。
默認(rèn)配置出問題的地方就是在葉子節(jié)點(diǎn)的類型上,osd_pool_default_size 默認(rèn)值是三,也就是說,需要找三個(gè) host 類型的 bucket,host 對(duì)應(yīng)的就是存儲(chǔ)服務(wù)器,我們現(xiàn)在只有一個(gè),當(dāng)然不滿足需求了。從 ceph 的狀態(tài)上也能看出來,所有的 OSD 都因?yàn)? OSD 數(shù)量不足,處于 active+undersized 狀態(tài)。
$ ceph -s
...
data:
pools: 1 pools, 64 pgs
objects: 0 objects, 0 bytes
usage: 25001 MB used, 130 TB / 130 TB avail
pgs: 64 active+undersized
2. 修改 CRUSH map
了解到問題所在,接下來就動(dòng)手修改吧,CRUSH map 支持兩種修改方式,一種是命令行,優(yōu)點(diǎn)是單條命令很簡(jiǎn)單,缺點(diǎn)是不夠直觀;第二種是手動(dòng)修改配置文件,優(yōu)點(diǎn)是所見即所得,缺點(diǎn)是麻煩一點(diǎn),需要先導(dǎo)出,解碼,修改,最后再編碼,導(dǎo)入。這里因?yàn)樾薷牡膬?nèi)容頗為具體,所以采用第二種方法。
先將 CRUSH map 導(dǎo)出到文件 crush-map 中。
$ ceph osd getcrushmap -o crush-map
然后解碼,并輸出到文件 crush-map-decompiled 中。
$ crushtool -d crush-map -o crush-map-decompiled
修改 crush-map-decompiled,將 type 改為 osd,即可
$ cat crush-map-decompiled
...
# rules
rule replicated_rule {
id 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type osd
step emit
}
將改好的文件編碼到文件 crush-map 中。
$ crushtool -c crush-map-decompiled -o crush-map
最后導(dǎo)入。
$ ceph osd setcrushmap -o crush-map
3. 修改 /etc/ceph/ceph.conf
不過事情沒有那么簡(jiǎn)單,還需要配合 ceph.conf 的修改才行,我們要修改 osd_crush_chooseleaf_type。
這個(gè)參數(shù)每個(gè)取值的意義在 Ceph 的官方文檔中,有明確的說明,0 是給單節(jié)點(diǎn)的 ceph 集群使用的,而 1 是默認(rèn)值,所以我們需要修改。
#Choose a reasonable crush leaf type.
#0 for a 1-node cluster.
#1 for a multi node cluster in a single rack
#2 for a multi node, multi chassis cluster with multiple hosts in a chassis
#3 for a multi node cluster with hosts across racks, etc.
osd crush chooseleaf type = {n}
集群是使用 ceph-deploy 來部署的,所以需要修改 ceph-deploy 目錄下的文件,然后推送到 ceph 集群中的服務(wù)器中:
$ cat ceph.conf
...
osd_crush_chooseleaf_type = 0
...
$ ceph-deploy --overwrite-conf config push rbd-master1 rbd-osd1
4. 動(dòng)態(tài)修改 ceph 配置
至此問題還是沒有完全解決,原因是配置文件的變動(dòng)需要,進(jìn)程的重啟才能生效,不重啟有沒有辦法讓改動(dòng)生效呢?有的,需要使用的 ceph daemon 命令。
sudo ceph daemon mon.rbd-master1 config set osd_pool_default_size 0
5. 參考文檔
- MANUALLY EDITING A CRUSH MAP
- POOL, PG AND CRUSH CONFIG REFERENCE
- Another method to dynamically change a Ceph configuration
- Bug 1492248 - Need Better Error Message when OSD count is less than osd_pool_default_size
- CONFIGURING CEPH
- CRUSH MAPS
- COMMON SETTINGS
- [ceph-users] CRUSH rule for 3 replicas across 2 hosts