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


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

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

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

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

准备工作

  • 创建 Linux 虚拟机
  • 更新访客环境
  • 设置身份验证。

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

    控制台

    当您使用 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

限制

  • 只能通过快照操作前后的自定义脚本的行为(而非快照操作本身)保证应用一致性。
  • 使用快照创建请求中的 guest-flush 选项时,如果脚本错误或超时,则不会创建快照。

创建快照操作前后的脚本

在继续操作之前,请更新访客环境,以便在 Linux 虚拟机上运行最新的软件。

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

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

以下代码示例展示了一个快照前脚本。请注意前导 #! 字符。运行 fsfreeze -f 会阻止任何试图访问文件系统的正在运行的进程,因此,如果您的应用对延迟时间较为敏感,请谨慎执行此操作。

#!/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> 对列表。

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

修改访客环境配置文件

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

  1. 打开或创建客机环境配置文件:

    /etc/default/instance_configs.cfg
    
  2. 将以下部分添加到配置文件中:

    [Snapshots]
    enabled = enabled
    timeout_in_seconds = timeout
    

    请按照以下说明替换相应的值:

    默认 说明
    enabled truefalse false 是否启用应用一致性快照功能。
    timeout_in_seconds 整数 [0, 300] 60 在超时错误之前或之后,快照脚本完成运行所需的秒数。请注意,整个快照操作在超时超时为 300 秒之前完成的秒数。
  3. 保存配置设置:

    sudo systemctl restart google-guest-agent.service
    

创建启用 guest-flush 的快照

使用 Google Cloud 控制台、Google Cloud CLI 或 REST 创建启用了 guest-flush 选项的快照。这会在捕获快照之前和之后开始运行快照前后脚本。

控制台

  1. 转到“创建新快照”页面
  2. 输入快照名称
  3. (可选)输入快照的说明
  4. 来源磁盘下方,选择要从中创建快照的现有磁盘。
  5. 选择存储位置
  6. 勾选启用应用一致性快照选项。
  7. 点击创建

gcloud

运行命令

gcloud compute disks snapshot DISK_NAME [DISK_NAME ...] --guest-flush

替换以下内容:

  • DISK_NAME 是要创建快照的一个或多个永久性磁盘的名称。

Google Cloud CLI 将等到操作返回 READYFAILED 状态,或者等到操作达到超时时间上限并返回快照最新的已知详细信息。

REST

disks.createSnapshot 方法发出 POST 请求,并启用 guestFlush 选项:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/createSnapshot?guestFlush=true

请替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • ZONE:您的虚拟机和磁盘所在的地区。
  • DISK_NAME:您要为其创建快照的永久性磁盘的名称。

创建启用了 guest-flush 的快照时间表

使用计划快照定期自动备份可用区级和区域级永久性磁盘。如果要为备份安排应用一致的快照,请在创建快照时间表时使用 --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 的运维套件日志记录 > 日志页面:
      打开 Logs Explorer
    2. 前往左侧导航栏中的日志浏览器
    3. 按标签过滤或搜索文字列表中,选择转换为高级过滤条件

    转换为高级过滤条件。

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

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

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

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

后续步骤