Backup e recupero di Cassandra

Questa sezione illustra come configurare il backup e il recupero dei dati per l'anello del database Apache Cassandra installato nel piano di runtime di Apigee hybrid. Vedi anche Datastore Cassandra.

Informazioni importanti sui backup di Cassandra

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

In ibrido, i backup di Cassandra non sono abilitati per impostazione predefinita. Tuttavia, è buona norma attivare i backup di Cassandra nel caso in cui i dati vengano eliminati accidentalmente.

Di cosa viene eseguito il backup?

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

  • Schema Cassandra incluso lo schema utente (definizioni dello spazio chiavi Apigee)
  • Informazioni sui token di partizione Cassandra per nodo
  • Uno snapshot dei dati di Cassandra

Dove vengono archiviati i dati di backup?

I dati di cui è stato eseguito il backup vengono archiviati in un bucket Google Cloud Storage che devi creare. La creazione e la configurazione dei bucket sono trattate in questo argomento.

Pianificazione dei backup di Cassandra

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

  1. Esegui il seguente comando create-service-account per creare un account di servizio (SA) Google Cloud con il ruolo standard roles/storage.objectAdmin. Questo ruolo SA ti consente di scrivere i dati di backup in Cloud Storage. Esegui il seguente comando nella directory principale dell'installazione ibrida:
    ./tools/create-service-account apigee-cassandra OUTPUT_DIR
    Ad esempio:
    ./tools/create-service-account apigee-cassandra ./service-accounts
    Per ulteriori informazioni sugli account di servizio Google Cloud, consulta Creare e gestire gli 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. Ti servirà il percorso di questo file nei passaggi successivi.
  3. Crea un bucket Cloud Storage. Specifica un criterio di conservazione dei dati ragionevole per il bucket. Apigee consiglia una norma 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.

    Parametri

    cassandra:
      ...
    
      backup:
        enabled: true
        serviceAccountPath: SA_JSON_FILE_PATH
        dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH
        schedule: BACKUP_SCHEDULE_CODE
    
      ...
      

    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. Dove:
    Proprietà Descrizione
    backup:enabled Il backup è disattivato per impostazione predefinita. Devi impostare questa proprietà su true.
    backup:serviceAccountPath

    SA_JSON_FILE_PATH

    Il percorso nel file system al file JSON dell'account di servizio scaricato quando hai eseguito ./tools/create-service-account

    backup:dbStorageBucket

    CLOUD_STORAGE_BUCKET_PATH

    Il percorso del bucket Cloud Storage in questo formato: gs://BUCKET_NAME. Il campo gs:// è obbligatorio.

    backup:schedule

    BACKUP_SCHEDULE_CODE

    L'ora di inizio del backup, specificata in sintassi crontab standard. Valore predefinito: 0 2 * * *

  7. Applica le modifiche alla configurazione al nuovo cluster. Ad esempio:
    ./apigeectl apply -f overrides.yaml

Ripristino dei backup

Il ripristino recupera i dati dalla posizione del backup e li ripristina in un nuovo cluster Cassandra con lo stesso numero di nodi. Nessun dato viene estratto dal vecchio cluster Cassandra.

Le istruzioni di ripristino riportate di seguito sono per i deployment in una singola regione che utilizzano Google Cloud Storage per i backup. Per i deployment in più regioni, consulta Deployment in più regioni su GKE e GKE On-Prem.

Per ripristinare i backup di Cassandra:

  1. Crea un nuovo spazio dei nomi all'interno del cluster Kubernetes esistente che verrà utilizzato per ripristinare il deployment dell'ambiente di runtime ibrido. Non utilizzare il nome dello spazio dei nomi originale per il nuovo spazio dei nomi. Non utilizzare lo spazio dei nomi precedente per il ripristino.
  2. Nella directory di installazione ibrida principale, crea un nuovo file overrides-restore.yaml.
  3. Copia la configurazione completa di Cassandra dal file overrides.yaml originale nel nuovo file overrides-restore.yaml. Vedi il comando seguente per un esempio.
    cp ./overrides.yaml ./overrides-restore.yaml
  4. Aggiungi un elemento dello spazio dei nomi al nuovo file overrides-restore.yaml. Non utilizzare lo stesso spazio dei nomi utilizzato per il cluster originale.

    Parametri

    namespace: YOUR_RESTORE_NAMESPACE
    cassandra:
      ...
      restore:
        enabled: true
        snapshotTimestamp: TIMESTAMP
        serviceAccountPath: SA_JSON_FILE_PATH
        dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH
             image:
               pullPolicy: Always
      ...

    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: "20210203213003"
            serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json"
            dbStorageBucket: "gs://myname-cassandra-backup"
            image:
              pullPolicy: Always
        ...
    

    Dove:

    Proprietà Descrizione
    namespace

    YOUR_RESTORE_NAMESPACE

    Il nome del nuovo spazio dei nomi che hai creato nel passaggio 1 per il nuovo cluster Cassandra. Non utilizzare lo stesso spazio dei nomi utilizzato per il tuo cluster originale.

    restore:enabled Il ripristino è disattivato per impostazione predefinita. Devi impostare questa proprietà su true.
    restore:snapshotTimestamp

    TIMESTAMP

    Il timestamp dello snapshot del backup da ripristinare. Per verificare quali timestamp possono essere utilizzati, vai a dbStorageBucket e controlla i file presenti nel bucket. Ogni nome file contiene un valore timestamp come il seguente:

    backup_20210203213003_apigee-cassandra-default-0.tgz

    dove 20210203213003 è il valore snapshotTimestamp che useresti se volessi ripristinare i backup creati in quel momento.

    restore:serviceAccountPath

    SA_JSON_FILE_PATH

    Il percorso nel file system all'account di servizio che hai creato per il backup.

    restore:dbStorageBucket

    CLOUD_STORAGE_BUCKET_PATH

    Il percorso del bucket Cloud Storage in cui sono archiviati i dati di backup nel seguente formato:

    gs://BUCKET_NAME

    Il campo gs:// è obbligatorio.

  5. Modifica l'etichetta app su tutti i nodi Cassandra nello spazio dei nomi precedente eseguendo il seguente comando:
    kubectl label pods --overwrite --namespace=OLD_NAMESPACE -l app=apigee-cassandra app=apigee-cassandra-old
    
  6. Crea un nuovo deployment del runtime ibrido. Verrà creato un nuovo cluster Cassandra e inizierà il ripristino dei dati di backup nel cluster:
    ./apigeectl init  -f ../overrides-restore.yaml
    
    ./apigeectl apply  -f ../overrides-restore.yaml
    
  7. Al termine del ripristino, il traffico deve essere impostato per utilizzare il cluster Cassandra nel nuovo spazio dei nomi. Esegui i seguenti comandi per trasferire il traffico:

    kubectl get rs -n OLD_NAMESPACE # look for the 'apigee-connect' replicaset
    
    kubectl patch rs -n OLD_NAMESPACE APIGEE_CONNECT_RS_NAME -p '{"spec":{"replicas" : 0}}'
    
  8. Una volta completato il trasferimento del traffico, puoi riconfigurare i backup sul cluster ripristinato rimuovendo la configurazione restore e aggiungendo la configurazione backup al file overrides-restore.yaml. Sostituisci YOUR_RESTORE_NAMESPACE con il nuovo nome dello spazio dei nomi creato nel passaggio 1.
    namespace: YOUR_RESTORE_NAMESPACE
    cassandra:
      ...
       backup:
        enabled: true
        serviceAccountPath: SA_JSON_FILE_PATH
        dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH
        schedule: BACKUP_SCHEDULE_CODE
      ...

    Quindi applica la configurazione backup con il seguente comando:

    ./apigeectl apply  -f ../overrides-restore.yaml
    

Visualizzazione dei log di ripristino

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

Verificare il completamento del ripristino

Utilizza il seguente comando per verificare se l'operazione di ripristino è stata completata:

kubectl get pods

L'output è simile al seguente:

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

Visualizza i log di ripristino

Utilizza il seguente comando per visualizzare i log di ripristino:

kubectl logs -f apigee-cassandra-restore-b4lgf

L'output è simile al seguente:

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 successfully 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-default-0 in default
starting apigee-cassandra-default-1 in default
starting apigee-cassandra-default-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 il job di backup

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

kubectl get pods

L'output è simile al seguente:

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

Controllare i log di backup

Il job di backup:

  • Crea un file schema.cql.
  • Lo carica nel bucket di archiviazione.
  • Esegue l'eco del nodo per eseguire il backup dei dati e li carica contemporaneamente.
  • Attende che tutti i dati vengano caricati.
kubectl logs -f apigee-cassandra-backup-1554515580-pff6s

L'output è simile al seguente:

myusername-macbookpro:cassandra-backup-utility myusername$ kubectl logs -f apigee-cassandra-backup-1554577680-f9sc4
starting apigee-cassandra-default-0 in default
starting apigee-cassandra-default-1 in default
starting apigee-cassandra-default-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 transferred the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
INFO: removing cassandra snapshot
INFO: backup created tarball and transferred 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 <TDIN>...
/ [1 files][    0.0 B/    0.0 B]
Operation completed over 1 objects.
INFO: backup created tarball and transferred the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
finished uploading schema.cql