Memorystore for Redis-Datenbankexporte mit Cloud Scheduler planen

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 dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

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 dieser Anleitung 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 Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. Aktivieren Sie Cloud Shell in der Cloud Console.

    Cloud Shell aktivieren

  4. Memorystore for Redis, Cloud Functions, Cloud Scheduler und App Engine 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 GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export MEM_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_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.

Cloud Storage-Bucket und Memorystore-Instanz erstellen

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 einfachen Storage-Rolle:

    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}
    

Pub/Sub-Thema, Cloud Functions-Funktion und Cloud Scheduler-Job 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 benutzerdefiniertes Dienstkonto und binden es an die benutzerdefinierte Redis-Rolle, die Sie erstellen.

  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 ${GCF_NAME} \
        --display-name="Service Account for GCF and Memorystore"
    
    export GCF_SA=$(gcloud iam service-accounts list --filter="${GCF_NAME}" --format="value(email)")
    
  2. Gewähren Sie dem Cloud Functions-Dienstkonto Zugriff auf die benutzerdefinierte Redis-Rolle:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_SA}" \
        --role="projects/${PROJECT_ID}/roles/${MEM_ROLE}"
    
  3. Gewähren Sie dem Cloud Functions-Dienstkonto Zugriff auf die benutzerdefinierte Storage-Rolle:

    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
        uri = f"{pubsub_message['gs']}/backup-{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. Wenn Sie gefragt werden, ob Sie nicht authentifizierte Aufrufe der neuen Funktion zulassen möchten, antworten Sie mit no.

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic=${PUBSUB_TOPIC} \
        --runtime=python37 \
        --entry-point=main \
        --service-account=${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

Cloud Scheduler-Job erstellen

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

  1. Erstellen Sie eine App Engine-Instanz für den Cloud Scheduler-Job:

    gcloud app create --region=${REGION::-1}
    
  2. Speichern Sie den vollständigen Memorystore-Namen in einer Variablen:

    export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
    
  3. 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'
    

    Dieser Job ist so geplant, dass er täglich um 23:00 Uhr ausgeführt wird.

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}
    
  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}"
    

    Die Ausgabe zeigt einen abgeschlossenen Exportjob. Beispiel:

    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 gs://${BUCKET_NAME} | grep rdb
    

    Sie sehen eine Datei namens STATUS, wenn der backup-mem-timestamp.rdb-Vorgang aus dem vorherigen Schritt DONE zurückgibt.

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 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