KVM/Proxmoxスナップショット管理:「元に戻す」ボタンをデータ消失の惨事にしないために

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

現実:スナップショットは単なる「写真撮影」ではない

私はProxmox上で約15台の仮想マシン(VM)が稼働する小規模なラボを管理しています。ここではDockerやK8s、SQL Serverなどのテストを頻繁に行っています。ネットワーク設定で一度エンターキーを押し間違えただけで、VMの接続が完全に切れてしまうことも珍しくありません。そんな時、スナップショットは神がかった「元に戻す(Undo)」ボタンのように機能し、30秒足らずで安定した状態に戻してくれます。

しかし、注意が必要です。スナップショットはバックアップではありません。保護メカニズムなしに、データベースが毎秒500トランザクションを処理している最中にスナップショットを撮ることは、データファイルを破損(修復不能)させる最短ルートです。また、スナップショットを長時間放置すると、ディスクのレイテンシが急増します。システムはデルタファイルの負荷を背負うことになり、処理速度の低下が顕著に現れます。

準備:ホストとゲストの架け橋

スナップショットを真に安全なものにするには、ホストとゲストが「互いを理解」している必要があります。この架け橋がないと、ホストはディスクのイメージを盲目的にキャプチャしてしまいます。内部のOSが重要な書き込みプロセスを処理している最中であっても、お構いなしです。

1. QEMU Guest Agentのインストール

Linux VM(Ubuntu/Debian)へのインストールは30秒ほどで完了します:

sudo apt update && sudo apt install qemu-guest-agent -y
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent

インストール後、Proxmoxの管理画面でVMの「Options」から「QEMU Guest Agent」を有効にする必要があります。virshを使用している場合は、XML設定ファイルを再確認してください。この手順を怠ると、「Quiesce」(データ整合性を確保するためにディスク書き込みを一時停止する機能)が全く機能しません。

高度な設定:データの整合性とパフォーマンスの最適化

「クリーン」なスナップショット(整合性)の戦略

KVMのコマンドラインで操作する際は、常に--quiesceフラグを追加してください。このコマンドはGuest Agentにfsfreezeを実行させます。これにより、すべての書き込み操作が一時停止し、RAM上のデータがストレージに完全にフラッシュされてからスナップショットが作成されます。その結果、MySQLやPostgreSQLのような繊細なアプリケーションでも安全な、完璧なコピーが得られます。

virsh snapshot-create-as --domain my-vm-name \
--name "pre-update-snapshot" \
--description "Webサーバーのアップグレード前に作成" \
--live --quiesce

スナップショットチェーンの処理:ディスクの「ブレーキ」が摩耗するとき

QCOW2スナップショットを作成するたびに、新しいデルタファイルが生成されます。例えば10個のスナップショットがある場合、データは10層のファイルに断片化されます。実際のテストでは、5層を超えるスナップショットチェーンを持つVMは、読み書き速度(IOPS)が20%から30%低下することがあります。

私の黄金律は、**スナップショットは常に48〜72時間以内に削除またはマージすること**です。スナップショットはあくまで迅速なテスト用です。動作が安定したら、blockcommitを使用してデータを元のファイルに統合し、システムのリソースを解放しましょう:

# スナップショットから元のディスクへデータを安全に統合する
virsh blockcommit my-vm-name vda --active --pivot --verbose

ProxmoxでのZFSに関する特記事項

ZFSは、Redirect-on-Writeメカニズムにより、パフォーマンスにおいて「怪物」のような実力を発揮します。スナップショットはほぼ瞬時に完了します。しかし、毎日数GBのログを書き続けるサーバーのようにVMのデータ変動が激しい場合、容量を非常に激しく消費します。

  • ヒント:常にzpool listコマンドでプールの空き容量を確認してください。プールが容量の80%を超えないようにしましょう。超えると、ZFSのパフォーマンスが急激に低下します。

監視と復旧:常に先手を打つ

マシンが故障するまでスナップショットを放置してはいけません。私は通常、期限切れ(3日経過)のスナップショットをリストアップして定期的にクリーンアップする簡単なスクリプトを使用しています。

# 既存のスナップショット一覧を確認する
virsh snapshot-list --domain my-vm-name

Proxmoxでは、Snapshotsタブを観察してください。スナップショットの「ツリー」が複雑に分岐し始めたら、それは警告信号です。ストレージ容量を最適化するために、最も安定したバージョンにロールバックするか、不要なブランチを削除することをお勧めします。

安全なロールバック手順

トラブルが発生した際、以下のコマンドでシステムを一瞬で安全な状態に戻すことができます:

virsh snapshot-revert --domain my-vm-name --snapshotname pre-update-snapshot

復旧直後は、Nginxやデータベースなどの主要サービスを確認してください。作成時に--quiesceを使用するルールを守っていれば、ロールバック後のサービスエラー率はほぼゼロです。この技術をマスターすることで、予期せぬトラブルを恐れることなく、システムへの大規模な変更を自信を持って実施できるようになりました。

Share: