执行备份

为 IBM Bob 数据库配置自动 PostgreSQL 备份,并验证备份任务是否正常运行。

使用此流程为 IBM Bob 数据库配置自动 PostgreSQL 备份。备份配置完成后,Operator 会自动创建和管理计划备份任务。

开始之前

在配置备份之前,请验证以下先决条件:

  • 集群中有可用的受支持存储类。
  • 数据库凭证 Secret 已存在。
  • 已分配足够的存储容量。
  • PostgreSQL 集群正在运行且健康。

配置并启用备份

创建一个备份 ConfigMap,用于定义备份计划、保留策略、存储配置和目标数据库集群。

Operator 会自动发现带有以下标签的 ConfigMap:

bob.ibm.com/backup-config: "true"

创建配置文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: bob-postgres-backup-config
  namespace: <bob-instance-namespace>
  labels:
    bob.ibm.com/backup-config: "true"  # 必填
    app.kubernetes.io/name: bob
    app.kubernetes.io/component: postgres-backup
data:
  config.yaml: |
    # 备份计划(cron 格式,UTC 时区)
    schedule: "0 2 * * *"

    # 备份 PVC 的存储类
    backupStorageClass: "nfs-storage"

    # 每个集群保留的备份数量(默认:7)
    retention: 7

    # 每个集群的备份 PVC 大小(默认:10Gi)
    pvcSize: "10Gi"

    # 可选:PostgreSQL 镜像覆盖
    # 如未指定,镜像将从运行中的集群自动检测
    # postgresImage: "icr.io/cpopen/ibm-postgresql:16.4"

    # 要备份的集群
    # 如省略,默认为 bob-db 和 bob-keycloak-db
    clusters:
      - name: bob-db
        database: bob
        secretName: bob-db-app
      - name: bob-keycloak-db
        database: app  # 注意:Keycloak 数据库名为 "app"
        secretName: bob-keycloak-db-app

应用 ConfigMap:

oc apply -f backup-config.yaml

在 Bob 自定义资源中启用备份管理:

apiVersion: bob.ibm.com/v1beta1
kind: Bob
metadata:
  name: bob-instance
  namespace: <bob-instance-namespace>
spec:
  postgresBackup:
    enabled: true
    suspend: false

此设置指示 Operator 自动创建和管理备份资源。

应用更新后的自定义资源:

oc apply -f bob-cr.yaml

验证 Operator 是否成功创建了计划备份基础设施。

检查 CronJob:

oc get cronjobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

预期输出:

NAME                              SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
bob-db-backup-cronjob             0 2 * * *   False     0        <none>          1m
bob-keycloak-db-backup-cronjob    0 2 * * *   False     0        <none>          1m

检查 PVC:

oc get pvc -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

检查备份脚本 ConfigMap:

oc get configmap postgres-backup-script -n <bob-instance-namespace>

检查 Bob CR 事件:

oc describe bob bob-instance -n <bob-instance-namespace>

IBM 建议在初始配置后运行一次手动备份。测试备份可在依赖计划备份之前验证连接性、权限、存储配置和备份执行。

从已生成的 CronJob 创建一次性备份任务:

# 手动从 CronJob 创建任务
oc create job --from=cronjob/bob-db-backup-cronjob manual-backup-$(date +%s) -n <bob-instance-namespace>

# 监控任务
oc get jobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

# 查看任务日志
oc logs -n <bob-instance-namespace> job/manual-backup-<timestamp>

备份完成后,验证备份文件是否已成功创建。

请验证以下内容:

  • 任务已成功完成。
  • 备份文件存在。
  • 元数据文件存在。
  • 备份大小合理。
  • 任务日志中没有错误。
# 检查任务状态
oc get jobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

# 查看备份日志
oc logs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup --tail=50

# 访问备份文件
oc run backup-check -n <bob-instance-namespace> --image=busybox --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "backup-check",
        "image": "busybox",
        "command": ["sh"],
        "stdin": true,
        "tty": true,
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

# 在 pod 内部执行:
ls -lh /backups/bob-db/
cat /backups/bob-db/backup_bob_*.sql.gz.meta

成功的备份将产生类似以下内容的输出:

==========================================
PostgreSQL Backup Script
==========================================
Cluster: bob-db
Database: bob
Timestamp: 20260902_020000
Backup file: /backups/bob-db/backup_bob_20260902_020000.sql.gz
Retention: 7 backups
==========================================
Starting pg_dump...
✓ Backup completed successfully
  Size: 1.2G
✓ Metadata file created
Cleaning up old backups...
  Current backup count: 7
✓ Cleanup completed
==========================================
✓ Backup process completed successfully
==========================================

配置参数

参数是否必填默认值描述
schedule是—Cron 计划表达式(UTC 时区)。
backupStorageClass是—备份 PVC 的存储类。
retention否7每个集群保留的备份数量。
pvcSize否10Gi每个集群的 PVC 大小。
postgresImage否自动检测备份任务使用的 PostgreSQL 镜像。
clusters否默认集群要备份的集群列表。

存储大小指南

计算每个集群所需存储的公式:

所需大小 = (数据库大小 × 0.3)× 保留数量 × 1.5

示例:
- 数据库:5 GB
- 压缩率:0.3(压缩 70%)
- 保留数量:7 个备份
- 安全系数:1.5

所需:5 × 0.3 × 7 × 1.5 = 15.75 GB ≈ 20 GB
数据库大小推荐 PVC保留数量
小于 1 GB5 Gi7
1–5 GB10 Gi7
5–20 GB50 Gi7
20–50 GB100 Gi5
大于 50 GB自定义3–5
这个主题怎么样?