/storage/db の容量不足で vCenter が「停止」?インフラエンジニアのための解決ガイド

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

ディスク容量不足で vCenter が突然「ストライキ」を起こしたら

月曜日の朝、コーヒーを一口飲んだ瞬間に社内チャットが通知で溢れました。「おい、vCenter が落ちてるぞ!503エラーが出てる!」 200台以上の仮想マシンを抱える8台の ESXi ホストクラスターを運用している身にとって、これは多忙な一日の幕開けを告げる合図です. SSH でログインして調査したところ、/storage/db パーティションの使用率が 100% に達していました。これは、PostgreSQL データベースが急激に肥大化した際に vCenter Server Appliance (VCSA) でよく発生する典型的なトラブルです。

ディスクがいっぱいになると、データの書き込みができなくなるため、vpxd サービスが自動的に停止します。その結果、仮想マシンの管理からバックアップに至るまで、すべての操作が完全に麻痺してしまいます。

なぜ /storage/db パーティションはすぐに一杯になるのか?

実際の運用経験に基づくと、主な原因は以下の3つに集約されます。

  • 膨大なタスクとイベントデータ: vMotion やログインなどのあらゆる操作が記録されます。自動化スクリプトを多用している環境では、このログテーブルが毎週 2〜5GB ずつ増加することもあります。
  • パフォーマンス統計 (Performance Metrics): vCenter は5分ごとに CPU や RAM のデータを収集します。保持ポリシー (Retention Policy) を長く設定しすぎると、DB の容量はあっという間に枯渇します。
  • 自動クリーンアップ機能の不具合: PostgreSQL の VACUUM プロセスが効率的に動作しないことがあります。これにより、データが削除されても古いファイルが解放されない状態(断片化)が発生します。
  • 自動クリーンアップ機能の不具合: PostgreSQL の VACUUM プロセスが効率的に動作しないことがあります。これにより、データが削除されても古いファイルが解放されない状態(断片化)が発生します。

すぐにクリーンアップすべきか、まずディスクを拡張すべきか?

この問題に直面したとき、通常2つの選択肢があります。それぞれのメリットとデメリットを慎重に検討しましょう。

方法1:データのクリーンアップ (Clean up)

不要なデータを根本から取り除き、DB の動作を最適化します。ただし、時間がかかる上に、SQL コマンドに詳しくない場合はリスクが伴います。

方法2:ディスクの拡張 (Expand Disk)

最も迅速な「応急処置」です。内部構成を深く弄ることなく、vCenter を即座に復旧させることができます。唯一のデメリットは、根本的な原因を解決しない限り、将来的に再びディスクがいっぱいになる可能性があることです。

私のアドバイス: まずは ディスクを拡張 してサービスを復旧させ、その後、時間に余裕があるときに データのクリーンアップ を行い、システムを長期的に最適化するのがベストです。

原因の調査と特定手順

SSH またはコンソールから VCSA にアクセスします。root 権限に切り替え、以下のコマンドを入力します。

shell
df -h

/storage/db が 98% または 100% と表示されていれば、原因確定です。どのディレクトリが最も容量を消費しているかを確認するには、以下のコマンドを使用します。

cd /storage/db/vpostgres
du -sh * | sort -h

通常、実際のデータベースファイルが格納されている data ディレクトリが最大のシェアを占めています。

/storage/db パーティションを安全に拡張する方法

バージョン 6.7 以降、VCSA は再起動なしで新しいディスク容量を自動認識できるようになりました。これは VMware の非常に優れた改善点です。

  1. vCenter が動作している ESXi ホストに直接ログインします。
  2. vCenter の仮想マシンを右クリックし、[設定の編集 (Edit Settings)] を選択します。
  3. /storage/db に対応するディスク(通常は ハードディスク 8)を探します。間違いを防ぐため、現在の容量と照らし合わせて確認してください。
  4. 容量を増やし(例:50GB から 100GB へ)、[OK] をクリックします。
  5. SSH ウィンドウに戻り、LVM パーティションを自動拡張するためのコマンドを実行します。
vpxd-servicecfg disk-expand

システムがハードウェア構成をスキャンし、自動的に容量を拡張します。完了後、df -h で結果を確認してください。

PostgreSQL 内の古いデータをクリーンアップする方法

vCenter が「息を吹き返した」ら、タスクとイベントのテーブルをクリーンアップしましょう。注意:SQL を操作する前に、必ず vCenter のスナップショットを取得してください!

PostgreSQL 管理ツールを起動します:

/opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres

以下のコマンドを使用して、容量を占有している上位10個のテーブルを確認します:

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
  ORDER BY pg_total_relation_size(C.oid) DESC
  LIMIT 10;

もし vpx_eventvpx_task が 10GB を超えている場合は、TRUNCATE コマンドで古いログを一掃できます:

truncate table vpx_event cascade;
truncate table vpx_task cascade;

最後に、VACUUM FULL; を実行して物理的なディスク領域を解放します。このコマンドはテーブルをロックするため、サービスの即時稼働が必要ないタイミングで実行してください。

安定稼働のための運用ノウハウ

夜中にトラブル対応で叩き起こされないために、私は以下の3つのルールを適用しています。

  1. 保持ポリシーの厳格化: [vCenter 設定] -> [データベース保持ポリシー] で設定します。デフォルトのままにせず、ログの保持期間を30日程度に制限することをお勧めします。
  2. 早期アラートの設定: ディスク使用率が 80% を超えたときに通知が飛ぶよう、vCenter 内でアラームを作成しておきます。
  3. 定期的なネイティブバックアップ: 組み込みの FTP/SMB 経由のバックアップ機能を活用しましょう。ディスクフルにより DB が深刻なダメージを受けた場合、リストアが最も安全な解決策になります。

vCenter の管理、特にデータパーティションの管理には細心の注意が必要です。この記事が、VCSA のディスクフルエラーに自信を持って対処する助けになれば幸いです。もし手順の途中で困ったことがあれば、お気軽にコメント欄で相談してください。

Share: