Memorystore for Redis-Datenbankexporte mit Cloud Scheduler planen

Last reviewed 2023-03-18 UTC

In dieser Anleitung wird gezeigt, wie Sie mit Cloud Scheduler und Cloud Functions automatisch eine Memorystore for Redis-Datenbank zu Cloud Storage exportieren. Mithilfe von Datenbankexporten in Cloud Storage können Sie einen robusten, vielschichtigen Notfallwiederherstellungsplan erstellen. Beispielsweise können Sie in eine andere Region exportieren und in andere Memorystore for Redis-Instanzen importieren.

Architektur

Diese Anleitung umfasst die folgenden Google Cloud-Komponenten:

Ein Cloud Scheduler-Job veröffentlicht eine Nachricht zu einem Pub/Sub-Thema mit Informationen zur Memorystore-Instanz-ID, der Projekt-ID, der Region, in der sie sich befindet, und dem Cloud Storage-Speicherort, an dem das Back-up gespeichert werden soll. Dieses Ereignis löst eine Cloud Functions-Funktion aus, die diese Nutzlast erhält und einen Datenbankexport in Memorystore for Redis über die zugehörige API startet. Die Datenbank generiert den Export und speichert ihn in Cloud Storage. Das folgende Diagramm zeigt diesen Workflow.

Workflow von Cloud Scheduler nach Pub/Sub, der eine Cloud Functions-Funktion auslöst, die den Export startet.

Ziele

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  3. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

  4. Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build APIs aktivieren.

    Aktivieren Sie die APIs

In dieser Anleitung führen Sie alle Befehle über Cloud Shell aus.

Umgebung einrichten

Konfigurieren Sie zuerst Ihre Umgebung und erstellen Sie dann benutzerdefinierte Rollen, die die erforderlichen Berechtigungen für diese Anleitung haben.

  1. Konfigurieren Sie in Cloud Shell die folgenden Umgebungsvariablen:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="mem-exporter"
    export BUCKET_NAME=${USER}-mem-$(date +%s)
    export MEM_INSTANCE="${DEMO}-instance"
    export FUNCTION_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export MEM_EXPORT_ROLE="memExporter"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-central1"
    
  2. Erstellen Sie zwei benutzerdefinierte Rollen, die nur die für diese Anleitung erforderlichen Berechtigungen haben:

    gcloud iam roles create ${STORAGE_ROLE} --project=${PROJECT_ID} \
        --title="Simple Storage Role" \
        --description="Grant permissions to view and create objects in Cloud Storage" \
        --permissions="storage.objects.create,storage.buckets.get"
    
    gcloud iam roles create ${MEM_EXPORT_ROLE} --project=${PROJECT_ID} \
        --title="Memorystore Exporter Role" \
        --description="Grant permissions to export data from a Memorystore instance to a Cloud Storage bucket" \
        --permissions="redis.instances.export"
    

    Mit diesen Rollen wird der Umfang des Zugriffs von Cloud Functions- und Memorystore-Dienstkonten gemäß dem Grundsatz der geringsten Berechtigung reduziert.

Erstellen Sie einen Cloud Storage-Bucket und eine Memorystore-Instanz.

In diesem Abschnitt erstellen Sie zuerst einen Cloud Storage-Bucket und eine Memorystore for Redis-Instanz. Anschließend füllen Sie den Memorystore mit Beispieldaten.

Cloud Storage-Bucket erstellen

Sie verwenden Sie das gsutil-Befehlszeilentool zum Erstellen eines Cloud Storage-Buckets.

  • Erstellen Sie einen Cloud Storage-Bucket, in dem die Datenexporte gespeichert werden sollen:

    gsutil mb -l ${REGION} gs://${BUCKET_NAME}
    

Memorystore-Instanz erstellen und Berechtigungen für das Dienstkonto erteilen

Als Nächstes erstellen Sie eine Memorystore-Instanz und gewähren ihr Dienstkonto die Berechtigung, Daten in Cloud Storage zu exportieren.

  1. Erstellen einer Instanz von Memorystore for Redis 4:

    gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
    

    Dieser Vorgang dauert einige Minuten.

  2. Prüfen Sie, ob die Memorystore-Instanz READY ist:

    gcloud redis instances list --region=${REGION}
    

    Die Ausgabe sieht dann ungefähr so aus:

    INSTANCE_NAME   VERSION    REGION       TIER   SIZE_GB  HOST          PORT  NETWORK  RESERVED_IP      STATUS  CREATE_TIME
    redis-instance  REDIS_4_0  us-central1  BASIC  1        10.61.20.131  6379  default  10.61.20.128/29  READY   2020-04-23T18:38:54
    
  3. Gewähren Sie dem Memorystore-Dienstkonto die Berechtigung zum Exportieren von Daten in Cloud Storage mit der benutzerdefinierten Rolle Simple Storage, die Sie zuvor erstellt haben:

    export MEM_SA=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} \
        --project ${PROJECT_ID} \
        --format "value(persistenceIamIdentity)")
    
    gsutil iam ch ${MEM_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Geplante Datenexportaufgabe erstellen

In diesem Abschnitt erstellen Sie ein benutzerdefiniertes Dienstkonto und binden es an die von Ihnen erstellte benutzerdefinierte Redis-Rolle. Anschließend erstellen Sie ein Pub/Sub-Thema, mit dem die Ausführung einer Cloud Functions-Funktion ausgelöst wird. Sie erstellen außerdem einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen.

Dienstkonto für die Cloud Functions-Funktion erstellen

Im ersten Schritt erstellen Sie ein Dienstkonto und binden es an die Rollen.

  1. Erstellen Sie ein IAM-Dienstkonto für die Cloud Functions-Funktion, um sie zu verwenden und in der Variablen zu speichern:

    gcloud iam service-accounts create ${FUNCTION_NAME} \
        --display-name="Service Account for GCF and Memorystore"
    
    export GCF_SA=$(gcloud iam service-accounts list --filter="${FUNCTION_NAME}" --format="value(email)")
    
  2. Gewähren Sie dem Dienstkonto Zugriff auf die benutzerdefinierte Rolle Memorystore Exporter, damit sie Memorystore-Exporte anfordern kann:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_SA}" \
        --role="projects/${PROJECT_ID}/roles/${MEM_EXPORT_ROLE}"
    
  3. Dem Dienstkonto Zugriff auf die benutzerdefinierte Simple Storage-Rolle gewähren

    gsutil iam ch \
        serviceAccount:${GCF_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} \
        gs://${BUCKET_NAME}
    

Pub/Sub-Thema erstellen

Im nächsten Schritt erstellen Sie ein Pub/Sub-Thema, das die Cloud Functions-Funktion auslöst, die mit der Memorystore-Datenbank interagiert.

  • Erstellen Sie das Pub/Sub-Thema:

    gcloud pubsub topics create ${PUBSUB_TOPIC}
    

Cloud Functions-Funktion erstellen

Als Nächstes erstellen Sie die Cloud Functions-Funktion.

  1. Erstellen Sie einen Ordner für den Cloud Functions-Code:

    mkdir scheduler_gcf_code && cd scheduler_gcf_code
    
  2. Erstellen Sie eine main.py-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF  > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('redis', 'v1beta1', http=credentials.authorize(Http()), cache_discovery=False)
    
        datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute
        instance_name=pubsub_message['name'].split("/")[-1]
        uri = f"{pubsub_message['gs']}/backup-{instance_name}-{datestamp}.rdb"
    
        request_body = {
            "outputConfig": {
                "gcsDestination" : {
                    "uri": uri
                }
            }
        }
    
        try:
            request = service.projects().locations().instances().export(
                name=pubsub_message['name'],
                body=request_body
            )
    
            response = request.execute()
        except HttpError as err:
            logging.error(f"Could NOT run backup. Reason: {err}")
        else:
            logging.info(f"Backup task status: {response}")
    EOF
    
  3. Erstellen Sie eine requirements.txt-Datei. Fügen Sie dazu Folgendes in Cloud Shell ein:

    cat <<EOF > requirements.txt
    
    google-api-python-client
    Oauth2client
    EOF
    
  4. Stellen Sie den Code bereit.

    gcloud functions deploy ${FUNCTION_NAME} \
        --trigger-topic=${PUBSUB_TOPIC} \
        --runtime=python37 \
        --entry-point=main \
        --service-account=${FUNCTION_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        --ingress-settings=internal-and-gclb
    

Cloud Scheduler-Job erstellen

Als Letztes erstellen Sie einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen.

  1. Speichern Sie den vollständigen Memorystore-Namen in einer Variablen:

    export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
    
  2. Erstellen Sie einen Cloud Scheduler-Job, um die Datenexportfunktion regelmäßig auszuführen:

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
        --schedule='0 23 * * *' --topic=${PUBSUB_TOPIC} \
        --message-body='{"name":'\"${MEM_NAME}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' \
        --time-zone='America/Los_Angeles' --location=${REGION}
    

    Dieser Job wird täglich um 23:00 Uhr Pacific Time ausgeführt.

    Der Nachrichtentext enthält den Namen der zu exportierenden Memorystore-Instanz und den Cloud Storage-Ziel-Bucket.

Lösung testen

Im letzten Schritt testen Sie Ihre Lösung. Dazu führen Sie als Erstes den Cloud Scheduler-Job aus.

  1. Führen Sie den Cloud Scheduler-Job manuell aus, um einen Memorystore-Export Ihrer Datenbank auszulösen.

    gcloud scheduler jobs run ${SCHEDULER_JOB} --location=${REGION}
    
  2. Listen Sie die Vorgänge auf der Memorystore-Instanz auf und prüfen Sie, ob es einen Vorgang vom Typ EXPORT gibt:

    gcloud redis operations list --region=${REGION} --filter="${MEM_INSTANCE}"
    

    Das folgende Ausgabebeispiel zeigt einen Exportjob mit dem DONE-Status True, um anzuzeigen, dass er abgeschlossen wurde. Wenn der Status DONE False lautet, bedeutet dies, dass der Job noch verarbeitet wird. Warten Sie eine Minute und führen Sie dann den vorherigen Befehl noch einmal aus.

    OPERATION_NAME                                           REGION       TYPE    TARGET                 DONE  CREATE_TIME          DURATION
    operation-1592329364987-5a837122a600c-b22c2703-5077c6b7  us-central1  export  mem-exporter-instance  True  2020-06-16T17:42:45  16S
    
  3. Überprüfen Sie im Cloud Storage-Bucket, ob die Exportdatei erstellt wurde:

    gsutil ls -l gs://${BUCKET_NAME}/*.rdb
    

    Sie sehen eine Datei namens backup-INSTANCE_NAME-TIMESTAMP.rdb.

Bereinigen

Wenn Sie Kosten für Ihr Google Cloud-Konto für die in dieser Anleitung verwendeten Ressourcen vermeiden möchten, können Sie die folgenden Schritte ausführen. Am einfachsten vermeiden Sie weitere Kosten, indem Sie das für die Anleitung erstellte Projekt löschen.

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte