Copia de seguridad y recuperación de datos para Parallelstore en Google Kubernetes Engine

Parallelstore solo está disponible por invitación. Si deseas solicitar acceso a Parallelstore en tu proyecto de Google Cloud , comunícate con tu representante de ventas.

En esta guía, se describe cómo puedes crear copias de seguridad de los datos en tu instancia de Parallelstore conectada (GKE) en un bucket de Cloud Storage y evitar la posible pérdida de datos configurando un CronJob de GKE para crear copias de seguridad de los datos automáticamente según un programa. En esta guía, también se describe cómo puedes recuperar datos de una instancia de Parallelstore.

Antes de comenzar

Sigue los pasos que se indican en Crea una instancia de Parallelstore y conéctate a ella desde GKE para configurar tu clúster de GKE y tu instancia de Parallelstore.

Copia de seguridad de datos

En la siguiente sección, se describe cómo puedes configurar un CronJob de GKE para crear copias de seguridad continuas de tus datos desde una instancia de Parallelstore en el clúster de GKE y evitar la pérdida de datos.

Conéctate a tu clúster de GKE

Obtén las credenciales para tu clúster de GKE:

    gcloud container clusters get-credentials CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=CLUSTER_LOCATION

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster de GKE.
  • PROJECT_ID: El ID del proyecto de Google Cloud
  • CLUSTER_LOCATION: Es la zona de Compute Engine que contiene el clúster. Tu clúster debe estar en una zona admitida para el controlador CSI de Parallelstore.

Proporciona los permisos necesarios

Tu CronJob de GKE necesita los roles roles/parallelstore.admin y roles/storage.admin para importar y exportar datos entre Cloud Storage y Parallelstore.

Crea una Google Cloud cuenta de servicio

    gcloud iam service-accounts create parallelstore-sa \
      --project=PROJECT_ID

Otorga los roles de la cuenta de servicio Google Cloud .

Otorga los roles de administrador de Parallelstore y administrador de Cloud Storage a la cuenta de servicio.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/parallelstore.admin
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member serviceAccount:parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/storage.admin

Configura una cuenta de servicio de GKE

Debes configurar una cuenta de servicio de GKE y permitirle suplantar la identidad de la cuenta de servicio de Google Cloud . Sigue estos pasos para permitir que la cuenta de servicio de GKE se vincule a la cuenta de servicio de Google Cloud .

  1. Crea el siguiente manifiesto de la cuenta de servicio parallelstore-sa.yaml:

      # GKE service account used by workload and will have access to Parallelstore and GCS
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: parallelstore-sa
        namespace: default
    

    A continuación, impleméntalo en tu clúster de GKE con este comando:

      kubectl apply -f parallelstore-sa.yaml
    
  2. Permite que la cuenta de servicio de GKE suplante a la cuenta de servicio Google Cloud .

      # Bind the GCP SA and GKE SA
      gcloud iam service-accounts add-iam-policy-binding parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:PROJECT_ID.svc.id.goog[default/parallelstore-sa]"
    
      # Annotate the GKE SA with GCP SA
      kubectl annotate serviceaccount parallelstore-sa \
          --namespace default \
      iam.gke.io/gcp-service-account=parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com
    

Otorga permisos a la cuenta de servicio del agente de Parallelstore

    gcloud storage buckets add-iam-policy-binding GCS_BUCKET \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-parallelstore.iam.gserviceaccount.com \
      --role=roles/storage.admin

Reemplaza lo siguiente:

  • GCS_BUCKET: Es el URI del bucket de Cloud Storage en el formato gs://<bucket_name>.
  • PROJECT_NUMBER: Es el número del proyecto Google Cloud .

Inicia el CronJob

Configura e inicia un CronJob de GKE para exportar periódicamente datos de Parallelstore a Cloud Storage.

Crea el archivo de configuración ps-to-gcs-backup.yaml para el CronJob:

  apiVersion: batch/v1
  kind: CronJob
  metadata:
    name: ps-to-gcs-backup
  spec:
    concurrencyPolicy: Forbid
    failedJobsHistoryLimit: 1
    schedule: "0 * * * *"
    successfulJobsHistoryLimit: 3
    suspend: false
    jobTemplate:
      spec:
        template:
          metadata:
            annotations:
              gke-parallelstore/cpu-limit: "0"
              gke-parallelstore/ephemeral-storage-limit: "0"
              gke-parallelstore/memory-limit: "0"
              gke-parallelstore/volumes: "true"
          spec:
            serviceAccountName: parallelstore-sa
            containers:
            - name: pstore-backup
              image: google/cloud-sdk:slim
              imagePullPolicy: IfNotPresent
              command:
              - /bin/bash
              - -c
              - |
                #!/bin/bash
                set -ex

                # Retrieve modification timestamp for the latest file up to the minute
                latest_folder_timestamp=$(find $PSTORE_MOUNT_PATH/$SOURCE_PARALLELSTORE_PATH -type d -printf  '%T@ %p\n'| sort -n | tail -1 | cut -d' ' -f2- | xargs -I{} stat -c %x {} | xargs -I {} date -d {} +"%Y-%m-%d %H:%M")

                # Start exporting from PStore to GCS
                operation=$(gcloud beta parallelstore instances export-data $PSTORE_NAME \
                  --location=$PSTORE_LOCATION \
                  --source-parallelstore-path=$SOURCE_PARALLELSTORE_PATH \
                  --destination-gcs-bucket-uri=$DESTINATION_GCS_URI \
                  --async \
                  --format="value(name)")

                # Wait until operation complete
                while true; do
                  status=$(gcloud beta parallelstore operations describe $operation \
                    --location=$PSTORE_LOCATION \
                    --format="value(done)")
                  if [ "$status" == "True" ]; then
                    break
                  fi
                  sleep 60
                done

                # Check if export succeeded
                error=$(gcloud beta parallelstore operations describe $operation \
                  --location=$PSTORE_LOCATION \
                  --format="value(error)")
                if [ "$error" != "" ]; then
                  echo "!!! ERROR while exporting data !!!"
                fi

                # Delete the old files from PStore if requested
                # This will not delete the folder with the latest modification timestamp
                if $DELETE_AFTER_BACKUP && [ "$error" == "" ]; then
                  find $PSTORE_MOUNT_PATH/$SOURCE_PARALLELSTORE_PATH -type d -mindepth 1 |
                    while read dir; do
                        # Only delete folders that is modified earlier than the latest modification timestamp
                        folder_timestamp=$(stat -c %y $dir)
                        if [ $(date -d "$folder_timestamp" +%s) -lt $(date -d "$latest_folder_timestamp" +%s) ]; then
                          echo "Deleting $dir"
                          rm -rf "$dir"
                        fi
                    done
                fi
              env:
              - name: PSTORE_MOUNT_PATH # mount path of the Parallelstore instance, should match the volumeMount defined for this container
                value: "PSTORE_MOUNT_PATH"
              - name: PSTORE_NAME # name of the Parallelstore instance that need backup
                value: "PSTORE_NAME"
              - name: PSTORE_LOCATION # location/zone of the Parallelstore instance that need backup
                value: "PSTORE_LOCATION"
              - name: SOURCE_PARALLELSTORE_PATH # absolute path from the PStore instance, without volume mount path
                value: "SOURCE_PARALLELSTORE_PATH"
              - name: DESTINATION_GCS_URI # GCS bucket uri used for storing backups, starting with "gs://"
                value: "DESTINATION_GCS_URI"
              - name: DELETE_AFTER_BACKUP # will delete old data from Parallelstore if true
                value: "DELETE_AFTER_BACKUP"
              volumeMounts:
              - mountPath: PSTORE_MOUNT_PATH # should match the value of env var PSTORE_MOUNT_PATH
                name: PSTORE_PV_NAME
            dnsPolicy: ClusterFirst
            restartPolicy: OnFailure
            terminationGracePeriodSeconds: 30
            volumes:
            - name: PSTORE_PV_NAME
              persistentVolumeClaim:
                claimName: PSTORE_PVC_NAME

Reemplaza las siguientes variables:

  • PSTORE_MOUNT_PATH: Es la ruta de acceso de activación de la instancia de Parallelstore y debe coincidir con el volumeMount definido para este contenedor.
  • PSTORE_PV_NAME: Es el nombre del PersistentVolume de GKE que apunta a tu instancia de Parallelstore. Esto debería haberse configurado en tu clúster de GKE como parte de los requisitos previos.
  • PSTORE_PVC_NAME: Es el nombre del PersistentVolumeClaim de GKE que solicita el uso de PersistentVolume de Parallelstore. Esto se debería haber configurado en tu clúster de GKE como parte de los requisitos previos.
  • PSTORE_NAME: Es el nombre de la instancia de Parallelstore de la que se necesita una copia de seguridad.
  • PSTORE_LOCATION: Es la ubicación de la instancia de Parallelstore que necesita una copia de seguridad.
  • SOURCE_PARALLELSTORE_PATH: Es la ruta de acceso absoluta desde la instancia de Parallelstore sin la ruta de activación del volumen y debe comenzar con /.
  • DESTINATION_GCS_URI: Es el URI del bucket de Cloud Storage, o bien una ruta de acceso dentro de un bucket, con el formato gs://<bucket_name>/<optional_path_inside_bucket>.
  • DELETE_AFTER_BACKUP: Es la configuración para decidir si se deben borrar los datos antiguos de Parallelstore después de la copia de seguridad y liberar espacio. Los valores admitidos son true o false.

Implementa el CronJob en tu clúster de GKE con el siguiente comando:

  kubectl apply -f ps-to-gcs-backup.yaml

Consulta CronJob para obtener más detalles sobre cómo configurar un CronJob.

Cómo detectar la pérdida de datos

Cuando el estado de una instancia de Parallelstore es FAILED, es posible que ya no se pueda acceder a los datos de la instancia. Puedes usar el siguiente comando de Google Cloud CLI para verificar el estado de la instancia de Parallelstore:

    gcloud beta parallelstore instances describe PARALLELSTORE_NAME \
    --location=PARALLELSTORE_LOCATION \
    --format="value(state)"

Recuperación de datos

Cuando ocurre un desastre o la instancia de Parallelstore falla por algún motivo, puedes usar VolumePopulator de GKE para cargar previamente datos de Cloud Storage automáticamente en una instancia de Parallelstore administrada por GKE, o bien crear manualmente una instancia nueva de Parallelstore y, luego, importar datos desde una copia de seguridad de Cloud Storage.

Si te recuperas de un punto de control de tu carga de trabajo, debes decidir de qué punto de control recuperarte. Para ello, proporciona la ruta de acceso dentro del bucket de Cloud Storage.

Es posible que la exportación de Parallelstore en Cloud Storage tenga datos parciales si la instancia de Parallelstore falló en medio de la operación de exportación. Verifica que los datos estén completos en la ubicación de Cloud Storage de destino antes de importarlos a Parallelstore y reanudar tu carga de trabajo.

GKE Volume Populator

El propagador de volúmenes de GKE se puede usar para cargar previamente datos de una ruta de acceso a un bucket de Cloud Storage en una instancia de Parallelstore recién creada. Puedes encontrar las instrucciones para hacerlo en Cómo precargar Parallelstore.

Recuperación manual

También puedes crear una instancia de Parallelstore de forma manual y, luego, importar datos desde un bucket de Cloud Storage con los siguientes pasos.

  1. Crea una instancia nueva de Parallelstore:

      gcloud beta parallelstore instances create PARALLELSTORE_NAME \
        --capacity-gib=CAPACITY_GIB \
        --location=PARALLELSTORE_LOCATION \
        --network=NETWORK_NAME \
        --project=PROJECT_ID
    
  2. Importa datos desde Cloud Storage:

      gcloud beta parallelstore instances import-data PARALLELSTORE_NAME \
        --location=PARALLELSTORE_LOCATION \
        --source-gcs-bucket-uri=SOURCE_GCS_URI \
        --destination-parallelstore-path=DESTINATION_PARALLELSTORE_PATH \
        --async
    

Reemplaza lo siguiente:

  • PARALLELSTORE_NAME: Es el nombre de esta instancia de Parallelstore.
  • CAPACITY_GIB: Es la capacidad de almacenamiento de la instancia de Parallelstore en GB, con un valor de 12000 a 100000, en múltiplos de 4000.
  • PARALLELSTORE_LOCATION: Es la ubicación de la instancia de Parallelstore que necesita una copia de seguridad. Debe estar en la zona admitida.
  • NETWORK_NAME: Es el nombre de la red de VPC que creaste durante Configura una red de VPC. Debe ser la misma red que usa tu clúster de GKE y tener habilitado Private Services Access.
  • SOURCE_GCS_URI: Es el URI del bucket de Cloud Storage al que deseas importar datos, o bien una ruta de acceso dentro de un bucket en el que tienes los datos que deseas importar, con el formato de gs://<bucket_name>/<optional_path_inside_bucket>.
  • DESTINATION_PARALLELSTORE_PATH: Es la ruta de acceso absoluta desde la instancia de Parallelstore a la que deseas importar los datos. Debe comenzar con /.

En Transfiere datos hacia o desde Cloud Storage, encontrarás más detalles para importar datos a una instancia de Parallelstore.