创建 Linux 应用一致性磁盘快照


您可以为挂接到 Linux 虚拟机 (VM) 实例的磁盘创建应用一致性快照。一般而言,磁盘快照的质量取决于应用从您在繁重的写入工作负载期间创建的快照中恢复的能力。 应用一致性快照可捕获备份时应用数据的状态,所有应用事务已完成且所有待处理的写入都刷新到磁盘。

如需创建应用一致性快照,请在创建快照之前暂停将数据写入磁盘、刷新磁盘缓冲区并同步文件系统的应用或操作系统进程。根据应用的不同,可能需要执行这些步骤和其他步骤,以确保所有应用事务都已完成并在备份中捕获。

如需创建磁盘的应用一致性快照,请按照以下过程操作:

  1. 为了使访客环境做好应用一致性的准备,请创建自定义快照脚本以在捕获快照之前和之后运行
  2. 在虚拟机 (VM) 实例上配置快照设置。
  3. 然后创建一个启用了 guest-flush 选项的快照。guest-flush 选项可启动快照前后的脚本。

准备工作

  • 创建 Linux 虚拟机
  • 更新访客环境
  • 如果您尚未设置身份验证,请进行设置。 身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

所需的角色和权限

如需获得管理标准快照所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

这些预定义角色包含管理标准快照所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

您需要具备以下权限才能管理标准快照:

  • 创建可用区级磁盘的快照需要以下权限:
    • 针对项目的 compute.snapshots.create 权限
    • 针对磁盘的 compute.disks.createSnapshot 权限
  • 使用磁盘上的数据创建区域级磁盘的快照需要以下权限:
    • 针对项目的 compute.snapshots.create 权限
    • 针对源虚拟机的 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 虚拟机上运行最新的软件。

为了提高应用一致性,请创建在截取快照之前和之后运行的快照 shell 脚本。您可以将 pre 和 post 脚本用于以下操作:

  • 暂停在将数据写入磁盘的虚拟机上运行的应用或操作系统进程。
  • 刷新磁盘缓冲区。例如,MySQL 设有 FLUSH 语句。使用适用于您的应用的任何工具。
  • 同步您的文件系统。

以下代码示例展示了一个快照前脚本。请注意前导 #! 字符。

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

以下代码示例展示了一个简单的快照后脚本。请注意前导 #! 字符。

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

您必须将脚本保存在虚拟机上的 /etc/google/snapshots/ 目录中。前脚本的完整路径必须是 /etc/google/snapshots/pre.sh,而后脚本的完整路径必须是 /etc/google/snapshots/post.sh

在脚本中引用特定磁盘

传递给快照操作前后脚本的第一个参数是您要为其创建快照的磁盘列表。您可以在脚本中使用此参数进行各种检查。例如,如果您的虚拟机挂接了多个磁盘,但您仅在快照请求中指定了一个磁盘,则可以检查正在为哪个磁盘截取快照。

参数格式如下:

  • SCSI 挂接的磁盘<target/lun> 对的逗号分隔列表。
  • 挂接了 NVME 的磁盘:以英文逗号分隔的 <nvme:namespace> 对列表。

例如,您的挂接了 SCSI 的启动磁盘可能显示为 1/0,而挂接到该虚拟机的其他磁盘可能显示为 2/0

修改访客环境配置文件

通过更新虚拟机上的特定配置文件来配置应用一致的快照设置。

  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:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。
    • STORAGE_LOCATION:可选:要存储快照的 Cloud Storage 多区域Cloud Storage 区域。请注意,您只能指定一个存储位置。

      仅当您想要替换快照设置中配置的预定义或自定义默认存储位置时,才应使用 --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:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。
  • STORAGE_LOCATION:可选:要存储快照的 Cloud Storage 多区域Cloud Storage 区域。请注意,您只能指定一个存储位置。

    仅当您想要替换快照设置中配置的预定义或自定义默认存储位置时,才应使用 storageLocations 参数。

创建启用了 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

如需了解详情,请参阅磁盘快照时间表简介

问题排查

请按照以下步骤排查快照创建过程问题。

  • 查看快照创建事件中的日志:

    1. 在 Google Cloud 控制台中,前往 Google Cloud Observability 日志记录 > 日志页面:
      前往 Logs Explorer
    2. 前往左侧导航栏中的 Logs Explorer
    3. 按标签过滤或搜索文字列表中,选择转换为高级过滤条件

    转换为高级过滤条件。

    将过滤条件字段替换为以下文本:

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot"
    
  • 如果未找到脚本,则不会创建快照。确保您已按照创建快照前和修补后脚本中的步骤操作。

  • 如果存在脚本错误或超时,则不会创建快照。查看准备一致的快照。请注意,您可以在设置中配置的最长超时时间为 300 秒。尝试使用示例脚本重复整个过程。

  • 磁盘必须挂接到虚拟机才能捕获启用了 guest-flush 的磁盘快照。如需了解如何创建 Linux 虚拟机并挂接磁盘,请参阅创建虚拟机

后续步骤