排程備份

為 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 時區。
  • 如果資源受限,請錯開備份時間。
  • 定期監視備份成功情況。
  • 每月測試還原程序。
  • 記錄排程及其依據。
  • 為備份失敗設定警示。
這個主題如何?