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


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

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

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

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

事前準備

  • 建立 Linux VM
  • 更新訪客環境
  • 如果尚未設定驗證,請先完成設定。 「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 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. After installation, initialize the Google Cloud CLI by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    REST

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

      Install the Google Cloud CLI. After installation, initialize the Google Cloud CLI by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

必要角色和權限

如要取得管理標準快照所需的權限,請要求管理員授予您專案的下列 IAM 角色:

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

這些預先定義的角色具備管理標準快照所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要管理標準快照,必須具備下列權限:

  • 如要建立區域磁碟的快照,請按照下列步驟操作:
    • 專案的 compute.snapshots.create
    • compute.disks.createSnapshot 磁碟的權限
  • 如要使用磁碟上的資料建立地區磁碟的快照,請按照下列步驟操作:
    • 專案的 compute.snapshots.create
    • compute.instances.useReadOnly 來源 VM 上的
    • 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 執行的是最新軟體。

為確保應用程式一致性,請建立快照前後的 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 的快照排程

您可以使用排程快照,自動定期備份可用區和區域性永久磁碟,以及 Google Cloud Hyperdisk。如要排定應用程式一致性快照的備份作業,請在建立快照排程時使用 --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」頁面:

    前往記錄檔探索工具

  2. 記錄查詢窗格中貼上下列查詢:

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

    快照建立記錄查詢。

檢查設定

後續步驟