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


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

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

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

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

準備

  • Linux VM を作成します
  • ゲスト環境を更新します
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

必要なロールと権限

標準スナップショットの管理に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセス権の管理をご覧ください。

これらの事前定義ロールには、標準スナップショットの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

標準スナップショットを管理するには、次の権限が必要です。

  • ゾーンディスクのスナップショットを作成する:
    • プロジェクトに対する compute.snapshots.create
    • ディスクに対する compute.disks.createSnapshot
  • ディスク上のデータを使用してリージョン ディスクのスナップショットを作成する:
    • プロジェクトに対する compute.snapshots.create
    • ソース VM に対する compute.instances.useReadOnly
    • ディスクに対する compute.disks.createSnapshot
  • レプリカ復元チェックポイントからリージョン ディスクのスナップショットを作成する:
    • プロジェクトに対する compute.snapshots.create
    • ディスクに対する compute.disks.createSnapshot
  • スナップショット スケジュールを作成する: プロジェクトまたは組織に対する compute.resourcePolicies.create
  • スナップショット スケジュールをディスクに適用する:
    • ディスクに対する compute.disks.addResourcePolicies
    • リソース ポリシーに対する compute.resourcePolicies.use
  • スナップショットを削除する:
    • スナップショットに対する compute.snapshots.delete
    • プロジェクトに対する compute.snapshots.list

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

制限事項

Linux でアプリケーション整合性のあるスナップショットを作成する場合、次の制限があります。

  • アプリケーション整合性は、スナップショット オペレーション自体ではなく、カスタムの前後のスナップショット スクリプトの動作によって保証されます。
  • スナップショット作成リクエストで guest-flush オプションを使用した場合、スクリプトがエラーを返した場合や、タイムアウト上限に達した場合、スナップショットは作成されません。

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

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

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

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

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

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

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

#!/bin/bash
sudo 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> ペアのカンマ区切りのリスト。

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

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

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

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

    edit /etc/default/instance_configs.cfg
    
  2. 次のセクションを構成ファイルに追加し、変更を保存してエディタを終了します。

    [Snapshots]
    enabled = ENABLED
    timeout_in_seconds = TIMEOUT_SECONDS
    

    次のように置き換えます。

    • ENABLED: true に設定すると、アプリケーション整合性のあるスナップショット機能が有効になります。デフォルト値は false です。
    • TIMEOUT_SECONDS: スナップショット前またはスナップショット後のスクリプトがタイムアウトするまでに要する秒数。整数値は 0~300 にする必要があります。デフォルト値は 60 です。

  3. 新しい構成設定を使用するには、ゲスト エージェントを再起動します。

    $ sudo systemctl restart google-guest-agent.service
    

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

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

コンソール

  1. Google Cloud コンソールで [スナップショットの作成] ページに移動します。

    [スナップショットの作成] ページに移動
  2. スナップショットの名前を入力します。
  3. スナップショットの種類を選択します。デフォルトは STANDARD(標準)スナップショットです。これは、長期のバックアップや障害復旧に適しています。

    データの保持にかかる費用対効果を高めるには、[アーカイブ スナップショット] を選択します。

  4. 省略可: スナップショットの説明を入力します。
  5. [ソースディスク] で、スナップショットを作成する既存のディスクを選択します。
  6. [ロケーション] セクションで、スナップショットの保存場所を選択します。

    スナップショット設定で定義されている事前定義またはカスタマイズされたデフォルトのロケーションが自動的に選択されます。必要に応じて、スナップショット設定をオーバーライドして、次の方法でカスタマイズされた保存場所にスナップショットを保存できます。

    1. スナップショットを保存する保存場所の種類を選択します。

    2. [ロケーションを選択] フィールドで、使用する特定のリージョンまたはマルチリージョンを選択します。ソースディスクに最も近いリージョンまたはマルチリージョンを使用するには、[ディスクの場所に基づく] を選択します。
  7. [アプリケーション間で整合性のあるスナップショットを有効にする] チェックボックスをオンにします。
  8. [作成] をクリックしてスナップショットを作成します。

gcloud

スナップショットは、スナップショット設定で定義された保存場所ポリシー内に作成することも、別のお好きな保存場所を使用して作成することもできます。詳細については、スナップショットの保存場所を選択するをご覧ください。

  • スナップショット設定で構成した事前定義またはカスタマイズされたデフォルトの場所にスナップショットを作成するには、gcloud compute snapshots create コマンドを使用します。

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --guest-flush
    
  • また、スナップショット設定をオーバーライドしてスナップショットをカスタマイズされた保存場所に作成するには、--storage-location フラグを含めて、スナップショットの保存先を指定します。

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --storage-location=STORAGE_LOCATION \
        --guest-flush
    

    次のように置き換えます。

    • SNAPSHOT_NAME: スナップショットの名前。
    • SOURCE_ZONE: ソースディスクのゾーン。
    • SOURCE_DISK_NAME: スナップショットを作成するディスク ボリュームの名前。
    • SNAPSHOT_TYPE: スナップショットの種類(標準またはアーカイブ)。スナップショットの種類が指定されていない場合は、STANDARD(標準)スナップショットが作成されます。
    • STORAGE_LOCATION: スナップショットを保存する Cloud Storage マルチリージョンまたは Cloud Storage リージョン(オプション)。保存場所は 1 つだけ指定できます。

      --storage-location パラメータは、スナップショット設定で構成した事前定義またはカスタマイズされたデフォルトの保存場所をオーバーライドする場合にのみ使用します。

REST

スナップショットは、スナップショット設定で定義された保存場所ポリシー内に作成することも、別のお好きな保存場所を使用して作成することもできます。詳細については、スナップショットの保存場所を選択するをご覧ください。

  • スナップショット設定で構成した事前定義またはカスタマイズされたデフォルトの場所にスナップショットを作成するには、snapshots.insert メソッドPOST リクエストを発行します。

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "guestFlush": true,
    }
    
  • または、スナップショット設定をオーバーライドしてカスタマイズされた保存場所にスナップショットを作成するには、snapshots.insert メソッドに POST リクエストを storageLocations プロパティを含めて送信します。

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "storageLocations": [
          "STORAGE_LOCATION"
      ],
      "guestFlush": true,
    }
    

次のように置き換えます。

  • DESTINATION_PROJECT_ID: スナップショットを作成するプロジェクトの ID。
  • SNAPSHOT_NAME: スナップショットの名前。
  • SOURCE_PROJECT_ID: ソースディスク プロジェクトの ID。
  • SOURCE_ZONE: ソースディスクのゾーン。
  • SOURCE_DISK_NAME: スナップショットを作成するディスク ボリュームの名前。
  • SNAPSHOT_TYPE: スナップショットの種類(標準またはアーカイブ)。スナップショットの種類が指定されていない場合は、STANDARD(標準)スナップショットが作成されます。
  • STORAGE_LOCATION: スナップショットを保存する Cloud Storage マルチリージョンまたは Cloud Storage リージョン(オプション)。保存場所は 1 つだけ指定できます。

    storageLocations パラメータは、スナップショット設定で構成した事前定義またはカスタマイズされたデフォルトの保存場所をオーバーライドする場合にのみ使用します。

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

スケジュールされたスナップショットを使用すると、ゾーンとリージョンの Persistent Disk と Google Cloud Hyperdisk を定期的に自動でバックアップできます。アプリケーション整合性スナップショットのバックアップをスケジュールする場合は、スナップショット スケジュールを作成する際に --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 \
  --max-retention-days SNAPSHOT_RETENTION_AGE

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

トラブルシューティング

ログを確認して構成をチェックし、スナップショットのスケジュールと作成プロセスのトラブルシューティングを行います。

ログを確認する

  1. Google Cloud コンソールの [ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. 次のクエリを [ログクエリ ペイン] に貼り付けます。

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot" OR
    protoPayload.methodName="ScheduledSnapshots"
    
  3. クエリを実行してログを調査します。

    スナップショット作成ログクエリ。

構成をチェックする

次のステップ