在 Kubernetes 中备份和恢复

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

如需启用 AlloyDB Omni 持续备份和恢复,您必须为每个数据库集群创建备份方案。系统会根据 backupPlan 资源中定义的备份时间表进行备份。如果备份方案中未定义备份时间表,则系统会默认每天进行持续备份。您可以通过恢复时段中的任意时间戳(精确到秒)恢复或克隆备份。

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

启用和安排备份

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

  • AlloyDB Omni 操作器用于存储备份的位置。这可以是 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 操作器保留此备份的天数。它必须是介于 190 之间的整数。默认值为 14

  • PAUSED_BOOLEAN:指定备份方案是否暂停。请提供以下值之一:

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

    • false:AlloyDB Omni 操作器会根据 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 操作器保留此备份的天数。它必须是介于 190 之间的整数。默认值为 14

    • PAUSED_BOOLEAN:指定备份方案是否暂停。请提供以下值之一:

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

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

      默认值为 false

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

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

    • SECRET_NAME:您为前面步骤中创建的 Kubernetes Secret 选择的名称。

手动创建备份

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

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

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               TYPE
backup-plan-prod-20231026172643   Succeeded   2023-10-26T17:26:53Z       full
manual-backup-1                   Succeeded   2023-10-26T18:15:27Z       full
manual-backup-2                   InProgress                             full

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

  • 备份的名称。
  • 备份的状态,使用 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 操作器,您可以从恢复时段内的任何时间点克隆集群的数据。恢复时段的长度直接由保留期限决定。

例如,如果您的保留期限设置为 14 天,则您无法恢复 14 天之前的数据。您可以恢复到恢复时段内的任何时间点。AlloyDB Omni 操作器保留备份和日志的时间会比指定值延长一天。

  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 操作器会自动删除早于您在创建备份方案时指定的保留期限的备份。

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

  • 备份不是为其备份方案存储的唯一备份。AlloyDB Omni 操作器要求对于每个备份方案,至少存在一个备份。

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

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

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

替换以下内容:

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

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

对备份磁盘调整大小

如需对在 Kubernetes 集群中存储备份的本地磁盘调整大小,请完成以下步骤:

  1. 按如下所示更新 DBCluster 清单的 resources.disks 字段:

    spec:
      primarySpec:
        resources:
          disks:
            - name: BACKUP_DISK
              size: 10Gi
    

    BACKUP_DISK 替换为存储备份的磁盘的名称。

  2. 应用清单以强制执行更新。

    AlloyDB Omni 操作器会立即将更新后的规范应用于您的 DBCluster。

修改正在运行的数据库集群的备份磁盘时会受到以下限制:

  • 仅当指定的 storageClass 支持卷扩展时,您才能增加磁盘的大小。
  • 您无法减少磁盘的大小。

更新备份方案

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

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

  • 使用 kubectl patch 命令。

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

删除备份方案

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

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

替换以下内容:

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

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

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