Proxmox VE 的超融合叢集用了幾年,總會遇到要汰換某台主機的時候。如果那台節點同時跑著 Ceph 的 OSD、監視器(MON)、管理器(MGR),就不能直接關機拔線,要先把 Ceph 的角色一個一個退乾淨,再把節點從 PVE 叢集移除。
順序錯了,輕則叢集長時間 degraded,重則資料副本不夠、I/O 卡住。這篇整理我自己退節點的完整流程,例子中要退出的節點叫 pve4。
退出前的檢查
叢集要健康
ceph -s
一定要是 HEALTH_OK,而且所有 PG 都是 active+clean 才開始。叢集本來就有問題的話,先處理好再退節點。
剩下的空間夠不夠
退出節點等於拿掉那台所有 OSD 的容量,資料會搬到其他節點上,剩下的空間要能裝得下:
ceph osd df tree
ceph df
官方建議所有 OSD 的使用率要明顯低於 nearfull_ratio(預設 85%)。粗估方式:目前已用容量 ÷ 退出後剩餘的總容量,超過 70% 就要小心,搬移過程中有 OSD 先滿了,整個儲存集區的 I/O 會被擋住。
副本數與節點數
這點最容易忽略。Ceph 預設的失敗網域是主機,三副本(size=3)就需要至少三台有 OSD 的主機。
ceph osd pool ls detail | grep -E 'size|crush_rule'
| 退出前 | 退出後 | 三副本儲存集區 |
|---|---|---|
| 4 台 | 3 台 | 正常,可以退 |
| 3 台 | 2 台 | 放不下第三份副本,PG 會一直 degraded |
只剩三台主機時要退一台,要先加入新節點,或評估調整儲存集區的副本數,不要直接退。
監視器數量
MON 要維持奇數台且至少三台。目前是三台 MON、要退的節點剛好有一台的話,先在其他節點新增一台 MON,再退舊的。
VM 與 CT
把 pve4 上的 VM、CT 全部移轉到其他節點,HA 資源也要確認都已經移走:
qm list
pct list
ha-manager status
退出 OSD
不要設定 noout
退 OSD 是要讓資料搬走,所以不要設 noout,讓 Ceph 正常重新平衡。
網頁介面
進入「pve4 → Ceph → OSD」,每顆 OSD 依序:
- 選取 OSD,按 Out:開始把資料搬到其他 OSD
- 等重新平衡完成,這顆 OSD 的 PG 數變成
0 - 按 Stop:如果還不能安全停止,會跳出警告,按取消稍後再試
- 按「更多 → 銷毀」,勾選清除(cleanup)會一併清掉磁碟上的資料
指令
# 列出 pve4 上的 OSD
ceph osd tree | grep -A20 'host pve4'
# 1. out,開始搬資料
ceph osd out 21
# 2. 觀察進度,等所有 PG 都 active+clean
ceph -s
ceph pg stat
# 3. 確認可以安全停止再停
ceph osd ok-to-stop 21
pveceph stop --service osd.21
# 4. 確認可以安全銷毀
ceph osd safe-to-destroy osd.21
# 5. 銷毀並清除磁碟
pveceph osd destroy 21 --cleanup
注意:順序是先 out、等資料搬完,再 stop、最後 destroy。如果先 stop(down)再 out,那段期間這顆 OSD 上的資料只剩其他副本,叢集會處於 degraded;資料量大、搬移時間長的話風險更高。
多顆 OSD 可以一次全部 out,讓 Ceph 一起搬,比較省時間,但搬移量大時會影響叢集效能,建議在離峰時段進行,必要時調整 recovery 速度:
# 降低 recovery 對服務的影響(Ceph Reef 起預設用 mClock 排程)
ceph config set osd osd_mclock_profile high_client_ops
# 搬完改回預設
ceph config rm osd osd_mclock_profile
從 CRUSH 移除主機
所有 OSD 都銷毀後,CRUSH 架構裡還會留著空的 pve4 主機項目,把它移除:
ceph osd tree
ceph osd crush remove pve4
退出 MON、MGR、MDS
進入「pve4 → Ceph → 監視器」,把監視器與管理器區塊中 pve4 的項目先停止,再銷毀。有 CephFS 的話,「CephFS」頁面裡 pve4 的 MDS 也一樣處理。
指令:
pveceph mon destroy pve4
pveceph mgr destroy pve4
pveceph mds destroy pve4 # 有 MDS 才需要
確認:
ceph mon stat
ceph mgr stat
ceph -s
grep mon_host /etc/pve/ceph.conf
ceph.conf 的 mon_host 不應該再有 pve4 的 IP;如果還在,手動編輯 /etc/pve/ceph.conf 移除。
清理儲存設定
「資料中心 → 儲存」裡如果有限定只在 pve4 上使用的儲存(例如本機的 LVM、ZFS、目錄),先移除或改掉節點限制,否則節點移除後設定會殘留。
把節點移出 PVE 叢集
Ceph 都退乾淨之後,才把 pve4 從 PVE 叢集移除:
先關閉 pve4,而且之後不能用原本的設定再接回網路。接著在其他任一節點執行:
pvecm nodes
pvecm delnode pve4
pvecm status
再清理殘留的節點目錄:
ls /etc/pve/nodes/
rm -r /etc/pve/nodes/pve4 # 確認裡面沒有需要的設定再刪
注意:被移除的節點如果原封不動又開機接回網路,它會以為自己還在叢集裡,可能造成叢集設定混亂。要重新使用這台機器,請先重灌,或依我之前那篇的方式將它分離成獨立節點。
詳細的分離方式可以參考〈Proxmox VE 將節點由叢集分離出來為獨立節點〉。
檢查清單
| 步驟 | 確認項目 |
|---|---|
| 1 | HEALTH_OK、空間足夠、退出後主機數不小於副本數、MON 退出後仍有奇數台 |
| 2 | VM、CT、HA 資源都已移走 |
| 3 | OSD:out → 搬完 → stop → destroy,全部完成後 ceph osd crush remove |
| 4 | MON、MGR、MDS 停止並銷毀,ceph.conf 已更新 |
| 5 | 儲存設定沒有殘留 |
| 6 | 關機後 pvecm delnode,清理 /etc/pve/nodes/ |
| 7 | 最後再確認一次 ceph -s 與 pvecm status |
結論
退節點最重要的就是順序與耐心:先確認空間與副本數夠不夠,OSD 一定要等資料搬完才停,最後才動 PVE 叢集。整個流程最花時間的是資料搬移,資料量大的話可能要好幾個小時,千萬不要因為等太久就跳步驟。
參考資料
- Proxmox VE 文件:Deploy Hyper-Converged Ceph Cluster
https://pve.proxmox.com/pve-docs/chapter-pveceph.html - Proxmox VE 文件:Cluster Manager(Remove a Cluster Node)
https://pve.proxmox.com/pve-docs/chapter-pvecm.html - Ceph 文件:Adding/Removing OSDs
https://docs.ceph.com/en/latest/rados/operations/add-or-rm-osds/ - Ceph 文件:Adding/Removing Monitors
https://docs.ceph.com/en/latest/rados/operations/add-or-rm-mons/ - Proxmox VE 將節點由叢集分離出來為獨立節點
https://blog.jason.tools/2019/05/pve-split-node.html



