计划备份

为 IBM Bob 配置和管理自动 PostgreSQL 备份计划,包括 cron 表达式、保留策略、暂停与恢复以及监控。

计划备份可自动保护数据库并降低数据丢失风险。IBM Bob 使用 Kubernetes CronJob 按照备份配置中定义的计划执行备份。

注意:

默认情况下,备份使用协调世界时(UTC)运行。

配置备份计划

通过更新备份配置 ConfigMap 中的 schedule 字段来配置备份计划。该值使用标准 cron 语法,决定备份任务的运行频率。

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

    # ... 其他配置 ...

了解 cron 语法

Cron 计划由五个字段组成,定义执行频率。

字段取值范围特殊字符
分钟0–59*, ,, -, /
小时0–23*, ,, -, /
日期1–31*, ,, -, /
月份1–12*, ,, -, /
星期0–7(0 和 7 均表示星期日)*, ,, -, /

请选择与你的恢复点目标(RPO)和业务需求一致的计划。

计划注意事项

时区(UTC)

所有计划均在 UTC 时区运行。请根据 UTC 时间规划计划,而非本地时间。例如:

  • 0 2 * * * = UTC 凌晨 2:00 = CEST(夏季)凌晨 4:00 或 CET(冬季)凌晨 3:00

并发备份

所有已配置的集群按相同计划同时备份。这会成倍增加存储 I/O 负载,并在所有备份之间共享网络带宽。若要在资源受限的环境中错开备份,请使用不同计划创建多个 ConfigMap:

# ConfigMap 1:bob-db 在凌晨 2 点
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: bob-db-backup-config
  labels:
    bob.ibm.com/backup-config: "true"
data:
  config.yaml: |
    schedule: "0 2 * * *"
    clusters:
      - name: bob-db
        database: bob
        secretName: bob-db-app
---
# ConfigMap 2:keycloak-db 在凌晨 3 点
apiVersion: v1
kind: ConfigMap
metadata:
  name: keycloak-db-backup-config
  labels:
    bob.ibm.com/backup-config: "true"
data:
  config.yaml: |
    schedule: "0 3 * * *"
    clusters:
      - name: bob-keycloak-db
        database: app
        secretName: bob-keycloak-db-app

备份时长

规划计划时请考虑数据库大小,以避免备份运行之间发生重叠。

数据库大小预计时长
小于 1 GB1–5 分钟
1–5 GB5–15 分钟
5–20 GB15–45 分钟
20–50 GB45–120 分钟
大于 50 GB2 小时以上

非高峰时段

在使用率低的时段安排备份。避开业务高峰时段,并在备份期间监控数据库性能。

更改计划

要更新备份计划,请编辑备份 ConfigMap:

oc edit configmap bob-postgres-backup-config -n <bob-instance-namespace>

更新 schedule 字段并保存。Controller 会自动检测到更改并更新 CronJob。

验证更新后的计划:

oc get cronjob bob-db-backup-cronjob -n <bob-instance-namespace> -o jsonpath='{.spec.schedule}'

暂停和恢复备份

如果你需要在维护期间暂停备份但不删除备份配置,请在 Bob 自定义资源中暂停备份:

oc patch bob bob-instance -n <bob-instance-namespace> --type=merge \
  -p '{"spec":{"postgresBackup":{"suspend":true}}}'

暂停备份会保留所有现有备份资源,同时阻止新任务运行。

验证 CronJob 是否已暂停:

oc get cronjobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup
# SUSPEND 列应显示 "True"

维护完成后恢复备份:

oc patch bob bob-instance -n <bob-instance-namespace> --type=merge \
  -p '{"spec":{"postgresBackup":{"suspend":false}}}'

监控备份活动

定期监控有助于确保备份任务持续成功运行,并且可以达成恢复目标。

# 列出最近的备份任务
oc get jobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup \
  --sort-by=.metadata.creationTimestamp

# 检查 CronJob 状态
oc get cronjobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

# 查看上次计划时间
oc get cronjob bob-db-backup-cronjob -n <bob-instance-namespace> \
  -o jsonpath='{.status.lastScheduleTime}'

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

及时调查失败情况,以防止备份覆盖出现缺口。

管理备份保留

保留策略决定在自动删除旧备份之前存储多少个备份副本。

data:
  config.yaml: |
    # 每个集群保留的备份数量
    retention: 7  # 保留最近 7 个备份

较高的保留值可提高恢复灵活性,但需要额外的存储空间。

保留行为:

  • 每次成功备份后,最旧的备份会自动删除。
  • 保留是按集群计算的——每个集群维护自己的计数。
  • 清理在备份创建后立即进行。

例如,设置 retention: 7 时:

  • 第 1–7 天:累积 7 个备份。
  • 第 8 天:创建新备份,删除第 1 天的备份。
  • 第 9 天:创建新备份,删除第 2 天的备份。

手动触发备份

要在计划之外手动触发备份:

# 从 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>

最佳实践

  • 在非高峰时段(通常为本地时间凌晨 2–4 点)安排备份。
  • 使用一致的计划以保证可预测性。
  • 设置计划时记住 UTC 时区。
  • 如果资源受限,请错开备份时间。
  • 定期监控备份成功情况。
  • 每月测试恢复流程。
  • 记录计划及其依据。
  • 为备份失败设置告警。
这个主题怎么样?