建立與 Linux 應用程式一致的磁碟快照

您可以為連至 Linux 虛擬機器 (VM) 執行個體的永久磁碟磁碟區,建立與應用程式一致的快照。一般來說,磁碟快照的品質取決於應用程式能否使用您在系統執行繁重寫入工作負載時所建立的快照進行復原。應用程式一致性快照會擷取備份時的應用程式資料狀態,包括完成所有應用程式交易,以及將所有待處理的寫入作業排清至磁碟。

如要建立應用程式一致性快照,請先暫停會將資料寫入磁碟的應用程式或作業系統程序、清除磁碟緩衝區,並同步處理檔案系統,再建立快照。視應用程式而定,您可能需要完成這些和其他步驟,確保所有應用程式交易都已完成,並擷取到備份中。

如要建立磁碟的應用程式一致性快照,請按照下列程序操作:

  1. 如要準備客體環境,確保應用程式一致性,請建立自訂 Shell 指令碼,在擷取快照前後執行
  2. 在 VM 執行個體上設定快照設定。
  3. 建立快照時,請啟用 guest-flush 選項。guest-flush 選項會啟動快照前後指令碼。

事前準備

  • 建立 Linux VM
  • 更新訪客環境
  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上的分頁,瞭解如何使用範例:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  • 設定預設地區和區域
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

必要角色和權限

如要取得建立應用程式一致性快照所需的權限,請要求管理員授予您專案的下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備建立應用程式一致性快照所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要建立與應用程式一致的快照,必須具備下列權限:

  • 專案的 compute.snapshots.create
  • compute.disks.createSnapshot 磁碟的權限
  • 如要建立已連結服務帳戶的執行個體開機磁碟快照,請在執行個體的服務帳戶上執行 iam.serviceAccounts.actAs

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

支援的磁碟類型

您可以為連結至 Linux 執行個體的永久磁碟磁碟區,建立與應用程式一致的快照。

Hyperdisk 磁碟區不支援 guest-flush。如要為連結至 Linux 執行個體的 Hyperdisk 磁碟區建立應用程式一致性快照,您必須先手動暫停應用程式,再建立快照。詳情請參閱手動建立應用程式一致性快照

限制

在 Linux 上建立應用程式一致性快照時,有下列限制:

  • 應用程式一致性取決於自訂快照前/後指令碼的行為,而非快照作業本身。
  • 在快照建立要求中使用 guest-flush 選項時,如果指令碼傳回錯誤或達到逾時限制,系統就不會建立快照。

建立快照前後指令碼

繼續操作前,請更新訪客環境,確保 Linux VM 執行的是最新軟體。

為確保應用程式一致性,請建立快照前置和後置 Shell 指令碼,在擷取快照前後執行。使用前置和後置指令碼執行下列作業:

  • 暫停 VM 上會將資料寫入磁碟的應用程式或作業系統程序。
  • 清除磁碟緩衝區。例如,MySQL 擁有 FLUSH 陳述式。使用適用於應用程式的工具。
  • 同步檔案系統。

以下程式碼範例顯示快照前指令碼。請注意開頭的 #! 字元。

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

以下程式碼範例顯示後續快照指令碼。請注意開頭的 #! 字元。

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

您必須將指令碼儲存在 VM 的 /etc/google/snapshots/ 目錄中。前置指令碼的完整路徑必須為 /etc/google/snapshots/pre.sh,後置指令碼的完整路徑必須為 /etc/google/snapshots/post.sh

在指令碼中參照特定磁碟

傳遞至快照前和快照後指令碼的第一個引數,是您要建立快照的磁碟清單。您可以在指令碼中使用這個引數進行各種檢查。舉例來說,如果 VM 附加多個磁碟,但您只在快照要求中指定一個磁碟,您可以檢查快照是為哪個磁碟建立。

引數格式如下:

  • 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. 重新啟動 Guest Agent,即可使用新的設定。

    $ sudo systemctl restart google-guest-agent.service
    

建立啟用 guest-flush 的快照

使用 Google Cloud 控制台、Google Cloud CLI 或 REST,建立啟用 guest-flush 選項的快照。這會開始執行快照前後的指令碼,也就是在擷取快照前後執行。

控制台

  1. 前往 Google Cloud 控制台的「Create a Snapshot」(建立快照) 頁面。

    前往「Create a Snapshot」(建立快照) 頁面
  2. 輸入快照的「Name」(名稱)
  3. 選取「快照類型」。預設為 STANDARD 快照,這是長期備份和災難復原的最佳選擇。

    選擇「封存快照」,以更符合成本效益的方式保留資料。

  4. 選用:輸入快照的「Description」(說明)
  5. 在「Source disk」(來源磁碟) 底下,選取要建立快照的現有磁碟。
  6. 在「Location」(位置) 部分,選擇快照儲存位置

    系統會自動選取快照設定中指定的預先定義或自訂預設位置。如要覆寫快照設定,將快照儲存在自訂儲存位置,請執行下列步驟:

    1. 選擇快照的儲存位置類型。

      • 若選擇「Multi-regional」(多區域),費用較高但提供較高可用性。
      • 選擇「Regional snapshots」(區域快照),便能以較低的費用進一步控管資料的實際位置。
    2. 在「Select location」(選取位置) 欄位,選擇要使用的特定區域或多區域。如要使用離來源磁碟最近的區域或多區域,請選取「Based on disk's location」(以磁碟位置為準)
  7. 勾選「啟用與應用程式一致的快照」選項。
  8. 按一下 [Create] (建立) 以建立快照。

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
    
  • (預先發布版) 如要在允許的區域中建立區域範圍快照,請加入 --region 標記,指出快照的建立位置。

    gcloud beta compute snapshots create SNAPSHOT_NAME \
        --region=SNAPSHOT_SCOPE_REGION
        --source-disk=SOURCE_DISK_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --snapshot-type=SNAPSHOT_TYPE
    

更改下列內容:

  • SNAPSHOT_NAME:快照的名稱。
  • SOURCE_ZONE:來源磁碟的可用區。
  • SOURCE_DISK_NAME:要建立快照的磁碟區名稱。
  • SNAPSHOT_TYPE:快照類型,可以是 STANDARDARCHIVE。 如果未指定快照類型,系統會建立 STANDARD 快照。
  • STORAGE_LOCATION:選用:如果是全域範圍的快照,則為您要儲存快照的 Cloud Storage 多區域Cloud Storage 區域。您只能指定一個儲存位置。

    只有在想覆寫快照設定中預先定義或自訂的預設儲存位置時,才使用 --storage-location 參數。

  • SNAPSHOT_SCOPE_REGION:選用:如果是區域範圍快照,則為快照的範圍所屬區域。如果加入這個參數,就無法使用 --storage-location 參數。系統會自動將 STORAGE_LOCATION 設為 SNAPSHOT_SCOPE_REGION

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,
    }
    
  • (預覽版) 如要在允許的區域中建立區域範圍快照,請對 snapshots.insert 方法發出 POST 要求,並定義建立區域:

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/regions/SNAPSHOT_SCOPE_REGION/snapshots
    {
        "name": "SNAPSHOT_NAME",
        "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
        "snapshotType": "SNAPSHOT_TYPE"
    }
    

更改下列內容:

  • DESTINATION_PROJECT_ID:您要在當中建立快照的專案 ID。
  • SNAPSHOT_NAME:快照的名稱。
  • SOURCE_PROJECT_ID:來源磁碟專案的 ID。
  • SOURCE_ZONE:來源磁碟的可用區。
  • SOURCE_DISK_NAME:要建立快照的磁碟名稱。
  • SNAPSHOT_TYPE:快照類型,可以是 STANDARDARCHIVE。 如果未指定快照類型,系統會建立 STANDARD 快照。
  • STORAGE_LOCATION:選用:如果是全域範圍的快照,則為您要儲存快照的 Cloud Storage 多區域Cloud Storage 區域。您只能指定一個儲存位置。

    只有在想覆寫快照設定中預先定義或自訂的預設儲存位置時,才使用 storageLocations 參數。

  • SNAPSHOT_SCOPE_REGION:選用:如果是區域範圍快照,快照的範圍所屬區域。如果加入這個參數,就無法使用 storageLocations 參數。系統會自動將 STORAGE_LOCATION 設為 SNAPSHOT_SCOPE_REGION

建立啟用 guest-flush 的快照排程

您可以透過快照排程,定期自動備份可用區和區域性 Persistent Disk 磁碟區,確保備份內容與應用程式一致。如要為排程快照啟用應用程式一致性快照,請在建立快照排程時使用 --guest-flush 選項,這樣系統就會在每個排程快照前後執行快照前/後指令碼。

舉例來說,設定客層環境設定檔建立自訂指令碼後,下列指令會建立每小時一次的應用程式一致性快照:

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 控制台的「Logs Explorer」頁面:

    前往 Logs Explorer

  2. 將下列查詢貼到「記錄查詢」窗格

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot" OR
    protoPayload.methodName="ScheduledSnapshots"
    
  3. 執行查詢並調查記錄:

    快照建立記錄查詢。

檢查設定

後續步驟