גיבוי ושחזור של נתוני Cassandra

בקטע הזה נסביר איך להגדיר גיבוי ושחזור נתונים עבור טבעת מסד הנתונים של Apache Cassandra שהותקנה במישור זמן הריצה של Apigee Hybrid. ראו גם מסד נתונים של Cassandra.

מה צריך לדעת על גיבויים של Cassandra

‫Cassandra הוא מסד נתונים משוכפל שמוגדר כך שיהיו לפחות 3 עותקים של הנתונים שלכם בכל אזור או מרכז נתונים. מערכת Cassandra משתמשת בשכפול סטרימינג ובתיקוני קריאה כדי לשמור על העתקי הנתונים בכל אזור או מרכז נתונים בכל נקודה נתונה.

בסביבה היברידית, הגיבויים של Cassandra לא מופעלים כברירת מחדל. עם זאת, מומלץ להפעיל גיבויים של Cassandra למקרה שהנתונים יימחקו בטעות.

מה מגובֶה?

הגדרות הגיבוי שמתוארות במאמר הזה מגבות את הישויות הבאות:

  • סכימת Cassandra כולל סכימת המשתמש (הגדרות של מרחב מפתחות Apigee)
  • פרטי טוקן של מחיצת Cassandra לכל צומת
  • תמונת מצב של נתוני Cassandra

איפה נשמרים נתוני הגיבוי?

הנתונים המגובים מאוחסנים בקטגוריה של Google Cloud Storage ‏ (GCS) שאתם צריכים ליצור. בנושא הזה מוסבר איך ליצור קטגוריה ואיך להגדיר אותה.

תזמון גיבויים של Cassandra

גיבויים מתוזמנים כמשימות cron במישור זמן הריצה. כדי לתזמן גיבויים של Cassandra:

  1. מריצים את הפקודה הבאה create-service-account כדי ליצור חשבון שירות (SA) ב-GCP עם התפקיד הרגיל roles/storage.objectAdmin. תפקיד ה-SA הזה מאפשר לכם לכתוב נתוני גיבוי ב-Google Cloud Storage‏ (GCS). מריצים את הפקודה הבאה בספריית הבסיס של ההתקנה ההיברידית:
    ./tools/create-service-account apigee-cassandra output-dir
    לדוגמה:
    ./tools/create-service-account apigee-cassandra ./service-accounts
    מידע נוסף על חשבונות שירות ב-GCP זמין במאמר יצירה וניהול של חשבונות שירות.
  2. הפקודה create-service-account שומרת קובץ JSON שמכיל את המפתח הפרטי של חשבון השירות. הקובץ נשמר באותה ספרייה שבה מופעלת הפקודה. תצטרכו את הנתיב לקובץ הזה בשלבים הבאים.
  3. יצירת קטגוריה ב-GCS. מציינים מדיניות שמירת נתונים סבירה לקטגוריה. ‫Apigee ממליצה על מדיניות שמירת נתונים של 15 ימים.
  4. פותחים את קובץ overrides.yaml.
  5. כדי להפעיל גיבוי, מוסיפים את המאפיינים הבאים cassandra.backup. אל תסירו אף אחת מהמאפיינים שכבר הוגדרו.
    cassandra:
      ...
    
      backup:
        enabled: true
        serviceAccountPath: sa_json_file_path
        dbStorageBucket: gcs_bucket_path
        schedule: backup_schedule_code
    
      ...
    איפה:
    מאפיין (property) תיאור
    enabled הגיבוי מושבת כברירת מחדל. צריך להגדיר את המאפיין הזה לערך true
    serviceAccountPath הנתיב במערכת הקבצים לקובץ ה-JSON של חשבון השירות שהורד כשמריצים את ./tools/create-service-account
    dbStorageBucket נתיב של קטגוריית אחסון ב-GCS בפורמט הזה: gs://bucket_name. השדה gs:// הוא שדה חובה.
    schedule השעה שבה הגיבוי מתחיל, שצוינה בתחביר crontab רגיל. ברירת מחדל: 0 2 * * *

    הערה: מומלץ להימנע מתזמון גיבוי שמתחיל זמן קצר אחרי שמחילים את הגדרת הגיבוי על האשכול. כשמחילים את הגדרות הגיבוי, Kubernetes יוצר מחדש את צמתי Cassandra. אם הגיבוי יתחיל לפני שהצמתים יופעלו מחדש (יכול להיות שיעברו כמה דקות) הגיבוי ייכשל.

    לדוגמה:
    ...
    
    cassandra:
      storage:
        type: gcepd
        capacity: 50Gi
        gcepd:
          replicationType: regional-pd
      sslRootCAPath: "/Users/myhome/ssh/cassandra.crt"
      sslCertPath: "/Users/myhome/ssh/cassandra.crt"
      sslKeyPath: "/Users/myhome/ssh/cassandra.key"
      auth:
        default:
          password: "abc123"
        admin:
          password: "abc234"
        ddl:
          password: "abc345"
        dml:
          password: "abc456"
      nodeSelector:
        key: cloud.google.com/gke-nodepool
        value: apigee-data
      backup:
        enabled: true
        serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json"
        dbStorageBucket: "gs://myname-cassandra-backup"
        schedule: "45 23 * * 6"
    
      ... 
  6. מחילים את שינויי ההגדרות על האשכול החדש. לדוגמה:
    ./apigeectl apply -c 2_cassandra -v beta2

שחזור גיבויים

השחזור לוקח את הנתונים ממיקום הגיבוי ומשחזר אותם לאשכול Cassandra חדש עם אותו מספר של pods. לצביר החדש צריך להיות מרחב שמות ששונה מהצביר של מישור זמן הריצה.

כדי לשחזר גיבויים של Cassandra:

  1. יוצרים אשכול Kubernetes חדש עם מרחב שמות חדש. אי אפשר להשתמש באותו אשכול או באותו מרחב שמות שבהם השתמשתם בהתקנה ההיברידית המקורית.
  2. בספריית השורש של ההתקנה ההיברידית, יוצרים קובץ חדש בשם overrides-restore.yaml.
  3. מעתיקים את ההגדרה המלאה של Cassandra מקובץ overrides.yaml המקורי לקובץ החדש.
  4. מוסיפים רכיב של מרחב שמות. אל תשתמשו באותו מרחב שמות שבו השתמשתם באשכול המקורי.
  5. namespace: your-restore-namespace
    
    cassandra:
      storage:
        type: gcepd
        capacity: 50Gi
        gcepd:
          replicationType: regional-pd
      nodeSelector:
        key: cloud.google.com/gke-nodepool
        value: apigee-data
      sslRootCAPath: path_to_root_ca_file
      sslCertPath: path_to_ssl_cert_file
      sslKeyPath: path_to_ssl_key_file
      auth:
        default:
          password: your_cassandra_password
        admin:
          password: admin_password
        ddl:
          password: ddl_password
        dml:
          password: dml_password
    
      restore:
          enabled: true
          snapshotTimestamp: timestamp
          serviceAccountPath: sa_json_file_path
          dbStorageBucket: gcs_bucket_path
          image:
            pullPolicy: Always
    איפה:
    מאפיין (property) תיאור
    ssl*Path, auth.* משתמשים באותם פרטי אימות של TLS שבהם השתמשתם כדי ליצור את מסד הנתונים המקורי של Cassandra.
    snapshotTimestamp חותמת הזמן של תמונת המצב של הגיבוי שרוצים לשחזר.
    serviceAccountPath הנתיב במערכת הקבצים לחשבון השירות שיצרתם לגיבוי.
    dbStorageBucket נתיב של קטגוריית אחסון ב-GCS שבה הגיבוי מאוחסן, בפורמט הזה: gs://bucket_name. השדה gs:// הוא שדה חובה.
    לדוגמה:
    namespace: cassandra-restore
    
    cassandra:
      storage:
        type: gcepd
        capacity: 50Gi
        gcepd:
          replicationType: regional-pd
      sslRootCAPath: "/Users/myhome/ssh/cassandra.crt"
      sslCertPath: "/Users/myhome/ssh/cassandra.crt"
      sslKeyPath: "/Users/myhome/ssh/cassandra.key"
      auth:
        default:
          password: "abc123"
        admin:
          password: "abc234"
        ddl:
          password: "abc345"
        dml:
          password: "abc456"
      nodeSelector:
        key: cloud.google.com/gke-nodepool
        value: apigee-data
      restore:
        enabled: true
        snapshotTimestamp: "20190417002207"
        serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json"
        dbStorageBucket: "gs://myname-cassandra-backup"
        image:
          pullPolicy: Always

    כאשר snapshotTimestamp היא חותמת הזמן שמשויכת לגיבוי שאתם משחזרים.

  6. יוצרים את אשכול Cassandra החדש:
      ./apigeectl apply -c 2_cassandra -v beta2 -f ./overrides-restore.yaml
      ./apigeectl apply -c 2_cassandra-role -v beta2 

צפייה ביומני השחזור

אפשר לבדוק את יומני העבודות של השחזור ולחפש את error כדי לוודא שביומן השחזור אין שגיאות.

אימות השלמת השחזור

כדי לבדוק אם פעולת השחזור הושלמה:

kubectl get pods

NAME                           READY     STATUS      RESTARTS   AGE
apigee-cassandra-0             1/1       Running     0          1h
apigee-cassandra-1             1/1       Running     0          1h
apigee-cassandra-2             1/1       Running     0          59m
apigee-cassandra-restore-b4lgf 0/1       Completed   0          51m

צפייה ביומני השחזור

כדי לראות את יומני השחזור:

kubectl logs -f apigee-cassandra-restore-b4lgf

Restore Logs:

Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
to download file gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1/backup_20190405011309_schema.tgz
INFO: download sucessfully extracted the backup files from gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
finished downloading schema.cql
to create schema from 10.32.0.28

Warnings :
dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0

dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0


Warnings :
dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0

dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0

INFO: the schema has been restored
starting apigee-cassandra-0 in default
starting apigee-cassandra-1 in default
starting apigee-cassandra-2 in default
84 95 106
waiting on waiting nodes $pid to finish  84
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
INFO: restore downloaded  tarball and extracted the file from  gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO: restore downloaded  tarball and extracted the file from  gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO: restore downloaded  tarball and extracted the file from  gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO  12:02:28 Configuration location: file:/etc/cassandra/cassandra.yaml
…...

INFO  12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed

Summary statistics:
   Connections per host    : 3
   Total files transferred : 2
   Total bytes transferred : 0.378KiB
   Total duration          : 5048 ms
   Average transfer rate   : 0.074KiB/s
   Peak transfer rate      : 0.075KiB/s

progress: [/10.32.1.155]0:1/1 100% 1:1/1 100% [/10.32.0.28]1:1/1 100% 0:1/1 100% [/10.32.3.220]0:1/1 100% 1:1/1 100% total: 100% 0.000KiB/s (avg: 0.074KiB/s)
INFO  12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed
progress: [/10.32.1.155]0:1/1 100% 1:1/1 100% [/10.32.0.28]1:1/1 100% 0:1/1 100% [/10.32.3.220]0:1/1 100% 1:1/1 100% total: 100% 0.000KiB/s (avg: 0.074KiB/s)
INFO  12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed
INFO  12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed
INFO: ./apigee/data/cassandra/data/ks1/user-9fbae960571411e99652c7b15b2db6cc restored successfully
INFO: Restore 20190405011309 completed
INFO: ./apigee/data/cassandra/data/ks1/user-9fbae960571411e99652c7b15b2db6cc restored successfully
INFO: Restore 20190405011309 completed
waiting on waiting nodes $pid to finish  106
Restore finished

אימות של עבודת הגיבוי

אפשר גם לאמת את עבודת הגיבוי אחרי שתזמנתם את משימת ה-cron לגיבוי. אחרי שתזמנו את משימת ה-cron, אתם אמורים לראות משהו כזה:

kubectl get pods
NAME                        READY     STATUS      RESTARTS   AGE
apigee-cassandra-0          1/1       Running     0          2h
apigee-cassandra-1          1/1       Running     0          2h
apigee-cassandra-2          1/1       Running     0          2h
apigee-cassandra-backup-1554515580-pff6s   0/1       Running     0          54s

בדיקת יומני הגיבוי

משימת הגיבוי:

  • המערכת יוצרת קובץ schema.cql.
  • העלאה לקטגוריית האחסון.
  • הפקודה משקפת את הצומת כדי לגבות את הנתונים ומעלה אותם בו-זמנית.
  • הפונקציה ממתינה עד שכל הנתונים יועלו.
kubectl logs -f apigee-cassandra-backup-1554515580-pff6s

myusername-macbookpro:cassandra-backup-utility myusername$ kubectl logs -f apigee-cassandra-backup-1554577680-f9sc4
starting apigee-cassandra-0 in default
starting apigee-cassandra-1 in default
starting apigee-cassandra-2 in default
35 46 57
waiting on process  35
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false}
Snapshot directory: 20190406190808
INFO: backup created cassandra snapshot 20190406190808
tar: Removing leading `/' from member names
/apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/
/apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/20190406190808/
/apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Data.db
Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false}
Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false}
Snapshot directory: 20190406190808
INFO: backup created cassandra snapshot 20190406190808
tar: Removing leading `/' from member names
/apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/
/apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/20190406190808/
/apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/20190406190808/manifest.json
/apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/
/apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/20190406190808/
/apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/20190406190808/manifest.json
/apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/
/apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/20190406190808/
/apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/20190406190808/manifest.json
/apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/
/apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/20190406190808/
/apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/20190406190808/manifest.json
/apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/
/apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/20190406190808/
/apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/20190406190808/manifest.json
……
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Filter.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-CompressionInfo.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Index.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Statistics.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Data.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Index.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Statistics.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-TOC.txt
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Statistics.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Summary.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Filter.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Summary.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Index.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/manifest.json
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Filter.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Digest.crc32
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Summary.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Data.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-TOC.txt
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/schema.cql
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-CompressionInfo.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Digest.crc32
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-TOC.txt
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Data.db
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Digest.crc32
/apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-CompressionInfo.db
……
/tmp/tokens.txt
/ [1 files][    0.0 B/    0.0 B]
Operation completed over 1 objects.
/ [1 files][    0.0 B/    0.0 B]
Operation completed over 1 objects.
INFO: backup created tarball and transfered the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO: removing cassandra snapshot
INFO: backup created tarball and transfered the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO: removing cassandra snapshot
Requested clearing snapshot(s) for [all keyspaces]
INFO: Backup 20190406190808 completed
waiting on process  46
Requested clearing snapshot(s) for [all keyspaces]
INFO: Backup 20190406190808 completed
Requested clearing snapshot(s) for [all keyspaces]
waiting on process  57
INFO: Backup 20190406190808 completed
waiting result
to get schema from 10.32.0.28
INFO: /tmp/schema.cql has been generated
Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com]
tar: removing leading '/' from member names
tmp/schema.cql
Copying from ...
/ [1 files][    0.0 B/    0.0 B]
Operation completed over 1 objects.
INFO: backup created tarball and transfered the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
finished uploading schema.cql