增加/刪除 OSD
如果您的集群已經(jīng)在運行,你可以在運行時添加或刪除 OSD 。
增加 OSD
你遲早要擴容集群, Ceph 允許在運行時增加 OSD 。在 Ceph 里,一個 OSD 一般是一個守護進程,它運行在硬盤之上,如果你有多個硬盤,可以給每個硬盤啟動一個ceph-osd守護進程。
通常,你應(yīng)該監(jiān)控集群容量,看是否達到了容量上限,因為達到了它的 near full 比率后,要增加一個或多個 OSD 來擴容。
Warning
不要等空間滿了再增加 OSD ,空間使用率達到 near full 比率后, OSD 失敗可能導致集群空間占滿。
部署硬件
如果你通過增加主機來增加 OSD ,關(guān)于 OSD 服務(wù)器硬件的配置請參見硬件推薦。要把一臺 OSD 主機加入到集群,首先要安裝最新版的 Linux ,而且存儲硬盤要做好必要的準備,詳情參見文件系統(tǒng)推薦。
把 OSD 主機添加到集群機架上,連接好網(wǎng)絡(luò)、確保網(wǎng)絡(luò)通暢。詳情見網(wǎng)絡(luò)配置參考。
安裝必要軟件
在手動部署的集群里,你必須手動安裝 Ceph 軟件包,詳情見安裝 Ceph(手動)。你應(yīng)該配置一個無密碼登錄 SSH 的用戶,且他有 root 權(quán)限。
增加 OSD (手動)
此過程要設(shè)置一個 ceph-osd 守護進程,讓它使用一個硬盤,且讓集群把數(shù)據(jù)發(fā)布到 OSD 。如果一臺主機有多個硬盤,可以重復(fù)此過程,把每個硬盤配置為一個 OSD 。要添加 OSD ,要依次創(chuàng)建數(shù)據(jù)目錄、把硬盤掛載到目錄、把 OSD 加入集群、然后把它加入 CRUSH map中。
往 CRUSH map里添加 OSD 時建議設(shè)置權(quán)重,硬盤容量每年增長 40% ,所以較新的 OSD 主機擁有更大的空間(即它們可以有更大的權(quán)重)。
Tip
Ceph 喜歡統(tǒng)一的硬件,與存儲池無關(guān)。如果你要新增容量不一的驅(qū)動器,還需調(diào)整它們的權(quán)重。但是,為實現(xiàn)最佳性能,CRUSH 的分級結(jié)構(gòu)最好按類型、容量定義。
-
創(chuàng)建 OSD 。如果未指定 UUID , OSD 啟動時會自動生成一個。下列命令會輸出 OSD 號,后續(xù)步驟你會用到。
ceph osd create [{uuid} [{id}]]
如果指定了可選參數(shù) {id} ,那么它將作為 OSD id 。要注意,如果此數(shù)字已使用,此命令會出錯。
Warning
一般來說,我們不建議指定 {id} 。因為 ID 是按照數(shù)組分配的,跳過一些依然會浪費內(nèi)存;尤其是跳過太多、或者集群很大時,會更明顯。若未指定 {id} ,將用最小可用數(shù)字。
-
在新 OSD 主機上創(chuàng)建默認目錄。
ssh {new-osd-host} sudo mkdir /var/lib/ceph/osd/ceph-{osd-number} -
如果準備用于 OSD 的是單獨的而非系統(tǒng)盤,先把它掛載到剛創(chuàng)建的目錄下:
ssh {new-osd-host} sudo mkfs -t {fstype} /dev/{drive} sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number} -
初始化 OSD 數(shù)據(jù)目錄。
ssh {new-osd-host} ceph-osd -i {osd-num} --mkfs --mkkey運行ceph-osd時目錄必須是空的。
-
注冊 OSD 認證密鑰,ceph-{osd-num} 路徑里的 ceph 值應(yīng)該是$cluster-$id ,如果你的集群名字不是 ceph,那就用改過的名字。
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring -
把 OSD 加入 CRUSH 圖,這樣它才開始接收數(shù)據(jù)。用 ceph osd crush add 命令把 OSD 加入 CRUSH 分級結(jié)構(gòu)的合適位置。如果你指定了不止一個桶,此命令會把它加入你所指定的桶中最具體的一個,并且把此桶挪到你指定的其它桶之內(nèi)。重要:如果你只指定了 root 桶,此命令會把 OSD 直接掛到 root 下面,但是 CRUSH 規(guī)則期望它位于主機內(nèi)。
若用的是 v0.48 版,執(zhí)行下列命令:
ceph osd crush add {id} {name} {weight} [{bucket-type}={bucket-name} ...]若用的是 v0.56 及更高版,執(zhí)行下列命令:
ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]你也可以反編譯 CRUSH 圖、把 OSD 加入設(shè)備列表、以桶的形式加入主機(如果它沒在 CRUSH 圖里)、以條目形式把設(shè)備加入主機、分配權(quán)重、重編譯并應(yīng)用它。詳情參見增加/移動 OSD 。
Argonaut 0.48 版最佳實踐
為降低對用戶 I/O 性能的影響,加入 CRUSH 圖時應(yīng)該把 OSD 的初始權(quán)重設(shè)為 0 ,然后每次增大一點、逐步增大 CRUSH 權(quán)重。例如每次增加 0.2 :
ceph osd crush reweight {osd-id} .2
遷移完成前,可以依次把權(quán)重重置為 0.6 等等,直到達到期望權(quán)重。
為降低 OSD 失敗的影響,你可以設(shè)置:
mon osd down out interval = 0
它防止掛了的 OSD 自動被標記為 out ,然后逐步降低其權(quán)重:
ceph osd reweight {osd-num} .8
還是等著集群完成數(shù)據(jù)遷移,然后再次調(diào)整權(quán)重,直到權(quán)重為 0 。注意,這會阻止集群在發(fā)生故障時自動重復(fù)制數(shù)據(jù),所以要確保監(jiān)控的及時性,以便管理員迅速介入。
注意,以上經(jīng)驗在 Bobtail 及后續(xù)版本已不再必要。
啟動 OSD
把 OSD 加入 Ceph 后, OSD 就在配置里了。然而它還沒運行,它現(xiàn)在的狀態(tài)為 out 。你必須先啟動 OSD 它才能收數(shù)據(jù)??梢杂霉芾碇鳈C上的service ceph 、或從 OSD 所在主機啟動。
在 Debian/Ubuntu 上用 Upstart。
sudo start ceph-osd id={osd-num}
在 CentOS/RHEL 上用 sysvinit 。
sudo /etc/init.d/ceph start osd.{osd-num}
一旦你啟動了 OSD ,其狀態(tài)就變成了 up 且 in 。
觀察數(shù)據(jù)遷移
把新 OSD 加入 CRUSH 圖后, Ceph 會重新均衡服務(wù)器,一些歸置組會遷移到新 OSD 里,你可以用 ceph 命令觀察此過程。
ceph -w
你會看到歸置組狀態(tài)從 active+clean 變?yōu)?active, some degraded objects (有降級的對象)、且遷移完成后回到 active+clean 狀態(tài)。( Ctrl-c 退出)
刪除 OSD (手動)
要想縮減集群尺寸或替換硬件,可在運行時刪除 OSD 。在 Ceph 里,一個 OSD 通常是一臺主機上的一個 ceph-osd守護進程、它運行在一個硬盤之上。如果一臺主機上有多個數(shù)據(jù)盤,你得挨個刪除其對應(yīng)ceph-osd。通常,操作前應(yīng)該檢查集群容量,看是否快達到上限了,確保刪除 OSD 后不會使集群達到near full 比率。
Warning
刪除 OSD 時不要讓集群達到full ratio 值,刪除 OSD 可能導致集群達到或超過 full ratio值。
把 OSD 踢出集群[]
刪除 OSD 前,它通常是in 的,要先把它踢出集群,以使 Ceph 啟動重新均衡、把數(shù)據(jù)拷貝到其他 OSD 。
ceph osd out {osd-num}
觀察數(shù)據(jù)遷移
一旦把 OSD 踢出集群, Ceph 就會開始重新均衡集群、把歸置組遷出將刪除的 OSD 。你可以用 ceph 工具觀察此過程。
ceph -w
你會看到歸置組狀態(tài)從active+clean 變?yōu)?active, some degraded objects 、遷移完成后最終回到 active+clean 狀態(tài)。( Ctrl-c 中止)
Note
有時候,(通常是只有幾臺主機的“小”集群,比如小型測試集群)拿出( out )某個 OSD 可能會使 CRUSH 進入臨界狀態(tài),這時某些 PG 一直卡在active+remapped狀態(tài)。如果遇到了這種情況,你應(yīng)該把此 OSD 標記為in ,用這個命令:
ceph osd in {osd-num}
等回到最初的狀態(tài)后,把它的權(quán)重設(shè)置為 0 ,而不是標記為out ,用此命令:
ceph osd crush reweight osd.{osd-num} 0
執(zhí)行后,你可以觀察數(shù)據(jù)遷移過程,應(yīng)該可以正常結(jié)束。把某一 OSD 標記為 out 和權(quán)重改為 0 的區(qū)別在于,前者,包含此 OSD 的桶、其權(quán)重沒變;而后一種情況下,桶的權(quán)重變了(降低了此 OSD 的權(quán)重)。某些情況下, reweight 命令更適合“小”集群。
停止 OSD
把 OSD 踢出集群后,它可能仍在運行,就是說其狀態(tài)為up 且 out。刪除前要先停止 OSD 進程。
ssh {osd-host}
sudo /etc/init.d/ceph stop osd.{osd-num}
停止 OSD 后,狀態(tài)變?yōu)?strong>down。
刪除 OSD
此步驟依次把一個 OSD 移出集群 CRUSH 圖、刪除認證密鑰、刪除 OSD 圖條目、刪除ceph.conf 條目。如果主機有多個硬盤,每個硬盤對應(yīng)的 OSD 都得重復(fù)此步驟。
-
刪除 CRUSH 圖的對應(yīng) OSD 條目,它就不再接收數(shù)據(jù)了。你也可以反編譯 CRUSH 圖、刪除 device 列表條目、刪除對應(yīng)的 host 桶條目或刪除 host 桶(如果它在 CRUSH 圖里,而且你想刪除主機),重編譯 CRUSH 圖并應(yīng)用它。詳情參見刪除 OSD 。
ceph osd crush remove {name} -
刪除 OSD 認證密鑰:
ceph auth del osd.{osd-num}</pre>ceph-{osd-num} 路徑里的 ceph值是$cluster-$id ,如果集群名字不是 ceph,這里要更改。
-
刪除 OSD 。
ceph osd rm {osd-num} #for example ceph osd rm 1 -
登錄到保存ceph.conf 主拷貝的主機。
ssh {admin-host} cd /etc/ceph vim ceph.conf</pre> -
從ceph.conf配置文件里刪除對應(yīng)條目。
[osd.1] host = {hostname} 從保存ceph.conf主機作為拷貝的主機,把更新過的ceph.conf拷貝到集群其他主機的/etc/ceph/目錄下。
備注:
此內(nèi)容來自于ceph社區(qū)。