既存の本番 SSD プールを保護したまま、新規 NVMe ノード群だけを使う RBD プールを同一 Ceph クラスタ内に追加した例をまとめました。
TL;DR #
- 既存 pool に新 OSD を見せないことが最重要
- 専用 CRUSH root と rule を OSD 作成前に作る
host:<name>のcrush_locationを事前設定する- OSD は 1 本ずつ作成し、毎回
ceph osd findで確認
免責事項 #
本記事の内容は、筆者個人の見解および調査・検証結果に基づいて記載しています。所属する企業・団体の公式見解を示すものではありません。
記事内の情報、コード、設定例などについては可能な限り正確な内容を記載するよう努めていますが、その正確性・完全性・有用性を保証するものではありません。
本記事の内容を利用することによって生じたいかなる損害、トラブル、障害等についても、筆者は一切の責任を負いません。実際の環境で利用する際は、利用者自身の責任において十分に検証を行った上でご使用ください。
また、本記事に掲載されている内容は、予告なく変更または削除される場合があります。
この記事の前提 #
目的
既存の本番プール rbd-prod-ssd を維持しながら、新規 3 ノードの NVMe だけを使う rbd-prod-nvme を追加する。
前提
既存クラスタは正常稼働中で、既存プールのデータを新しい OSD に流し込まないことが絶対条件。
この記事で紹介するのは、同一 Ceph クラスタの中で pool の配置先を明確に分離するための手順である。
コントロールプレーンまで完全に分離したい場合は別クラスタを作るべきだが、データ配置だけを分けたいケースではこの方法が現実的だった。
構成イメージ #
既存クラスタ
└─ root default
├─ pve-ssd-01
├─ pve-ssd-02
├─ pve-ssd-03
└─ pve-ssd-04
└─ pool: rbd-prod-ssd
追加後
├─ root default
│ ├─ pve-ssd-01
│ ├─ pve-ssd-02
│ ├─ pve-ssd-03
│ └─ pve-ssd-04
│ └─ pool: rbd-prod-ssd
└─ root nvme-root
├─ pve-nvme-01
├─ pve-nvme-02
└─ pve-nvme-03
└─ pool: rbd-prod-nvme
要点は、新規 OSD を最初から root default に入れないことである。
この記事の主題はここに尽きる。
なぜ普通に OSD を追加してはいけないのか #
既存 pool が default root を見る CRUSH rule を使っている状態で、新しい OSD を何も考えず追加すると、その OSD が default 配下に入る可能性がある。
その瞬間、既存本番 pool が新 OSD を配置候補として認識し、意図しないバックグラウンド移動が始まる。
誤解しやすい点
リスクの本体は pg_autoscale_mode on そのものではない。
既存 pool から新 OSD が見えてしまう CRUSH 配置が問題である。
autoscaler はその後に PG 数の調整へ関与するが、第一の防波堤は CRUSH rule / root の分離だ。
今回の設計方針 #
- クラスタ全体に効く操作は 既存 Ceph admin ノード 1 台からだけ 実行する。
- 作業中は
nobackfill/norebalance/noautoscale/balancer offを使い、不要なバックグラウンド移動を一時停止する。 - 新規ノード用の 専用 CRUSH root と専用 rule を OSD 作成前に作る。
host:<name>スコープのcrush_locationを先に設定する。- OSD 作成は GUI から 1 本ずつ行い、毎回
ceph osd findで配置先を確認する。
例として使った環境 #
| 項目 | 内容 |
|---|---|
| 既存クラスタ | SSD ノード 4 台、既存 OSD 23 本、レプリカ 3 |
| 追加ノード | NVMe ノード 3 台、各ノード 6 本 |
| 既存 pool | rbd-prod-ssd |
| 新規 pool | rbd-prod-nvme |
| 新規 root | nvme-root |
| 新規 rule | rbd-prod-nvme-rule |
事前確認 #
1. NVMe が OS ディスクではないことを確認 #
hostname
findmnt -no SOURCE /
lsblk -e7 -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL,SERIAL
2. tmux を使う #
apt update
apt install -y tmux
tmux new -s ceph-prod
3. 既存 pool の rule を確認 #
ceph osd pool get rbd-prod-ssd crush_rule
実施手順 #
フェーズ A: ガード投入 #
ceph osd set nobackfill
ceph osd set norebalance
ceph osd pool set noautoscale
ceph balancer off
フェーズ B: CRUSH root / rule 作成 #
ceph osd crush add-bucket nvme-root root
ceph osd crush add-bucket pve-nvme-01 host
ceph osd crush add-bucket pve-nvme-02 host
ceph osd crush add-bucket pve-nvme-03 host
ceph osd crush move pve-nvme-01 root=nvme-root
ceph osd crush move pve-nvme-02 root=nvme-root
ceph osd crush move pve-nvme-03 root=nvme-root
フェーズ C: OSD 作成 #
GUI で NVMe を 1 本ずつ OSD 化する。
各作成後に配置確認を行う。
ceph osd find osd.<OSD_ID>
フェーズ D: 新規 pool 作成 #
ceph osd pool create rbd-prod-nvme 64 64 replicated rbd-prod-nvme-rule
ceph osd pool set rbd-prod-nvme size 3
ceph osd pool set rbd-prod-nvme min_size 2
ceph osd pool set rbd-prod-nvme pg_autoscale_mode on
rbd pool init rbd-prod-nvme
フェーズ E: Proxmox storage 追加 #
| 項目 | 値 |
|---|---|
| ID | rbd-prod-nvme-store |
| Pool | rbd-prod-nvme |
| Content | Disk image |
| Nodes | pve-nvme-01,pve-nvme-02,pve-nvme-03 |
フェーズ F: ガード解除 #
ceph osd unset norebalance
ceph osd unset nobackfill
ceph osd pool unset noautoscale
ceph balancer on
確認ポイント #
ceph -s
ceph osd tree
ceph osd pool get rbd-prod-ssd crush_rule
ceph osd pool get rbd-prod-nvme crush_rule
ceph -sが HEALTH_OK- 既存 pool の rule が変化していない
- 新規 OSD が nvme-root 配下
学び #
- 危険なのは autoscaler より CRUSH 配置
crush_location事前設定が最重要- OSD は 1 本ずつ作る方が安全
- 完全分離が必要なら別クラスタ
運用メモ #
クラスタが degraded 状態の場合、この手順は実施しない方がよい。
新規 OSD が default に入った場合は作業を停止し、配置修正後に再開する。