問題
CVIMMONのAlertで、Cephに関する以下の2つのAlertが出力されました。
Cephのヘルスチェック
コントローラーノードの cephmon コンテナから、ceph health detail の結果をみてみると HEALTH_WARN 状態となっていることがわかります。
cephmon_19767 [ceph@controller1 /]$ ceph health detail
HEALTH_WARN 5 nearfull osd(s); 2 pool(s) nearfull
OSD_NEARFULL 5 nearfull osd(s)
osd.58 is near full
osd.73 is near full
osd.195 is near full
osd.205 is near full
osd.206 is near full
POOL_NEARFULL 2 pool(s) nearfull
pool 'images' is nearfull
pool 'volumes' is nearfull
この結果より以下の2つが原因であることがわかります。
・5つのOSDの領域がOSD_NEAFULLとなっており、容量が不足している
・images 及び volumes の pool が POOL_NEARFULL となっており、容量が不足している
ディスクの容量が足りない問題が発生していると思われます。
ceph df detail コマンドでCephディスク使用率を確認
ceph df detail コマンドでディスク使用容量のサマリを確認してみます。
cephmon_19767 [ceph@controller1 /]$ ceph df detail
GLOBAL:
SIZE AVAIL RAW USED %RAW USED OBJECTS
825TiB 247TiB 578TiB 70.02 50.64M
POOLS:
NAME ID QUOTA OBJECTS QUOTA BYTES USED %USED MAX AVAIL OBJECTS DIRTY READ WRITE RAW USED
images 1 N/A N/A 158GiB 0.76 20.1TiB 20250 20.25k 425KiB 119KiB 473GiB
volumes 2 N/A N/A 192TiB 90.56 20.1TiB 50621497 50.62M 903MiB 4.65GiB 577TiB
Cephのディスク使用率を解析する上で重要なのは、実際に使用できる空き容量と、物理ディスクの空き容量は一致しない事を理解する必要があります。
CVIMで動作しているCephは冗長性を確保するために、書き込みの際に3つのレプリケーションを異なるOSD上に作成します。
これにより物理ディスクの故障によりOSDがダウンしたとしても、残り2つのレプリケーションが使用できるため冗長性を確保します。
このため、Cephを利用するクライアントが1Mbyteの領域を使ったとしても、実際には3Mbyteの領域を使用することになります。
ceph df detail の出力結果の各項目が、クラアントが使用可能なサイズなのか、実際にディスク上で使用している領域(RAW)なのかを見極める必要があります。
まずは以下のGLOBALの項目の解釈から説明します。
GLOBAL:
SIZE AVAIL RAW USED %RAW USED OBJECTS
825TiB 247TiB 578TiB 70.02 50.64M
ここは基本的にRAW領域です。つまり全体のDisk使用量のうち実際にどれくらい使われているかという情報を表示しています。
このマシンにはHDDが378台積まれています。
cephmon_19767 [ceph@controller1 /]$ ceph osd tree|grep hdd|wc -l
378
一つのドライブの容量が2.18TiBなので、378倍すると 825TBになります。つまり上記のSIZEと一致します。
SIZE: すべてのOSDが提供する全ディスク容量
AVAIL: 使用可能なディスク容量
RAW USED: 使用中のディスク容量
%RAW USED: RAW USED/SIZE x 100、つまり全ディスク容量のうちの使用量
OBJECTS: データオブジェクトの数
つまり、全体で見ると70%ほどの容量しか使ってません。
次に、POOLSの解釈です。
POOLS:
NAME ID QUOTA OBJECTS QUOTA BYTES USED %USED MAX AVAIL OBJECTS DIRTY READ WRITE RAW USED
images 1 N/A N/A 158GiB 0.76 20.1TiB 20250 20.25k 425KiB 119KiB 473GiB
volumes 2 N/A N/A 192TiB 90.56 20.1TiB 50621497 50.62M 903MiB 4.65GiB 577TiB
ここはクライアントから見た容量とディスクのRAWの容量が混在しているので解釈が難しいところです。
USED: クライアントが使用しているデータ容量
%USED: Poolに割り当てられた全容量のうち何%のデータが使われているか
MAX AVAIL: あとどれくらいのクライアントがデータを使用できるか
RAW USED: USED x 3 の値、つまりreplica込みでどれくらいのデータ量をDisk上で消費しているか
CVIMでは、imagesとvolumesの2つのPoolが割り当てられます。
images は openstack glance で使用される、イメージの格納場所で、volumes は openstack cinder で使用されるブロックストレージ用の pool となります。
images の使用率が 0.76% なのに対し、volumes の使用量は 90.56% と非常に高くなっているのがまず問題です。
volumes の USED は192TiBですが、ここはクライアント側から見た使用量ですので、実際のディスク上での使用領域はその3倍の576TiBとなり、RAW USED の値とほぼ一致します。
このため、Global の RAW USED 578TiB は、ほぼ全て volumes の領域で使用されているということになります。
Globalで表示されている SIZE は825TiB中、577TiBがほぼ volumes のPoolで使用されているため、%RAW USEDが70.02% となります。
実際にはImage用のPoolも考慮に入れる必要がありますが、今回のケースだと使用されている領域は非常に小さいので無視できます。
ここでの疑問は全体のDisk使用量は70%に過ぎないのにPoolでみるとなぜ volumes の pool は90.56%使われているか?という話です。
Glance/Cinderディスクサイズの決定
ここを理解する前に、CVIM のインストールパラメーターの CEPH_PG_INFO について理解する必要があります。
以下は、CVIMのマニュアルページからの抜粋となります。
===============================
CEPH Placement Group Info (Optional)
If you need to change the default percentages for placement group calculation use this section they indicate amount of data you expect in cinder/glance/nova. For NOVA_BOOT_FROM local give values for cinder and glance. For NOVA_BOOT_FROM ceph also fill nova_percentage_data for ephemeral data. All Percentages need to add up to 100. If no information is provided, the code defaults to 60% cinder and 40% glance for NOVA_BOOT_FROM local. Similarly, if no information is provided the code defaults to 40% cinder, 30% glance and 30% nova ephemeral for NOVA_BOOT_FROM ceph. One cannot be changed these values after deployment via update or reconfigure.
# For NOVA_BOOT_FROM local
# CEPH_PG_INFO: {cinder_percentage_data: x, glance_percentage_data: y}
# where x and y are integers and must add up to 100
# For NOVA_BOOT_FROM Ceph
# CEPH_PG_INFO: {cinder_percentage_data: x, glance_percentage_data: y, nova_percentage_data: z}
# where x, y and z are integers and must add up to 100
===============================
CEPH_PG_INFOは GlanceとCinder用のPoolに振り分けるPG(Placement Group)の数を制御する値です。
このCVIM PODではこのパラメーターは設定されてないのでデフォルトの値を使用します。
デフォルトでは、40%のPGがGlance用、60%がCinder用に振り分けられます。
つまり、Glance PG:Cinder PG は 1:1.5です。
実際には以下のように1:2になっています。
cephmon_19767 [ceph@controller1 ceph]$ ceph osd pool get images pg_num
pg_num: 8192
cephmon_19767 [ceph@controller1 ceph]$ ceph osd pool get volumes pg_num
pg_num: 16384
これは、PG数は常に2の階乗になっていけないので実際の計算値の近い方の2の倍数にラウンドアップもしくはダウンされるという法則があるからです。
ここでの注意はPG数=ディスク容量には必ずしもならない点です。なので1:2という割合は目安だと思ってください。
つまり、おおまかに全ディスク容量の70%ぐらいしかCinder用に使えないということです。
このため、825*0.7=577TBがCinder用のvolumes領域です。
実際には RAW USED/%USED * 100 = 637TB がCinder用の領域となり、全体の 76%となります。
このうち90.56%がCinder用に既に使用されているというわけです。
このPODでは、Glanceのイメージは殆ど使われておらず、Cinderのボリューム領域を中心に使用しているようです。
このため、CEPH_PG_INFO の値をデフォルトの Cinder:Glance=60:40 ではなく、90:10 といった極端な値にするべきです。
こちらの値は残念ながらインストール後に変更することはできないため、POD全体をインストールし直す必要があります。
使用するPODの目的に応じてインストール前に CEPH_PG_INFO の値を考慮する必要があります。
MAX AVAILの解釈
MAX AVAILの値を確認すると、images/volumes の両方とも20.1TiBとなってます。
それぞれのPoolのサイズがインストール時に決定され、images については使用率が0.76%であるため、この値が両方とも同じ値になるのはおかしい、imagesについてはもっと使えるはずではないのか?と思われるかもしれません。
MAX AVAIL についてはあとどれくらいの容量を使うとOSDに対する書き込みができなくなるか、という値です。
この値は、各OSDの一番容量が少ない値を元に計算されます。
このため、OSD のディスク使用率がある一定の閾値に達するとそこに配置されているPGはPoolに関係なしに書き込みできなくなるため、今回のケースでは Poolに関係なくMAX AVAILの値は共通となります。
つまり、今の状態はあと20TiBほどデータの書き込みが発生すると、すべてのクライアントからの書き込みがブロックされる可能性があります。
OSD_NEARFULLの原因
CVIMでは以下のCephパラメーターが設定されてます。
mon_osd_full_ratio = 0.950000
mon_osd_nearfull_ratio = 0.850000
これは、OSDのディスク使用率が85%に達するとWarningが発生し、95%に達するとそれ以上の書き込みができなくなるという設定です。
以下は、各OSDのディスク使用率が高いものからSortした結果です。
cephmon_19767 [ceph@controller1 /]$ ceph osd df|sort -nrk8|head -10
195 hdd 2.18309 1.00000 2.18TiB 1.94TiB 250GiB 88.83 1.25 218
58 hdd 2.18309 1.00000 2.18TiB 1.89TiB 296GiB 86.74 1.22 218
206 hdd 2.18309 1.00000 2.18TiB 1.88TiB 306GiB 86.30 1.22 227
205 hdd 2.18309 1.00000 2.18TiB 1.86TiB 332GiB 85.13 1.20 228
73 hdd 2.18309 1.00000 2.18TiB 1.86TiB 333GiB 85.12 1.20 220
296 hdd 2.18309 1.00000 2.18TiB 1.86TiB 333GiB 85.11 1.20 215
31 hdd 2.18309 1.00000 2.18TiB 1.86TiB 336GiB 84.99 1.20 225
293 hdd 2.18309 1.00000 2.18TiB 1.83TiB 358GiB 83.99 1.18 224
121 hdd 2.18309 1.00000 2.18TiB 1.82TiB 368GiB 83.54 1.18 214
366 hdd 2.18309 1.00000 2.18TiB 1.80TiB 395GiB 82.35 1.16 216
今回で言えば、いくつかのOSDが85%以上の使用率となっておりを使用しており、これが OSD_NEARFULL の原因となってます。
解決方法
以上を踏まえるといくつかの解決策が考えられます。
1. 使用してない Cinder volumeを削除する
こうしている間にもどんどんCephの使用率は上がっていっています。
使用してない、Cinder Volume を削除します。
2. Storage Volumeを追加する
新たなStorageノードを用意した上で、CVIM コマンドの "ciscovim add-storage" コマンドでPODに追加します。
3. CEPH_PG_INFO の値を見直す
上記で説明した CEPH_PG_INFO の値を見直して、images pool の割合を減らし、volumes pool の割合を増やします。
ただしこちらは再インストールを実施する必要があります。