Backup e ripristino di Cassandra

Questa sezione illustra come configurare il backup e il ripristino dei dati per l'anello di database Apache Cassandra installato nel piano di runtime ibrido Apigee. Vedi anche Database Cassandra.

Cosa devi sapere sui backup di Cassandra

Cassandra è un database replicato configurato per avere almeno 3 copie dei tuoi dati in ogni regione o data center. Cassandra utilizza la replica dei flussi di dati e le riparazioni di lettura per mantenere le repliche dei dati in ogni regione o data center in qualsiasi momento.

Nel sistema ibrido, i backup Cassandra non sono abilitati per impostazione predefinita. Tuttavia, è consigliabile abilitare i backup di Cassandra nel caso in cui i dati vengano eliminati accidentalmente.

Quali elementi vengono sottoposti a backup?

La configurazione di backup descritta in questo argomento esegue il backup delle seguenti entità:

  • Schema Cassandra che include lo schema utente (definizioni dello spazio dei chiavi Apigee)
  • Informazioni sul token di partizione Cassandra per nodo
  • Un'istantanea dei dati di Cassandra

Dove vengono archiviati i dati di backup?

I dati di cui hai eseguito il backup sono archiviati in un bucket Google Cloud Storage (GCS) che devi creare. In questo argomento vengono trattati la creazione e la configurazione dei bucket.

Pianificazione dei backup di Cassandra

I backup sono pianificati come cron job nel piano di runtime. Per pianificare i backup di Cassandra:

  1. Esegui questo comando create-service-account per creare un account di servizio Google Cloud con il ruolo roles/storage.objectAdmin standard. Questo ruolo SA consente di scrivere dati di backup in Google Cloud Storage (GCS). Esegui questo comando nella directory principale di installazione ibrida:
    ./tools/create-service-account apigee-cassandra output-dir
    Ad esempio:
    ./tools/create-service-account apigee-cassandra ./service-accounts
    Per maggiori informazioni sugli account di servizio Google Cloud, consulta Creazione e gestione degli account di servizio.
  2. Il comando create-service-account salva un file JSON contenente la chiave privata dell'account di servizio. Il file viene salvato nella stessa directory in cui viene eseguito il comando. Il percorso di questo file sarà necessario nei seguenti passaggi.
  3. Crea un bucket GCS. Specifica un criterio di conservazione dei dati ragionevole per il bucket. Apigee consiglia un criterio di conservazione dei dati di 15 giorni.
  4. Apri il file overrides.yaml.
  5. Aggiungi le seguenti proprietà cassandra.backup per attivare il backup. Non rimuovere le proprietà già configurate.
    cassandra:
      ...
    
      backup:
        enabled: true
        serviceAccountPath: sa_json_file_path
        dbStorageBucket: gcs_bucket_path
        schedule: backup_schedule_code
    
      ...
    Dove:
    Proprietà Descrizione
    enabled Il backup è disattivato per impostazione predefinita. Devi impostare questa proprietà su true
    serviceAccountPath Il percorso nel tuo file system al file JSON dell'account di servizio che è stato scaricato quando hai eseguito ./tools/create-service-account
    dbStorageBucket Percorso del bucket di archiviazione GCS nel formato gs://bucket_name. Il campo gs:// è obbligatorio.
    schedule L'ora di avvio del backup, specificata nella sintassi standard di crontab. Valore predefinito: 0 2 * * *

    Nota: evita di pianificare un backup che si avvii poco tempo dopo aver applicato la configurazione del backup al cluster. Quando applichi la configurazione di backup, Kubernetes ricrea i nodi Cassandra. Se il backup viene avviato prima del riavvio dei nodi (possibilmente diversi minuti), l'operazione non andrà a buon fine.

    Ad esempio:
    ...
    
    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. Applica le modifiche alla configurazione al nuovo cluster. Ad esempio:
    ./apigeectl apply -c 2_cassandra -v beta2

Ripristino dei backup

Il ripristino prende i dati dalla posizione di backup e li ripristina in un nuovo cluster Cassandra con lo stesso numero di pod. Il nuovo cluster deve avere uno spazio dei nomi diverso da quello del cluster del piano di runtime.

Per ripristinare i backup Cassandra:

  1. Crea un nuovo cluster Kubernetes con un nuovo spazio dei nomi. Non puoi utilizzare lo stesso cluster/spazio dei nomi che hai utilizzato per l'installazione ibrida originale.
  2. Nella directory di installazione ibrida principale, crea un nuovo file overrides-restore.yaml.
  3. Copia la configurazione Cassandra completa dal tuo file overrides.yaml originale in quello nuovo.
  4. Aggiungi un elemento dello spazio dei nomi. Non utilizzare lo stesso spazio dei nomi che hai utilizzato per il cluster originale.
  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
    
    Dove:
    Proprietà Descrizione
    ssl*Path, auth.* Utilizza le stesse credenziali di autenticazione TLS che hai utilizzato per creare il database Cassandra originale.
    snapshotTimestamp Il timestamp dello snapshot di backup da ripristinare.
    serviceAccountPath Il percorso del file system all'account di servizio creato per il backup.
    dbStorageBucket Percorso del bucket di archiviazione GCS in cui è archiviato il backup, in questo formato: gs://bucket_name. Il campo gs:// è obbligatorio.
    Ad esempio:
    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
    
    

    Dove snapshotTimestamp è il timestamp associato al backup che stai ripristinando.

  6. Crea il nuovo cluster Cassandra:
      ./apigeectl apply -c 2_cassandra -v beta2 -f ./overrides-restore.yaml
      ./apigeectl apply -c 2_cassandra-role -v beta2 

Visualizzazione dei log di ripristino

Puoi controllare i log del job di ripristino e grep per error per assicurarti che il log di ripristino non contenga errori.

Verifica il completamento del ripristino

Per verificare se l'operazione di ripristino è stata completata:

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

Visualizza i log di ripristino

Per visualizzare i log di ripristino:

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

Verifica job di backup

Puoi anche verificare il job di backup dopo la pianificazione del cronjob di backup. Dopo aver pianificato il cronjob, dovresti vedere qualcosa di simile a questo:

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

Controlla i log di backup

Il job di backup:

  • Crea un file schema.cql.
  • Lo carica nel tuo bucket di archiviazione.
  • Esegue l'eco sul nodo per eseguire il backup dei dati e li carica contemporaneamente.
  • Attende il caricamento di tutti i dati.
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