تنفيذ نسخة احتياطية

هيّئ نسخًا احتياطية تلقائية لـ PostgreSQL لقواعد بيانات IBM Bob وتحقق من تشغيل مهام النسخ الاحتياطي بشكل صحيح.

استخدم هذا الإجراء لتكوين النسخ الاحتياطية التلقائية لـ PostgreSQL لقواعد بيانات IBM Bob. بعد تكوين النسخ الاحتياطية، يُنشئ المُشغِّل مهام النسخ الاحتياطي المجدوَلة ويديرها تلقائيًا.

قبل البدء

قبل تكوين النسخ الاحتياطية، تحقق من المتطلبات الأساسية التالية:

  • فئة تخزين مدعومة متاحة في المجموعة.
  • أسرار بيانات اعتماد قاعدة البيانات موجودة.
  • سعة تخزين كافية مخصصة.
  • مجموعات PostgreSQL تعمل وفي حالة صحية.

تكوين النسخ الاحتياطية وتفعيلها

أنشئ ConfigMap للنسخ الاحتياطي يُعرّف جدول النسخ الاحتياطي وسياسة الاستبقاء وتكوين التخزين ومجموعات قواعد البيانات المستهدفة.

يكتشف المُشغِّل تلقائيًا أي 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"  # Required
    app.kubernetes.io/name: bob
    app.kubernetes.io/component: postgres-backup
data:
  config.yaml: |
    # Backup schedule in cron format (UTC timezone)
    schedule: "0 2 * * *"

    # Storage class for backup PVCs
    backupStorageClass: "nfs-storage"

    # Number of backups to retain per cluster (default: 7)
    retention: 7

    # Size of backup PVC per cluster (default: 10Gi)
    pvcSize: "10Gi"

    # Optional: PostgreSQL image override
    # If not specified, image is auto-detected from running clusters
    # postgresImage: "icr.io/cpopen/ibm-postgresql:16.4"

    # Clusters to back up
    # If omitted, defaults to bob-db and bob-keycloak-db
    clusters:
      - name: bob-db
        database: bob
        secretName: bob-db-app
      - name: bob-keycloak-db
        database: app  # Note: Keycloak database is named "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

يُرشد هذا الإعداد المُشغِّل إلى إنشاء موارد النسخ الاحتياطي وإدارتها تلقائيًا.

طبّق المورد المخصص المحدَّث:

oc apply -f bob-cr.yaml

تحقق من أن المُشغِّل أنشأ بنية النسخ الاحتياطي المجدوَلة بنجاح.

افحص CronJobs:

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

افحص PVCs:

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 المُولَّد:

# Manually create a job from the CronJob
oc create job --from=cronjob/bob-db-backup-cronjob manual-backup-$(date +%s) -n <bob-instance-namespace>

# Monitor the job
oc get jobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

# View job logs
oc logs -n <bob-instance-namespace> job/manual-backup-<timestamp>

بعد انتهاء النسخة الاحتياطية، تحقق من إنشاء ملفات النسخ الاحتياطي بنجاح.

تحقق مما يلي:

  • اكتملت المهمة بنجاح.
  • ملف النسخة الاحتياطية موجود.
  • ملف بيانات الوصف موجود.
  • حجم النسخة الاحتياطية منطقي.
  • لا توجد أخطاء في سجلات المهمة.
# Check job status
oc get jobs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup

# View backup logs
oc logs -n <bob-instance-namespace> -l app.kubernetes.io/component=postgres-backup --tail=50

# Access backup files
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"
        }
      }]
    }
  }'

# Inside the 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نعم—فئة التخزين لـ PVCs الخاصة بالنسخ الاحتياطية.
retentionلا7عدد النسخ الاحتياطية المُبقاة لكل مجموعة.
pvcSizeلا10Giحجم PVC لكل مجموعة.
postgresImageلامكتشف تلقائيًاصورة PostgreSQL لمهام النسخ الاحتياطي.
clustersلاالمجموعات الافتراضيةقائمة المجموعات المراد نسخها احتياطيًا.

إرشادات تحديد حجم التخزين

لحساب التخزين المطلوب لكل مجموعة:

Required size = (database size × 0.3) × retention × 1.5

Example:
- Database: 5 GB
- Compression: 0.3 (70% compression)
- Retention: 7 backups
- Safety factor: 1.5

Required: 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
ما رأيك في هذا الموضوع؟