Linux アプリケーションの整合性のある永続ディスク スナップショットの作成

Linux 仮想マシン(VM)インスタンスにアタッチされている永続ディスクのアプリケーション整合性のあるスナップショットを作成できます。一般的に、永続ディスクのスナップショットの品質は、大量の書き込みワークロード中に作成されたスナップショットから復旧するアプリケーションの程度によって異なります。アプリケーション整合性のあるスナップショットは、すべてのアプリケーション トランザクションが完了し、保留中の書き込みがすべてディスクにフラッシュされた状態で、バックアップの時点でのアプリケーション データの状態をキャプチャします。

アプリケーション整合性のあるスナップショットを作成するには、永続ディスクにデータを書き込むアプリまたはオペレーティング システム プロセスを一時停止し、ディスク バッファをフラッシュして、スナップショットを作成する前にファイル システムを同期します。アプリケーションによっては、すべてのアプリケーション トランザクションが完了し、バックアップにキャプチャされるように、これらの手順とその他の手順が必要になる場合があります。

アプリケーション整合性のある永続ディスクのスナップショットを作成するには、次の手順を行います。

  1. アプリケーション整合性のためにゲスト環境を準備するには、スナップショットのキャプチャの前後に実行するカスタムのシェル スクリプトを作成します。
  2. VM(仮想マシン)インスタンスでスナップショット設定を構成します。
  3. guest-flush オプションを有効にして、スナップショットを作成します。guest-flush オプションにより、スナップショット前後のスクリプトが開始されます。

始める前に

制限事項

  • アプリケーション整合性は、スナップショット オペレーション自体ではなく、カスタムの前後のスナップショット スクリプトの動作によって保証されます。
  • スナップショット作成リクエストで guest-flush オプションを使用した場合、スクリプト エラーやタイムアウトが発生するとスナップショットは作成されません。
  • 特定の公開またはカスタムの Linux イメージにアタッチされている永続ディスクのアプリケーション整合性のあるスナップショットのみを作成できます。次のイメージがサポートされています。
    • Debian 9 Stretch
    • Debian 10 Buster
    • CentOS 7
    • CentOS 8
    • RHEL 7
    • RHEL 8

スナップショット前後のスクリプトを作成する

続行する前に、Linux VM で最新のソフトウェアを実行できるように、ゲスト環境を更新します。

アプリケーションの整合性を保つために、スナップショット前とスナップショット後のシェル スクリプトを作成して、スナップショットを取得する前と後に実行します。次のような操作には、前と後のスクリプトを使用します。

  • 永続ディスクにデータを書き込む VM 上で稼働しているアプリやオペレーティング システムのプロセスを一時停止します。
  • ディスク バッファをフラッシュします。たとえば、MySQL では FLUSH ステートメントを使用します。アプリで使用できるツールで行ってください。
  • ファイル システムを同期します。

次のコードサンプルは、スナップショット前のシンプルなスクリプトを示しています。先頭の #! 文字に注意してください。fsfreeze -f を実行すると、ファイル システムにアクセスしようとする実行中のプロセスがすべてブロックされるため、アプリケーションがレイテンシの影響を受けやすい場合は慎重に使用してください。

#!/bin/bash
fsfreeze -f [example-disk-location]

次のコードサンプルは、スナップショット後のシンプルなスクリプトを示しています。先頭の #! 文字に注意してください。

#!/bin/bash
fsfreeze -u [example-disk-location]

スクリプトは、/etc/google/snapshots/ ディレクトリにある VM に保存する必要があります。スクリプト前のフルパスは /etc/google/snapshots/pre.sh にし、スクリプト後のフルパスは /etc/google/snapshots/post.sh にする必要があります。

スクリプトで特定のディスクを参照する

スナップショット前後のスクリプトに渡される最初の引数は、スナップショットが作成されているディスクのリストです。この引数は、さまざまなチェック用のスクリプトで使用できます。たとえば、VM に複数のディスクがアタッチされているものの、スナップショット リクエストで 1 つのディスクのみを指定している場合は、スナップショットが作成されるディスクを確認できます。

引数の形式は次のとおりです。

  • SCSI 接続ディスク: <target/lun> ペアのカンマ区切りのリスト。
  • NVME 接続ディスク: <nvme:namespace> ペアのカンマ区切りのリスト。

たとえば、ブートディスクが 1/0 として表示される一方で、VM にアタッチされた追加のディスクが 2/0 として表示される場合があります。

ゲスト環境構成ファイルを編集する

VM 上の特定の構成ファイルを更新して、アプリケーション間で整合性のあるスナップショット設定を構成します。

  1. ゲスト環境構成ファイルを開くか、作成します。

    /etc/default/instance_configs.cfg
    
  2. 構成ファイルに次のセクションを追加します。

    [Snapshots]
    enabled = enabled
    timeout_in_seconds = timeout
    

    以下の説明に従って値を置き換えます。

    デフォルト 説明
    enabled true または false false アプリケーション間で整合性のあるスナップショット機能が有効かどうか。
    timeout_in_seconds 整数 [0, 300] 60 スナップショットの前後のスクリプトがタイムアウト エラーが発生する前に実行を完了するまでの秒数。スナップショット オペレーション全体がタイムアウト エラーの前に完了するまでにかかる秒数は、ディスクあたり 300 秒で、これは構成できません。
  3. 構成設定を保存します。

    sudo systemctl restart google-guest-agent.service
    

guest-flush を有効にしたスナップショットを作成する

Google Cloud Console、gcloud コマンドライン ツール、または Compute Engine API を使用して、guest-flush オプションを有効にしたスナップショットを作成します。これにより、スナップショットがキャプチャされる前と後に、スナップショット前後のスクリプトの実行が開始されます。

Console

  1. [スナップショットの作成] ページに移動します。
  2. スナップショットの [名前] を入力します。
  3. 必要に応じて、スナップショットの [説明] を入力します。
  4. [ソースディスク] で、スナップショットを作成する既存のディスクを選択します。
  5. ストレージの場所を選択します。
  6. [アプリケーション間で整合性のあるスナップショットを有効にする] チェックボックスをオンにします。
  7. [作成] をクリックします。

gcloud

次のコマンドを実行します。

gcloud compute disks snapshot DISK_NAME [DISK_NAME ...] --guest-flush

以下を置き換えます。

  • DISK_NAME は、スナップショットを作成する 1 つ以上の永続ディスクの名前です。

gcloud コマンドライン ツールは、このオペレーションに対して READYFAILED のステータスが返されるか、最長タイムアウトに達してスナップショットの最新の既知情報が返されるまで待機します。

API

guestFlush オプションを有効にして、disks.createSnapshot メソッドPOST リクエストを送信します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/createSnapshot?guestFlush=true

以下を置き換えます。

  • PROJECT_ID: プロジェクト ID。
  • ZONE: VM とディスクが配置されているゾーン
  • DISK_NAME: スナップショットを作成する永続ディスクの名前。

guest-flush を有効にしたスナップショット スケジュールを作成する

スケジュールされたスナップショットを使用すると、ゾーンとリージョンの永続ディスクを定期的にバックアップできます。アプリケーション整合性スナップショットのバックアップをスケジュールする場合は、スナップショット スケジュールを作成する際に --guest-flush オプションを使用します。これにより、スケジュールされたスナップショットの前後にスクリプトが実行されるようになります。

たとえば、設定を構成した後にカスタム スクリプトを作成すると、次のコマンドで、1 時間ごとのアプリケーション整合性スナップショットが作成されます。

gcloud compute resource-policies create snapshot-schedule SCHEDULE_NAME \
  --description "MY HOURLY SNAPSHOT SCHEDULE" \
  --start-time 22:00 \
  --hourly-schedule 4 \
  --guest-flush

詳細については、永続ディスクのスケジュールされたスナップショットの作成をご覧ください。

トラブルシューティング

  • スナップショット作成イベントからのログを確認します。

    1. Cloud Console で、Google Cloud のオペレーション スイートの [ロギング] > [ログ] ページに移動します。
      ログビューア ページに移動
    2. 左側のナビゲーションで [ログビューア] に移動します。
    3. [ラベルまたはテキスト検索でフィルタ] リストで、[高度なフィルタに変換] を選択します。

    高度なフィルタに変換します。

    フィルタのテキスト ボックスを次のテキストに置き換えます。

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot"
    
  • スクリプトが見つからない場合、スナップショットは作成されません。スナップショット前後のスクリプトを作成するの手順を行ったことを確認します。

  • スクリプト エラーやタイムアウトが発生した場合、スナップショットは作成されません。一貫性のあるスナップショットの準備を確認します。設定で構成できる最大タイムアウト時間は 300 秒です。サンプル スクリプトを使用してプロセス全体を繰り返します。

  • guest-flush を有効にしたディスクのスナップショットをキャプチャするには、永続ディスクが VM にアタッチされている必要があります。Linux VM を作成して永続ディスクをアタッチする方法については、VM の作成をご覧ください。

次のステップ