Memcache zu Memorystore migrieren

Memcache ist ein verteilter In-Memory-Datenspeicher, der in die Python 2-Laufzeit eingebunden ist. Viele App Engine-Anwendungen verwenden Memcache als Cache für bestimmte Aufgaben, anstatt sich ausschließlich auf nichtflüchtigen Speicher zu verlassen.

Cloud Memorystore for Redis ist ein vollständig verwalteter Dienst. Der integrierte In-Memory-Redis-Datenspeicher ermöglicht das Erstellen von Anwendungscaches, die Datenzugriff innerhalb eines Bruchteils von Millisekunden ermöglichen.

Wenn Ihre Python 2-Anwendung Memcache nur verwendet, um die Latenz für ndb- oder Cloud NDB-Anfragen zu verringern, können Sie anstelle von Memcache oder Memorystore for Redis die integrierte Unterstützung von Cloud NDB for Redis verwenden.

Informationen zu Memorystore-Berechtigungen

Jede Interaktion mit einem Google Cloud-Dienst muss autorisiert werden. Für die Interaktion mit einer von Memorystore gehosteten Redis-Datenbank muss Ihre Anwendung zum Beispiel die Anmeldedaten eines Kontos bereitstellen, das zum Zugriff auf Memorystore berechtigt ist.

Standardmäßig stellt Ihre Anwendung die Anmeldedaten für das Standarddienstkonto von App Engine bereit, das zum Zugriff auf Datenbanken berechtigt ist, die sich in demselben Projekt wie Ihre Anwendung befinden.

Wenn eine der folgenden Bedingungen zutrifft, müssen Sie eine alternative Authentifizierungsmethode verwenden, die Anmeldedaten explizit bereitstellt:

  • Ihre Anwendung und die Memorystore-Datenbank befinden sich in verschiedenen Google Cloud-Projekten.

  • Sie haben die Rollen geändert, die dem App Engine-Standarddienstkonto zugewiesen sind.

Informationen zu alternativen Authentifizierungsmethoden finden Sie unter Authentifizierung für Server-zu-Server-Produktionsanwendungen einrichten.

Übersicht über den Migrationsprozess

So migrieren Sie Ihre Python-Anwendung zur Verwendung von Memorystore anstelle von Memcache:

  1. Richten Sie Memorystore for Redis ein. Erstellen Sie dazu eine Redis-Instanz in Memorystore und einen serverlosen VPC-Zugriff, den Ihre Anwendung für die Kommunikation mit der Redis-Instanz verwendet. Die Erstellung dieser beiden unabhängigen Entitäten ist nicht strikt und kann in beliebiger Reihenfolge eingerichtet werden. Die Anleitung in diesem Leitfaden zeigt zuerst, wie Sie den serverlosen VPC-Zugriff einrichten.

  2. Installieren Sie eine Clientbibliothek für Redis und verwenden Sie Redis-Befehle, um Daten im Cache zu speichern.

    Memorystore for Redis ist mit allen Clientbibliotheken für Redis kompatibel. In diesem Leitfaden wird beschrieben, wie Sie mit der Clientbibliothek redis-py 3.0 Redis-Befehle aus Ihrer Anwendung senden.

  3. Testen Sie Ihre Aktualisierungen.

  4. Stellen Sie die Anwendung in App Engine bereit.

Memorystore for Redis einrichten

So richten Sie Memorystore for Redis ein:

  1. Verbinden Sie Ihre App Engine-Anwendung mit einem VPC-Netzwerk. Ihre Anwendung kann nur über einen VPC-Connector mit Memorystore kommunizieren.

    Fügen Sie die Informationen zur VPC-Verbindung in die Datei app.yaml ein, wie unter Anwendung mit Connector konfigurieren beschrieben.

  2. Notieren Sie sich die IP-Adresse und die Portnummer der von Ihnen erstellten Redis-Instanz. Sie benötigen diese Informationen, wenn Sie in Ihrem Code einen Redis-Client erstellen.

  3. Erstellen Sie eine Redis-Instanz in Memorystore.

    Wenn Sie aufgefordert werden, eine Region für Ihre Redis-Instanz auszuwählen, wählen Sie dieselbe Region aus, in der sich Ihre App Engine-Anwendung befindet.

Abhängigkeiten installieren

So machen Sie die redis-py-Clientbibliothek für Ihre Anwendung verfügbar, wenn sie in App Engine ausgeführt wird:

  1. Fügen Sie der Datei requirements.txt Ihrer Anwendung die folgende Zeile hinzu:

     redis
    
  2. Wenn Sie Ihre Anwendung weiterhin in der Python 2-Laufzeit ausführen:

    1. Verwenden Sie pip (Version 6 oder höher) mit dem Flag -t <directory>, um die Bibliotheken in einem lokalen Ordner mit dem Namen lib zu installieren. Beispiel:

      pip install -t lib <library_name> -r requirements.txt

    2. Achten Sie darauf, dass die appengine_config.py-Datei der Anwendung das lib-Verzeichnis angibt.

    App Engine lädt alle Bibliotheken in das Verzeichnis hoch, das Sie in der Datei appengine_config.py angegeben haben. Weitere Informationen finden Sie unter Python 2-Bibliotheken verwenden.

Die App Engine-Python 3-Laufzeitumgebung lädt automatisch alle Bibliotheken der requirements.txt-Datei Ihrer Anwendung hoch, wenn Sie die Anwendung bereitstellen.

Für die lokale Entwicklung empfehlen wir die Installation von Abhängigkeiten in einer virtuellen Umgebung wie virtualenv für Python 2 oder venv für Python 3.

Redis-Client erstellen

Für die Interaktion mit einer Redis-Datenbank muss Ihr Code einen Redis-Client erstellen, um die Verbindung zu Ihrer Redis-Datenbank zu verwalten. In den folgenden Abschnitten wird beschrieben, wie Sie einen Redis-Client mit der Clientbibliothek „redis-py“ erstellen.

Umgebungsvariablen angeben

Die redis-py-Clientbibliothek verwendet zwei Umgebungsvariablen, um die URL für Ihre Redis-Datenbank zusammenzustellen:

  • Eine Variable zur Identifizierung der IP-Adresse der Redis-Datenbank, die Sie in Memorystore erstellt haben.
  • Eine Variable zur Identifizierung der Portnummer der Redis-Datenbank, die Sie in Memorystore erstellt haben.

Wir empfehlen, diese Variablen in der Datei app.yaml Ihrer Anwendung zu definieren, anstatt sie direkt im Code zu definieren. Dies erleichtert die Ausführung der Anwendung in verschiedenen Umgebungen, z. B. in einer lokalen Umgebung und in App Engine.

Fügen Sie Ihrer app.yaml-Datei beispielsweise die folgenden Zeilen hinzu:

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

redis-py importieren und Client erstellen

Nach dem Definieren der Umgebungsvariablen REDISHOST und REDISPORT verwenden Sie die folgenden Zeilen, um die redis-py-Bibliothek zu importieren und einen Client zu erstellen:

  import redis

  redis_host = os.environ.get('REDISHOST', 'localhost')
  redis_port = int(os.environ.get('REDISPORT', 6379))
  redis_client = redis.Redis(host=redis_host, port=redis_port)

Wenn Sie eine ältere Version von redis-py für andere Anwendungen verwendet haben, haben Sie möglicherweise statt Client die Klasse StrictClient verwendet. Inzwischen empfiehlt redis-py jedoch Client anstatt StrictClient.

Daten im Cache mit Redis-Befehlen speichern und abrufen

Die Redis-Datenbank in Memorystore unterstützt die meisten Redis-Befehle, daher benötigen Sie zum Speichern und Abrufen von Daten aus dem Cache nur wenige Befehle. In der folgenden Tabelle werden Redis-Befehle vorgeschlagen, mit denen Sie Daten im Cache speichern können. Informationen zum Aufrufen dieser Befehle aus Ihrer Anwendung finden Sie in der Dokumentation der Clientbibliothek.

Obwohl Memcache für viele seiner Befehle asynchrone Alternativen bereitstellt, bietet die redis-py-Clientbibliothek nicht immer äquivalente asynchrone Methoden. Wenn alle Interaktionen mit dem Cache asynchron sein müssen, stehen andere Redis-Clientbibliotheken für Python zur Verfügung.
Aufgabe Redis-Befehl
Eintrag im Datencache erstellen und
eine Ablaufzeit für den Eintrag festlegen
SETNX
MSETNX
Daten aus dem Cache abrufen GET
MGET
Vorhandene Cachewerte ersetzen SET
MSET
Erhöht oder verringert numerische Cache-Werte INCR
INCRBY
DECR
DECRBY
Einträge aus dem Cache löschen DEL
UNLINK
Gleichzeitige Interaktionen mit dem Cache unterstützen (vergleichen und festlegen) Weitere Informationen zu Redis-Transaktionen. Beachten Sie, dass die redis-py-Clientbibliothek erfordert, dass alle Transaktionen in einer Pipeline ausgeführt werden.

Aktualisierungen testen

Wenn Sie Ihre Anwendung lokal testen, sollten Sie eine lokale Instanz von Redis ausführen, um die Interaktion mit Produktionsdaten zu vermeiden (Memorystore stellt keinen Emulator bereit). Folgen Sie der Anleitung in der Redis-Dokumentation, um Redis lokal zu installieren und auszuführen. Redis kann derzeit nicht lokal unter Windows ausgeführt werden.

Weitere Informationen zum Testen von Python 2-Anwendungen finden Sie unter Lokalen Entwicklungsserver verwenden.

Anwendung bereitstellen

Sobald Ihre Anwendung auf dem lokalen Entwicklungsserver fehlerfrei ausgeführt wird:

  1. Testen Sie die Anwendung in App Engine.

  2. Wenn die Anwendung fehlerfrei ausgeführt wird, verwenden Sie die Trafficaufteilung, um den Traffic für die aktualisierte Anwendung langsam hochzufahren. Prüfen Sie die Anwendung genau auf mögliche Datenbankprobleme, bevor Sie mehr Traffic zur aktualisierten Anwendung leiten.