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:
- Cloud Scheduler-Jobs: Jobs zum Ausführen von Aufrufen nach einem festgelegten Zeitplan zum Starten des Datenbankexports.
- Cloud Functions: Funktionen zum Exportieren der Daten von Memorystore nach Cloud Storage
- Pub/Sub-Nachrichten: Nachrichten, die für jedes Datenexportereignis gesendet und empfangen werden.
- Cloud Storage-Buckets: Bucket zum Speichern der exportierten Daten.
- Memorystore for Redis: Quelldatenbank, aus der die Daten exportiert werden sollen.
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.
Ziele
- Erstellen Sie einen Cloud Storage-Bucket und eine Memorystore-Instanz.
- Ein Pub/Sub-Thema, eine Cloud Functions-Funktion und einen Cloud Scheduler-Job erstellen
- Den Export von Datenbankdaten über die manuelle Ausführung des Cloud Scheduler-Jobs auslösen
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.
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
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Aktivieren Sie Cloud Shell in der Google Cloud Console.
-
Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build APIs aktivieren.
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.
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"
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.
Erstellen einer Instanz von Memorystore for Redis 4:
gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
Dieser Vorgang dauert einige Minuten.
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
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.
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)")
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}"
Dem Dienstkonto Zugriff auf die benutzerdefinierte
Simple Storage
-Rolle gewährengsutil 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.
Erstellen Sie einen Ordner für den Cloud Functions-Code:
mkdir scheduler_gcf_code && cd scheduler_gcf_code
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
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
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.
Speichern Sie den vollständigen Memorystore-Namen in einer Variablen:
export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
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.
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}
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
-StatusTrue
, um anzuzeigen, dass er abgeschlossen wurde. Wenn der StatusDONE
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
Ü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.
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.
Nächste Schritte
- Compute-Instanzen mit Cloud Scheduler planen
- Planung von Cloud SQL-Datenbankexporten mit Cloud Scheduler.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center