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 Google Cloud proyecto, comunícate con tu representante de ventas.

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

Antes de comenzar

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

Copia de seguridad de datos

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

Conéctate a tu clúster de GKE

Obtén las credenciales de 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: Es el Google Cloud ID del proyecto de.
  • 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 de CSI de Parallelstore.

Aprovisiona los permisos necesarios

Tu CronJob de GKE necesita las funciones 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 las Google Cloud funciones de la cuenta de servicio

Otorga las funciones 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 permitir que use la identidad de la Google Cloud cuenta de servicio. Sigue los siguientes pasos para permitir que la cuenta de servicio de GKE se vincule a la Google Cloud cuenta de servicio.

  1. Crea el siguiente manifiesto de 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
    

    Luego, 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 use la identidad de la Google Cloud cuenta de servicio.

      # 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 Google Cloud número del proyecto de.

Inicia el CronJob

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

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 activación de la instancia de Parallelstore . Debe coincidir con el volumeMount definido para este contenedor.
  • PSTORE_PV_NAME: Es el nombre del GKE PersistentVolume 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 del PersistentVolume de Parallelstore. Esto debería haberse configurado en tu clúster de GKE como parte de los requisitos previos.
  • PSTORE_NAME: Es el nombre de la instancia de Parallelstore que 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 a un bucket de Cloud Storage o 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 la configuración de un CronJob.

Detecta 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 de forma automática en una instancia de Parallelstore administrada por GKE o crear manualmente una instancia de Parallelstore nueva 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 proporcionando 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 importar los a Parallelstore y reanudar tu carga de trabajo.

VolumePopulator de GKE

Se puede usar VolumePopulator de GKE para cargar previamente datos de una ruta de acceso del bucket de Cloud Storage en una instancia de Parallelstore recién creada. Puedes encontrar instrucciones para esto en Carga previa de 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 de Parallelstore nueva:

      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 la configuración de una red de VPC. Debe ser la misma red que usa tu clúster de GKE y tener Private Services Access habilitado.
  • SOURCE_GCS_URI: Es el URI del bucket de Cloud Storage a un bucket de Cloud Storage o una ruta de acceso dentro de un bucket desde el que deseas importar los datos, con el formato 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 /.

Puedes encontrar más detalles sobre la importación de datos a una instancia de Parallelstore en Transfiere datos a Cloud Storage o desde allí.