在 Kubernetes 中进行备份和恢复

本页介绍了如何使用 AlloyDB Omni Kubernetes Operator 备份和恢复 AlloyDB Omni 数据。这需要具备有关使用清单文件和 kubectl 命令行工具更新 Kubernetes 集群的基础知识。如需详细了解如何在 Kubernetes 集群上安装和运行 AlloyDB Omni,请参阅在 Kubernetes 上安装 AlloyDB

如需启用 AlloyDB Omni 连续备份和恢复功能,您必须为每个数据库集群创建备份方案。系统会根据 backupPlan 资源中定义的备份时间表进行备份。如果备份方案中未定义任何备份时间表,则系统会默认每天进行连续备份。您可以按秒级粒度恢复或克隆恢复时间范围内的任何时间戳的备份。

如需了解如何在非 Kubernetes 部署中备份和恢复 AlloyDB Omni 数据,请参阅安装和配置 Barman

启用和安排备份

当您为数据库集群创建备份方案资源时,系统会启用持续备份功能。您必须为每个数据库集群创建一个 backupPlan 资源,才能为该集群启用持续备份功能。此备份方案资源定义了以下参数:

  • AlloyDB Omni Operator 存储备份的位置。该目录可以位于 Kubernetes 集群本地,也可以位于 Cloud Storage 存储桶中。

  • 用于设置多个备份时间表的选项,可自动创建 fullincrementaldifferential 备份。您可以随时暂停此时间表,包括在初始定义备份方案时。如果备份方案处于暂停状态,系统不会创建定期备份,但您仍然可以使用该方案手动创建备份。

    如果未指定任何备份时间表,则默认为“0 0 * * *”,即每天在本地时间午夜执行一次完整备份。

  • 存储的备份的保留期限。最短可为 1 天,最长可为 90 天。默认值为 14。

您的数据库集群可以有多个备份方案,每个方案都有自己的名称和配置。如果您为数据库集群创建多个具有不同备份时间表的 backupPlan 资源,则必须为每个备份资源定义一个唯一的备份位置。

创建用于在本地存储备份的方案

如需启用本地存储的备份,请应用以下清单:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: BackupPlan
    metadata:
      name: BACKUP_PLAN_NAME
      namespace: NAMESPACE
    spec:
      dbclusterRef: DB_CLUSTER_NAME
      backupSchedules:
        full: "FULL_CRON_SCHEDULE"
        differential: "DIFF_CRON_SCHEDULE"
        incremental: "INCR_CRON_SCHEDULE"
      backupRetainDays: RETENTION_DAYS
      paused: PAUSED_BOOLEAN

替换以下内容:

  • BACKUP_PLAN_NAME:此备份方案资源的名称,例如 backup-plan-1

  • NAMESPACE:此备份方案的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。

  • DB_CLUSTER_NAME:数据库集群的名称,您在创建集群时指定的名称。

  • FULL_CRON_SCHEDULE:用于创建包含所有数据且采用 cron 格式的完整备份的备份时间表。例如,将其设为“0 0 * * 0”即可在每周日 00:00 执行完整备份。

  • DIFF_CRON_SCHEDULE:用于创建最初为完整备份的备份的备份时间表。后续备份是差分备份,基于数据的中间更改(以 cron 格式表示)。例如,将其设置为“0 22 * * 3”,即可在每周三 22:00 进行差分备份。

  • INCR_CRON_SCHEDULE:用于创建备份的时间表,其中包含与上次完整备份、差分备份或增量备份相比发生变化的数据。它采用 cron 格式表示。例如,设置为“0 21 * * *”可在每天 21:00 执行增量备份。

  • RETENTION_DAYS:AlloyDB Omni Operator 保留此备份的天数。必须是介于 190 之间的整数。默认值为 14

  • PAUSED_BOOLEAN:指定备份方案是否处于暂停状态。请提供以下某个值:

    • true:备份会暂停,系统不会创建任何定期备份。

    • false:AlloyDB Omni Operator 会根据 cronSchedule 指定的时间表创建备份。如果未明确设置为 true,则这是默认值。

    默认值为 false

创建在 Cloud Storage 中存储备份的方案

如需启用存储在 Cloud Storage 上的备份,请按以下步骤操作:

  1. 创建 Cloud Storage 存储分区。记下您为此存储桶分配的名称,因为您在后续步骤中需要用到它。

  2. 创建服务账号,用于将备份添加到存储桶。

  3. 向服务账号授予 storage.objectAdmin Identity and Access Management 角色。

  4. 为服务账号创建密钥。这会将私钥下载到您的本地环境。

  5. 将下载的密钥文件重命名为 key.json

  6. 创建包含私钥的 Kubernetes Secret:

    kubectl create secret generic SECRET_NAME --from-file=KEY_PATH -n NAMESPACE

    替换以下内容:

    • SECRET_NAME:您要创建的 Kubernetes Secret 的名称,例如 gcs-key

    • KEY_PATH:您在上一步中下载的 key.json 文件的本地文件系统路径。

    • NAMESPACE:数据库集群的命名空间。

  7. 应用以下清单:

      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: BackupPlan
      metadata:
        name: BACKUP_PLAN_NAME
        namespace: NAMESPACE
      spec:
        dbclusterRef: DB_CLUSTER_NAME
        backupSchedules:
          full: "FULL_CRON_SCHEDULE"
          differential: "DIFF_CRON_SCHEDULE"
          incremental: "INCR_CRON_SCHEDULE"
        backupRetainDays: RETENTION_DAYS
        paused: PAUSED_BOOLEAN
        backupLocation:
          type: GCS
          gcsOptions:
            bucket: BUCKET_URL
            key: BACKUP_PATH
            secretRef:
              name: SECRET_NAME
              namespace: NAMESPACE
    

    替换以下内容:

    • BACKUP_PLAN_NAME:此备份方案资源的名称,例如 backup-plan-1

    • NAMESPACE:此备份方案的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。

    • DB_CLUSTER_NAME:数据库集群的名称,您在创建集群时指定的名称。

    • FULL_CRON_SCHEDULE:用于创建包含所有数据且采用 cron 格式的完整备份的备份时间表。例如,将其设为“0 0 * * 0”即可在每周日 00:00 执行完整备份。

    • DIFF_CRON_SCHEDULE:用于创建最初为完整备份的备份的备份时间表。后续备份是差分备份,基于数据的中间更改(以 cron 格式表示)。例如,将其设置为“0 22 * * 3”,即可在每周三 22:00 进行差分备份。

    • INCR_CRON_SCHEDULE:用于创建备份的时间表,其中包含与上次完整备份、差分备份或增量备份相比发生变化的数据。它采用 cron 格式表示。例如,设置为“0 21 * * *”可在每天 21:00 执行增量备份。

    • RETENTION_DAYS:AlloyDB Omni Operator 保留此备份的天数。必须是介于 190 之间的整数。默认值为 14

    • PAUSED_BOOLEAN:指定备份方案是否处于暂停状态。请提供以下某个值:

      • true:备份会暂停,系统不会创建任何定期备份。

      • false:AlloyDB Omni Operator 会根据 cronSchedule 指定的时间表创建备份。如果未明确设置为 true,则这是默认值。

      默认值为 false

    • BUCKET_URL:您在上一步中创建的 Cloud Storage 存储桶的名称。这不是存储桶的完整网址;请勿在存储桶名称前面添加 gs://

    • BACKUP_PATH:AlloyDB Omni Operator 将备份写入 Cloud Storage 存储桶中目录的路径。路径必须是绝对路径,且以 / 开头。

    • SECRET_NAME:您在上一步中为 Kubernetes Secret 选择的名称。

手动创建备份

您可以随时使用已应用于数据库集群的任何备份方案手动创建备份资源。AlloyDB Omni Operator 会将所选备份方案的存储位置和保留期限应用于新的手动备份。

如需手动创建备份,请应用以下清单:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Backup
metadata:
  name: BACKUP_NAME
  namespace: NAMESPACE
spec:
  dbclusterRef: DB_CLUSTER_NAME
  backupPlanRef: BACKUP_PLAN_NAME
  manual: true
  physicalBackupSpec:
    backupType: BACKUP_TYPE

替换以下内容:

  • BACKUP_NAME:此备份的名称,例如 backup-1

  • NAMESPACE:此恢复操作的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。

  • BACKUP_PLAN_NAME:此备份所属的备份方案资源的名称。该名称必须与您在创建备份方案时选择的名称一致。

  • DB_CLUSTER_NAME:数据库集群的名称,您在创建集群时指定的名称。

  • BACKUP_TYPE:指定您要创建的手动备份类型。请从下列值中选择一个:

    • full:创建包含所有数据的完整备份。

    • diff:创建基于上次完整备份的差分备份。后续备份是差分备份,基于数据的中间更改。

    • incr:创建增量备份,该备份依赖于上次完整备份或差分备份,以包含与上次完整备份或差分备份相比发生变化的数据。

监控和列出备份

您的备份计划和备份都是 Kubernetes 集群上的资源。如需查看它们的相关信息,请使用 kubectl get 命令。

查看备份方案摘要

如需查看数据库集群备份方案的相关信息,请运行以下命令:

kubectl get backupplan.alloydbomni.dbadmin.goog -n NAMESPACE

NAMESPACE 替换为数据库集群的命名空间。

输出类似以下内容:

NAME               PHASE   LASTBACKUPTIME         NEXTBACKUPTIME
backup-plan-prod   Ready   2023-10-26T17:26:43Z   2023-10-27T00:00:00Z

查看备份列表

如需查看数据库集群可用的备份列表,请运行以下命令:

kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE

NAMESPACE 替换为数据库集群的命名空间。

输出类似以下内容:

NAME                              PHASE       COMPLETETIME
backup-plan-prod-20231026172643   Succeeded   2023-10-26T17:26:53Z
manual-backup-1                   Succeeded   2023-10-26T18:15:27Z
manual-backup-2                   InProgress

输出表中的每一行代表一个备份资源,具有以下属性:

  • 备份的名称。
  • 备份的状态,其中 Succeeded 表示备份已准备好进行恢复。
  • 备份创建的时间戳。

使用备份进行恢复

借助 AlloyDB,您可以从单个备份恢复,也可以使用特定时间点的备份克隆集群。

从命名备份恢复

如需从备份恢复,将数据库集群中的数据替换为备份中的数据,请按以下步骤操作。

  1. 列出阶段为 Succeeded 的所有备份。

    kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE | grep Succeeded

    NAMESPACE 替换为数据库集群的命名空间。

    如果至少存在一个合适的备份候选项,则输出内容如下所示:

    backup-plan-prod-20231026172643   Succeeded   2023-10-26T17:26:53Z
    manual-backup-1                   Succeeded   2023-10-26T18:15:27Z
    
  2. 选择上一步中列出的备份之一作为要恢复的备份。记下其名称,以便在下一步中使用。

  3. 应用以下清单:

      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: Restore
      metadata:
        name: RESTORE_NAME
        namespace: NAMESPACE
      spec:
        sourceDBCluster: DB_CLUSTER_NAME
        backup: BACKUP_NAME
    

    替换以下内容:

    • RESTORE_NAME:要与此清单创建的数据恢复资源搭配使用的名称,例如 restore-1

    • DB_CLUSTER_NAME:数据库集群的名称,您在创建集群时指定的名称。

    • BACKUP_NAME:您在上一步中选择的备份的名称。

从某个时间点克隆集群

借助 AlloyDB Omni Operator,您可以从恢复期内的任意时间点克隆集群的数据。恢复期限的长度直接由保留期限决定。

例如,如果您将保留期限设置为 14 天,则无法恢复超过 14 天的数据。您可以恢复到恢复期限内的任意时间点。 AlloyDB Omni Operator 会将备份和日志保留比指定值多一天。

  1. 监控恢复期限,以确定恢复点:

    kubectl get backupplan.alloydbomni.dbadmin.goog BACKUP_NAME -n NAMESPACE -o json | jq .status.recoveryWindow
    

    以下显示了响应示例:

    recoveryWindow:
    begin: "2024-01-31T02:54:35Z"
    

    恢复资源中使用的是采用 RFC 3339 时间戳格式的时间戳值。

  2. 创建并应用以下恢复资源清单:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: Restore
    metadata:
      name: RESTORE_NAME
      namespace: NAMESPACE
    spec:
      sourceDBCluster: DB_CLUSTER_NAME
      pointInTime: "DATE_AND_TIME_STAMP"
      clonedDBClusterConfig:
        dbclusterName: NEW_DB_CLUSTER_NAME
    

    替换以下内容:

    • RESTORE_NAME:要与此清单创建的数据恢复资源搭配使用的名称,例如 restore-1

    • DB_CLUSTER_NAME:数据库集群的名称,您在创建集群时指定的名称。

    • DATE_AND_TIME_STAMP:您要从中恢复的连续备份的 RFC 3339 时间戳(精确到分钟级),例如 2024-03-05T15:32:10Z

    • NEW_DB_CLUSTER_NAME:新数据库集群的名称。

查看恢复状态

  1. 查看恢复操作的进度:

    kubectl get restore.alloydbomni.dbadmin.goog -n NAMESPACE

    NAMESPACE 替换为数据库集群的命名空间。

    如需持续运行该命令,请添加 -Aw 标志。

    输出类似以下内容:

    NAME        PHASE               COMPLETETIME   RESTOREDPOINTINTIME
    restore-1   RestoreInProgress
    

    当输出表格中 PHASE 列的值读取为 ProvisionSucceeded 时,恢复即完成。

  2. 查看恢复或克隆的数据库集群上线的进度:

    kubectl get dbclusters -A -n NAMESPACE

    NAMESPACE 替换为数据库集群的命名空间。

    如需持续运行该命令,请添加 -Aw 标志。

    输出类似以下内容:

    NAMESPACE   NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE
    default     db-cluster-1       10.128.0.55       Ready          DBClusterReady
    

    当输出表中 DBCLUSTERPHASE 列的值读取为 DBClusterReady 时,则表示已恢复或克隆的数据库集群可以使用了。

删除备份

通常,您无需手动删除备份。AlloyDB Omni Operator 会自动删除保留期限超过您在创建备份方案时指定的时间的备份。

如果您确实想手动删除备份,则备份必须满足以下要求:

  • 该备份并非其备份方案存储的唯一备份。AlloyDB Omni Operator 要求每个备份方案至少包含一个备份。

  • 该备份没有其他备份依赖于它。例如,具有依赖于它的差分备份或增量备份的完整备份;或者具有依赖于它的差分备份的增量备份。

如需删除备份,请运行以下命令:

kubectl delete backup.alloydbomni.dbadmin.goog/BACKUP_NAME -n NAMESPACE

替换以下内容:

  • BACKUP_NAME:要删除的备份的名称。

  • NAMESPACE:数据库集群的命名空间。

更新备份方案

每个备份方案都是一个 Kubernetes 资源。如需更新其配置,请执行以下操作之一:

  • 修改并重新应用备份方案的清单文件。

  • 使用 kubectl patch 命令。

例如,如需暂停正在运行的备份方案,请将其清单的 paused 属性更改为 true,然后重新应用该清单。

删除备份方案

如需删除备份方案并移除其所有备份资源,请运行以下命令:

kubectl delete backupplan.alloydbomni.dbadmin.goog/BACKUP_PLAN_NAME -n NAMESPACE

替换以下内容:

  • BACKUP_PLAN_NAME:要删除的备份方案的名称。

  • NAMESPACE:数据库集群的命名空间。

如需暂停备份方案而不删除它,请将备份方案资源的 paused 属性设置为 true。已暂停的备份方案会继续存储备份,并允许手动创建备份。