使用 Cloud Storage 备份在 Kubernetes 中克隆数据库集群

本页介绍了如何使用 AlloyDB Omni 数据库集群的 Cloud Storage 备份在 Kubernetes 中克隆数据库集群。

以下工作流程介绍了克隆所用步骤:

  1. 在停用了 livenessProbe 参数的目标数据库集群上创建并应用 DBCluster 清单文件。
  2. 创建并配置 pgbackrest.conf 文件以访问 Cloud Storage 备份。
  3. 使用 pgBackRest 命令验证您是否可以访问源备份。
  4. 使用 pgBackRest 命令将备份恢复到目标数据库集群。

准备工作

  • 确保您有权访问存储源数据库集群备份的 Cloud Storage 存储桶的完整路径。此路径与您为源数据库集群创建 BackupPlan 资源时使用的路径相同。
  • 创建目标 AlloyDB Omni 数据库集群。如需详细了解如何在 Kubernetes 上安装 AlloyDB Omni,请参阅创建数据库集群
  • 确保您已以 postgres 用户身份登录数据库。

在目标数据库集群中创建数据库集群

通过临时停用 livenessProbe 参数创建数据库集群。恢复完成后,重新配置 livenessProbe 参数。

  1. 创建 DBCluster 资源清单文件:

      apiVersion: v1
      kind: Secret
      metadata:
        name: db-pw-DB_CLUSTER_NAME
      type: Opaque
      data:
        DB_CLUSTER_NAME: "ENCODED_PASSWORD"
      ---
      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: DBCluster
      metadata:
        name: DB_CLUSTER_NAME
      spec:
        primarySpec:
          availabilityOptions:
            livenessProbe: "Disabled"
          adminUser:
            passwordRef:
              name: db-pw-DB_CLUSTER_NAME
          resources:
            cpu: CPU_COUNT
            memory: MEMORY_SIZE
            disks:
            - name: DataDisk
              size: DISK_SIZE
              storageClass: standard
    

    替换以下内容:

    • DB_CLUSTER_NAME:此数据库集群的名称,例如 my-db-cluster

    • ENCODED_PASSWORD:默认 postgres 用户角色的数据库登录密码,编码为 base64 字符串,例如 ChangeMe123Q2hhbmdlTWUxMjM=

    • CPU_COUNT:此数据库集群中每个数据库实例可用的 CPU 数量。

    • MEMORY_SIZE:此数据库集群中每个数据库实例的内存量。我们建议将此值设置为每个 CPU 8 千兆字节。例如,如果您在此清单中之前将 cpu 设置为 2,我们建议将 memory 设置为 16Gi

    • DISK_SIZE:每个数据库实例的磁盘大小,例如 10Gi

  2. 应用清单文件:

      kubectl apply -f DBCLUSTER_FILENAME

    替换以下内容:

    • DBCLUSTER_FILENAME:在上一步中创建的 DBCluster 清单文件的名称。

使用 kubectl describe 命令验证数据库集群资源是否处于 READY 状态。

配置 pgBackRest 文件

配置 pgBackRest 文件,以便目标数据库集群能够访问存储源备份的 Cloud Storage 存储桶。

  1. 在目标数据库集群中,找到数据库集群 pod 详细信息:

      kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=<var>DB_CLUSTER_NAME</var>, alloydbomni.internal.dbadmin.goog/task-type=database"

    响应包含集群数据库 pod 的名称。

  2. 登录 pod:

      kubectl exec -ti DATABASE_POD_NAME  -- /bin/bash

    替换以下内容:

    • DATABASE_POD_NAME:上一步中的数据库集群 Pod 的名称。
  3. 请先停止 pod,然后再更新 pgBackRest 配置文件:

      supervisorctl.par stop postgres
  4. 创建 pgBackRest 配置文件以访问存储在 Cloud Storage 中的备份:

      cat << EOF > /backup/pgbackrest.conf
      [db]
      pg1-path=/mnt/disks/pgsql/data
      pg1-socket-path=/tmp
      pg1-user=pgbackrest
      [global]
      log-path=/obs/pgbackrest
      log-level-file=info
      repo1-type=gcs
      repo1-gcs-bucket=GCS_SOURCE_BACKUP_BUCKET_NAME
      repo1-path=GCS_SOURCE_BACKUP_BUCKET_PATH
      repo1-storage-ca-file=/etc/ssl/certs/ca-certificates.crt
      repo1-retention-full=9999999
      repo1-gcs-key-type=auto

    替换以下内容:

    • GCS_SOURCE_BACKUP_BUCKET_NAME:您在为源数据库集群创建 BackupPlan 资源清单文件时创建的 Cloud Storage 存储桶的名称。这不是存储桶的完整网址;请勿在存储桶名称前面添加 gs://
    • GCS_SOURCE_BACKUP_BUCKET_PATH:AlloyDB Omni 运维者将备份写入到源数据库集群的 Cloud Storage 存储桶中目录的路径。路径必须是绝对路径,且以 / 开头。

    repo1-gcs-key-type 设置为 auto,以使用实例的服务账号。如需详细了解其他选项,请参阅 GCS 代码库密钥类型选项

验证目标数据库集群中的源备份

运行 pgBackRest 命令,验证目标数据库集群是否可以访问源数据库集群备份。

pgbackrest --config-path=/backup --stanza=db --repo=1 info

以下是示例响应:

  stanza: db
      status: ok
      cipher: none
      db (current)
          wal archive min/max (15): 000000010000000000000002/00000001000000000000000D
          full backup: 20240213-231400F
              timestamp start/stop: 2024-02-13 23:14:00+00 / 2024-02-13 23:17:14+00
              wal start/stop: 000000010000000000000003 / 000000010000000000000003
              database size: 38.7MB, database backup size: 38.7MB
              repo1: backup set size: 4.6MB, backup size: 4.6MB
          incr backup: 20240213-231400F_20240214-000001I
              timestamp start/stop: 2024-02-14 00:00:01+00 / 2024-02-14 00:00:05+00
              wal start/stop: 00000001000000000000000D / 00000001000000000000000D
              database size: 38.7MB, database backup size: 488.3KB
              repo1: backup set size: 4.6MB, backup size: 84.2KB
              backup reference list: 20240213-231400F

响应中的时间戳用于恢复完整备份,或从恢复期限内的时间点恢复。

在目标数据库集群中恢复备份

确定要恢复到的备份或时间点后,请在目标数据库集群中运行 pgBackRest 命令。如需详细了解这些命令,请参阅恢复命令

以下是一些 pgBackRest 恢复命令示例:

  • 使用备份进行恢复

    pgbackrest --config-path=/backup --stanza=db --repo=1 restore --set=20240213-231400F --type=immediate --target-action=promote --delta --link-all --log-level-console=info
  • 从某个时间点恢复

    pgbackrest --config-path=/backup --stanza=db --repo=1 restore --target="2024-01-22 11:27:22" --type=time --target-action=promote --delta --link-all --log-level-console=info

重启 pod

恢复命令成功完成后,您可以启动 postgres 进程。

supervisorctl.par start postgres

postgres 进程启动后,您可以连接到主实例并运行查询,以验证数据是否已从备份中恢复。如需了解详情,请参阅连接到在 Kubernetes 上运行的 AlloyDB Omni

配置数据库集群

克隆数据库集群后,请配置数据库集群规范。最重要的是,别忘了使用以下命令启用 livenessProbe 参数:

    kubectl patch dbcluster DBCLUSTER_FILENAME --type merge -p '{"spec":{"primarySpec":{"availabilityOptions":{"livenessProbe":"Enabled"}}}}'

后续步骤