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

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

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

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

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

事前準備

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

    請根據您打算如何使用本頁範例,選取對應的分頁標籤:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證機制。

    gcloud

    1. 安裝 Google Cloud CLI,然後 使用聯合身分登入 gcloud CLI。 登入後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init
  • 設定預設區域和可用區。
  • REST

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

      安裝 Google Cloud CLI,然後 使用聯合身分登入 gcloud CLI。

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

必要角色和權限

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

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

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

所需權限

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

  • 專案的 compute.snapshots.create
  • compute.disks.createSnapshot 磁碟

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

支援的磁碟類型

您可以為附加至 Linux 執行個體的 Persistent Disk 磁碟區,建立與應用程式一致的快照。

Hyperdisk 磁碟區不支援 guest-flush 或磁碟區陰影複製服務 (VSS)。如要為 Hyperdisk 磁碟區建立與應用程式一致的快照,您必須先手動暫停應用程式,再建立快照。詳情請參閱「手動建立與應用程式一致的快照」。

限制

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

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

建立快照前和快照後指令碼

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

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

  • 暫停在 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-attached disks:以半形逗號分隔的 <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. 選取「Snapshot type」(快照類型)。預設為 STANDARD 快照,這是長期備份和災難復原的最佳選項。

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

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

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

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

    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:快照類型,可以是 STANDARD 或 ARCHIVE。如未指定快照類型,系統會建立 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./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./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./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:快照類型,可以是 STANDARD 或 ARCHIVE。如未指定快照類型,系統會建立 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. 執行查詢並調查記錄:

    快照建立記錄查詢。

檢查設定

  • 如果執行個體上找不到任何快照前或快照後指令碼,無法凍結檔案系統上的活動/IOPS,就不會建立快照。請務必按照「建立快照前和快照後指令碼」一節的步驟操作。

  • 如果發生指令碼錯誤或逾時,系統就不會建立快照。請參閱「準備建立一致的快照」。請注意,您在設定中可設定的逾時時間上限為 300 秒。請嘗試使用範例指令碼重複整個程序。

  • 磁碟必須連接至 VM,才能在啟用 guest-flush 的情況下擷取磁碟快照。如要瞭解如何建立 Linux VM 並連接磁碟,請參閱「建立 VM」。

後續步驟