執行備份

為 IBM Bob 資料庫設定自動 PostgreSQL 備份,並驗證備份工作是否正常運作。

使用此程序為 IBM Bob 資料庫設定自動 PostgreSQL 備份。備份設定完成後,Operator 會自動建立和管理排程備份工作。

開始之前

在設定備份之前,請驗證以下先決條件:

  • 叢集中有可用的受支援儲存類別(Storage Class)。
  • 資料庫憑證 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
這個主題如何?