保存和加载环境快照

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本页介绍了如何使用环境快照保存和加载环境状态。

您可以将环境配置为自动保存快照。如需了解详情,请参阅配置定期快照

环境快照简介

环境快照会存储环境的状态。您可以按需保存和加载环境快照。

您可以使用快照执行以下操作:

  • 将您的环境恢复为较早的状态。使用快照创建环境的备份,然后加载其中一个快照以恢复环境。例如,即使环境成功更新,您也可以回滚安装 PyPI 软件包或替换 Airflow 配置选项的更新操作。

  • 执行并排升级和复制环境。创建现有环境的快照,创建使用相同或更高版本 Cloud Composer 的新环境,然后将快照应用于此新环境。此过程与迁移类似。请务必在创建快照之前暂停 DAG,以免重复运行 DAG。

快照的存储方式

环境快照是一组描述环境状态的文件,用于存储环境数据的备份。

您可以为环境创建多个快照。环境快照是非增量快照。您可以独立于其他快照使用任何快照。

删除环境后,Cloud Composer 不会删除快照。

默认情况下,Cloud Composer 会将快照存储在环境存储分区的 snapshots/ 文件夹中。您还可以在创建快照时指定自定义位置。

虽然 Cloud Storage 界面会出于方便起见将数据显示为文件夹,但存储分区采用的是平面文件结构。这不会改变您在 Google Cloud 控制台中保存和加载快照的方式,但请在直接对存储分区中的文件执行操作时注意这一点。如需了解详情,请参阅对象命名空间

快照的安全注意事项

为降低此安全风险,您可以在 Secret Manager 中存储 Airflow DAG 使用的敏感信息,例如密钥或密码。如需了解详情,请参阅为您的环境配置 Secret Manager

请务必检查您环境的存储分区的安全权限。如果您将环境快照存储在自定义存储分区中,请确保在项目中正确配置了对该存储分区的访问权限。分配权限时,请确保环境的服务账号具有足够的权限,能够保存和从存储分区加载快照。

快照中会保存哪些数据

Cloud Composer 会将以下数据保存在快照中:

  • Airflow 配置替换。
  • 环境变量。
  • 自定义 PyPI 软件包列表(作为要求)。
  • Airflow 数据库的备份,包括已执行任务的状态和 DAG 运行历史记录。
  • 环境存储分区中 /dags/data/plugins 文件夹的备份。
  • 环境的 fernet 密钥
  • 与环境配置相关的其他信息,例如环境的规模和性能参数。Cloud Composer 在加载快照时不会使用此信息。

从快照加载哪些数据

Cloud Composer 会从快照加载以下数据:

  • Airflow 配置替换。
  • 环境变量。
  • 自定义 PyPI 软件包(除非您选择跳过安装)。

  • Airflow 数据库的内容,包括已执行任务的状态和 DAG 运行历史记录。

  • 快照中的 /dags/data/plugins 文件夹的内容会加载到环境的存储分区中。

  • 快照中的 Fernet 密钥用于使用环境自己的 Fernet 密钥重新加密快照中的数据。环境的 Fernet 密钥保持不变。

虽然 Cloud Composer 会在快照中存储有关环境配置的一些信息,但在加载快照时不会使用这些信息。加载快照后,环境的以下参数不会发生变化:

  • 环境配置,例如环境规模和性能参数。
  • 环境的网络配置。
  • 环境存储分区中 /dags/data/plugins 文件夹之外的内容。
  • 环境标签。

在加载快照时,您在 Cloud Composer 基础架构中应用的任何设置(而未使用 Cloud Composer API)都可能会丢失。

关于部分完成的操作

加载快照时,操作可能会成功、失败或部分完成:

  • 成功的操作会从快照加载所有数据。
  • 失败的操作不会引入任何更改。
  • 部分完成的操作会从快照加载部分数据。系统会将此类操作报告为失败,但错误消息会指明哪些数据已成功加载。例如,如果 PyPI 软件包已安装,但 Airflow 配置选项替换未成功,错误消息会指明这一点。

对于部分完成的操作,您可以尝试重新加载同一快照。Cloud Composer 会跳过上次尝试时成功完成的步骤。例如,如果操作因超时而失败,但数据库已成功加载,则下次尝试时不会再次加载数据库。

准备工作

  • Cloud Composer 2 2.0.9 及更高版本支持快照。Cloud Composer 1 支持在 1.18.5 及更高版本中保存环境快照。

  • 快照不会创建环境。如果您想将快照从一个环境加载到另一个环境,则需要先创建一个新环境,然后将快照加载到该环境中。

  • 您无法将快照加载到处于错误状态的环境。无法通过加载快照来修复此类环境。您仍然可以将现有快照加载到新环境。

  • 您只能将快照加载到相同或更高版本的 Airflow。例如,您无法将快照从 Airflow 2.9.3 加载到 Airflow 2.7.3。

  • 您可以将同一 Airflow 版本的较新 Airflow build 中的快照加载到较低 build 的环境中。例如,您可以将 airflow-2.9.3-build.6 加载到 airflow-2.9.3-build.5。我们建议仅在必要时将快照加载到较低版本。

  • 支持快照的 Airflow 数据库的大小上限为 20 GB。如果环境的数据库占用空间超过 20 GB,请先缩减 Airflow 数据库的大小,然后再保存快照。

  • 若要创建快照,环境存储分区中的 /dags/plugins/data 文件夹中的对象总数必须少于 10 万。

  • 如果您使用 XCom 机制传输文件,请确保您 [按照 Airflow 准则使用它][ext-airflow-xcom-backend]。使用 XCom 传输大型文件或大量文件会影响 Airflow 数据库的性能,并可能会导致加载快照或升级环境时出现失败。考虑使用 Cloud Storage 等替代方案来传输大量数据。

  • 环境存储分区中对象名称的长度不得超过 1024 个字符。否则,将无法创建快照。

  • 如果您将快照保存在环境存储分区之外的位置,环境的服务账号必须对指定位置拥有读取和写入权限。例如,Storage Object Admin 角色具有此类权限。您可以将其应用于项目或特定存储分区。

  • 创建和存储快照会产生与 Cloud Storage 相关的额外费用。要了解详情,请参阅价格

保存环境快照

Cloud Composer 会将环境快照保存在相对于您指定的文件夹的子文件夹中。文件夹名称包含项目 ID、环境的位置、环境的名称以及快照保存的时间戳。例如:/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

如需创建环境的快照,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往环境页面。

    转到“环境”

  2. 在环境列表中,点击您的环境名称。环境详情页面会打开。

  3. 点击保存快照

  4. 保存快照对话框中,选择快照的存储位置:

    • 如需将快照存储在环境存储分区中的 /snapshots 文件夹中,请选择使用环境存储分区中的快照文件夹(默认)

    • 如需将快照存储在自定义文件夹中,请选择使用其他存储分区中的自定义文件夹,然后指定位置。

  5. 点击保存

gcloud composer environments snapshots save 命令会保存环境的快照。

  • snapshot-location 参数用于指定快照的保存位置。默认情况下,快照会保存在环境存储分区的 /snapshots 文件夹中。例如 gs://us-central1-example-916807e1-bucket/snapshots。您还可以指定任何其他文件夹。

如需保存环境的快照,请运行以下命令:

gcloud composer environments snapshots save \
  ENVIRONMENT_NAME \
  --location LOCATION \
  --snapshot-location "SNAPSHOTS_FOLDER"

您需要进行如下替换:

  • ENVIRONMENT_NAME 替换为环境的名称。
  • LOCATION 替换为环境所在的区域。
  • (可选)SNAPSHOTS_FOLDER,用于指定存储快照的存储分区文件夹的 URI。如果您省略此参数,Cloud Composer 会将快照保存到环境存储分区的 /snapshots 文件夹中。

以下示例使用默认位置:

gcloud composer environments snapshots save \
  example-environment \
  --location us-central1

以下示例会保存到自定义文件夹:

gcloud composer environments snapshots save \
  example-environment \
  --location us-central1 \
  --snapshot-location "gs://example-bucket/environment_snapshots"
  1. 构建 environments.saveSnapshot API 请求。

  2. 在请求正文的 snapshotLocation 字段中,指定要保存快照的文件夹。

{
  "snapshotLocation": "SNAPSHOTS_FOLDER"
}

您需要进行如下替换:

  • SNAPSHOTS_FOLDER 替换为用于保存快照的存储分区文件夹的 URI。

示例:

// POST https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment:saveSnapshot

{
  "snapshotLocation": "gs://us-central1-example-916807e1-bucket/snapshots"
}

无法从 Terraform 保存和加载环境快照。

保存和加载快照是对环境执行的操作,生成的快照不属于环境的定义。由于 Terraform 仅管理 Cloud Composer 环境的配置,因此您无法通过 Terraform 保存或加载环境快照。

加载环境快照

请考虑以下情况。例如,赶上功能处于启用状态,并且 Airflow 会在创建快照和加载快照之间按计划执行 DAG。在这种情况下,您加载快照后,Airflow 就没有关于之前运行的 DAG 的任何信息,因此 Airflow 会在同一时间和数据下再次运行 DAG。

再举一个例子,假设有一个按每日时间表运行的 DAG。您可以先创建快照,然后 Airflow 会执行此 DAG,之后您可以在同一天加载快照。在这种情况下,即使已停用“赶上”功能,Airflow 也会重新运行 DAG。

如需将快照加载到您的环境,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往环境页面。

    转到“环境”

  2. 在环境列表中,点击您的环境名称。环境详情页面会打开。

  3. 点击加载快照

  4. 加载快照对话框中,点击浏览

  5. 选择用于存储快照的文件夹。文件夹名称会列出项目 ID、环境位置和快照保存的时间戳。例如 /snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  6. (可选)如需跳过从快照安装自定义 PyPI 软件包,请选择跳过 PyPI 软件包安装。如果您加载已安装自定义 PyPI 软件包的环境的快照,Cloud Composer 不会安装这些自定义软件包。

  7. 点击加载,然后等待 Cloud Composer 加载快照。

gcloud composer environments snapshots load 命令会将快照加载到您的环境中。

  • --snapshot-path 参数用于指定快照所在的文件夹。

    文件夹的名称会列出项目的 ID、环境的位置以及快照的保存时间戳。例如 gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  • (可选)--skip-pypi-packages-installation 参数用于跳过从快照安装自定义 PyPI 软件包。如果您加载已安装自定义 PyPI 软件包的环境的快照,Cloud Composer 不会安装这些自定义软件包。

gcloud composer environments snapshots load \
  DESTINATION_ENVIRONMENT_NAME \
  --location LOCATION \
  --snapshot-path "SNAPSHOT_PATH"

您需要进行如下替换:

  • DESTINATION_ENVIRONMENT_NAME 替换为您要加载快照的环境的名称。
  • LOCATION 替换为环境所在的区域。
  • SNAPSHOT_PATH 替换为存储分区的 URI,后跟快照的路径。

示例:

gcloud composer environments snapshots load \
  example-environment \
  --location us-central1 \
  --snapshot-path "gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00"
  1. 构建 environments.loadSnapshot API 请求。

  2. 在请求正文的 snapshotPath 字段中,指定存储分区的 URI,后跟快照的路径。文件夹的名称会列出项目的 ID、环境的位置以及快照的保存时间戳。例如 gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00

  3. (可选)在请求正文的 skipPypiPackagesInstallation 字段中,指定 Cloud Composer 是否必须跳过从快照安装自定义 PyPI 软件包。如果您加载已安装自定义 PyPI 软件包的环境的快照,Cloud Composer 不会安装这些自定义软件包。

    此字段是可选字段。如果您省略此字段,Cloud Composer 将从快照安装 PyPI 软件包。

{
  "snapshotPath": "SNAPSHOT_PATH"
}

您需要进行如下替换:

  • SNAPSHOT_PATH 替换为存储快照的存储分区文件夹的 URI。

示例:

// POST https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment:loadSnapshot

{
  "snapshotPath": "gs://us-central1-example-916807e1-bucket/snapshots/example-project_us-central1_example-environment_2022-01-05T18-59-00",
  "skipPypiPackagesInstallation": "False"
}

无法使用 Terraform 保存和加载环境快照。

保存和加载快照是对环境执行的操作,生成的快照不属于环境的定义。由于 Terraform 仅管理 Cloud Composer 环境的配置,因此您无法通过 Terraform 保存或加载环境快照。

后续步骤