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

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

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

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

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

准备工作

限制

  • 只能通过快照操作前后的自定义脚本的行为(而非快照操作本身)保证应用一致性。
  • 使用快照创建请求中的 guest-flush 选项时,如果脚本错误或超时,则不会创建快照。
  • 您只能为挂接到某些公共或自定义 Linux 映像的永久性磁盘创建应用一致的快照。支持以下映像:
    • CentOS 7
    • CentOS 8
    • Debian 9 Stretch
    • Debian 10 Buster
    • RHEL 7
    • RHEL 8
    • SLES 12
    • SLES 15
    • Ubuntu 18.04
    • Ubuntu 20.04

创建快照操作前后的脚本

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

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

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

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

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

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

#!/bin/bash
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 Console、gcloud 命令行工具或 Compute Engine API 创建启用了 guest-flush 选项的快照。这会在捕获快照之前和之后开始运行快照前后脚本。

控制台

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

gcloud

运行命令

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

请替换以下内容:

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

gcloud 命令行工具将等待操作返回 READYFAILED 状态,或者等待操作达到超时时间上限并返回快照最新的已知详细信息。

API

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. 在 Cloud Console 中,转到 Google Cloud 的运维套件 Logging > 日志页面:转到“日志查看器”页面
    2. 导航到左侧导航栏中的日志查看器
    3. 按标签过滤或搜索文字列表中,选择转换为高级过滤条件

    转换为高级过滤条件。

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

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

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

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

后续步骤