如何在單節(jié)點 Ceph 中配置多數(shù)據(jù)副本

crush.png

在服務器資源不足,或者測試環(huán)境下,Ceph 通常只有一個節(jié)點,就算有多個服務器組成集群,往往存儲服務器也往往只有一臺,Ceph 的默認配置下,只能設置單數(shù)據(jù)備份,也就是說數(shù)據(jù)只存了一份,如果磁盤壞了,數(shù)據(jù)就丟了。雖然測試環(huán)境數(shù)據(jù)沒那么重要,總保不齊就會有關鍵數(shù)據(jù)放在上面,所以還是要想辦法在資源有限的條件下實現(xiàn)數(shù)據(jù)的高可用,另外這也是一個很好的進一步理解 Ceph 概念的好機會,接下來就讓我們來看看是如何實現(xiàn)的吧。

1. CRUSH map 規(guī)則介紹

為了把這件事說清楚,我們需要了解 CRUSH map 一些具體規(guī)則,所以先來看一下默認的 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 集群中只有一臺存儲服務器:rbd-osd1,上面有 24 塊硬盤。
要實現(xiàn)單存儲上多備份,關鍵就在這行配置上:step chooseleaf firstn 0 type host
這句話的意思是,從選定的 bucket(也就是 host rbd-osd1)中,獲取默認個(也就是 osd_pool_default_size 個,這是在 /etc/ceph/ceph.conf 中配置的)葉子節(jié)點(也就是 rbd-osd1 中包含的那 24 個 item),葉子節(jié)點的類型為 host。
默認配置出問題的地方就是在葉子節(jié)點的類型上,osd_pool_default_size 默認值是三,也就是說,需要找三個 host 類型的 bucket,host 對應的就是存儲服務器,我們現(xiàn)在只有一個,當然不滿足需求了。從 ceph 的狀態(tài)上也能看出來,所有的 OSD 都因為 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

了解到問題所在,接下來就動手修改吧,CRUSH map 支持兩種修改方式,一種是命令行,優(yōu)點是單條命令很簡單,缺點是不夠直觀;第二種是手動修改配置文件,優(yōu)點是所見即所得,缺點是麻煩一點,需要先導出,解碼,修改,最后再編碼,導入。這里因為修改的內(nèi)容頗為具體,所以采用第二種方法。

先將 CRUSH map 導出到文件 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

最后導入。

$ ceph osd setcrushmap -o crush-map

3. 修改 /etc/ceph/ceph.conf

不過事情沒有那么簡單,還需要配合 ceph.conf 的修改才行,我們要修改 osd_crush_chooseleaf_type。
這個參數(shù)每個取值的意義在 Ceph 的官方文檔中,有明確的說明,0 是給單節(jié)點的 ceph 集群使用的,而 1 是默認值,所以我們需要修改。

#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 集群中的服務器中:

$ cat ceph.conf
...
osd_crush_chooseleaf_type = 0
...

$ ceph-deploy --overwrite-conf config push rbd-master1 rbd-osd1

4. 動態(tài)修改 ceph 配置

至此問題還是沒有完全解決,原因是配置文件的變動需要,進程的重啟才能生效,不重啟有沒有辦法讓改動生效呢?有的,需要使用的 ceph daemon 命令。

sudo ceph daemon mon.rbd-master1 config set osd_pool_default_size 0

5. 參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容