Spanner lokal emulieren

Die gcloud CLI bietet einen lokalen Emulator im Speicher, mit dem Sie Ihre Anwendungen kostenlos entwickeln und testen können, ohne ein Google Cloud-Projekt oder ein Rechnungskonto zu erstellen. Da der Emulator die Daten nur zwischenspeichert, geht der gesamte Status, einschließlich Daten, Schema und Konfigurationen, beim Neustart verloren. Der Emulator bietet dieselben APIs wie der Spanner-Produktionsdienst. Er ist für die lokale Entwicklung und für Tests vorgesehen, nicht für Produktionsbereitstellungen.

Der Emulator unterstützt sowohl die GoogleSQL- als auch die PostgreSQL-Dialekte. Sie unterstützt alle Sprachen der Clientbibliotheken. Sie können den Emulator auch mit der Google Cloud CLI und REST APIs verwenden.

Der Emulator ist auch als Open-Source-Projekt in GitHub verfügbar.

Beschränkungen und Unterschiede

Der Emulator unterstützt Folgendes nicht:

  • TLS/HTTPS, Authentifizierung, IAM, Berechtigungen und Rollen.
  • Abfragemodi vom Typ PLAN oder PROFILE. Nur NORMAL wird unterstützt.
  • Die ANALYZE-Anweisung. Der Emulator akzeptiert, ignoriert ihn jedoch.
  • Alle Audit-Logging- und Monitoring-Tools.

Der Emulator unterscheidet sich außerdem in den folgenden Punkten vom Spanner-Produktionsdienst:

  • Fehlermeldungen sind möglicherweise nicht zwischen dem Emulator und dem Produktionsdienst konsistent.
  • Leistung und Skalierbarkeit des Emulators sind nicht mit dem Produktionsdienst vergleichbar.
  • Lese-/Schreibvorgänge und Schemaänderungen sperren bis zu ihrem Abschluss die gesamte Datenbank für exklusiven Zugriff.
  • Partitionierte DML und Partition Abfrage werden unterstützt. Der Emulator prüft jedoch nicht, ob Anweisungen partitionierbar sind. Dies bedeutet, dass eine Anweisung in partitionierter DML oder der Partition Abfrage im Emulator ausgeführt werden kann, aber im Produktionsdienst mit einem nicht partitionierbaren Fehler fehlschlägt.

Eine vollständige Liste der unterstützten, nicht unterstützten und teilweise unterstützten APIs und Funktionen finden Sie in der README-Datei in GitHub.

Emulator installieren und ausführen

Die zwei gängigsten Methoden zum Ausführen des Emulators sind gcloud-Kommandozeile und Docker. Sie können die für Ihre Anwendungsentwicklung und Ihren Workflow geeignete Methode wählen.

gcloud-CLI

  1. Installieren Sie das gcloud-CLI.

  2. Bei Windows- und MacOS-Nutzern muss Docker auf dem System installiert und im Systempfad verfügbar sein, damit der Emulator verwendet werden kann.

  3. Aktualisieren Sie gcloud, um die neueste Version zu erhalten:

    gcloud components update
    
  4. Starten Sie den Emulator:

    gcloud emulators spanner start
    

    Wenn der Emulator noch nicht installiert ist, werden Sie zum Herunterladen und zur Installation des ausführbaren Programms weitergeleitet.

    Der Emulator hostet standardmäßig zwei lokale Endpunkte: localhost:9010 für gRPC-Anfragen und localhost:9020 für REST-Anfragen.

    Weitere Informationen zu diesem Befehl finden Sie unter Spanner für gcloud-Emulator.

docker

  1. Prüfen Sie, ob Docker auf Ihrem System installiert und im Systempfad verfügbar ist.

  2. Rufen Sie das aktuelle Emulator-Image ab:

    docker pull gcr.io/cloud-spanner-emulator/emulator
    
  3. Starten Sie den Emulator:

    docker run -p 9010:9010 -p 9020:9020 gcr.io/cloud-spanner-emulator/emulator
    

    Der Befehl führt den Emulator aus und ordnet die Ports im Container den entsprechenden Ports auf Ihrem lokalen Host zu. Sie haben dann zwei lokale Endpunkte: localhost:9010 für gRPC-Anfragen und localhost:9020 für REST-Anfragen.

gcloud CLI mit dem Emulator verwenden

Wenn Sie den Emulator mit gcloud verwenden möchten, müssen Sie die Authentifizierung deaktivieren und den Endpunkt überschreiben.

Wir empfehlen, eine separate gcloud-Konfiguration zu erstellen, damit Sie schnell zwischen dem Emulator und dem Produktionsdienst wechseln können. Führen Sie folgenden Befehl aus, um eine Emulatorkonfiguration zu erstellen und zu aktivieren:

gcloud config configurations create emulator
  gcloud config set auth/disable_credentials true
  gcloud config set project your-project-id
  gcloud config set api_endpoint_overrides/spanner http://localhost:9020/

Nach der Konfiguration werden Ihre gcloud-Befehle an den Emulator und nicht an den Produktionsdienst gesendet. Sie können dies prüfen, indem Sie eine Instanz mit der Instanzkonfiguration des Emulators erstellen:

gcloud spanner instances create test-instance \
   --config=emulator-config --description="Test Instance" --nodes=1

Führen Sie folgenden Befehl aus, um zwischen Emulator und Standardkonfiguration zu wechseln:

gcloud config configurations activate [emulator | default]

Clientbibliotheken mit dem Emulator verwenden

Sie können unterstützte Versionen der Clientbibliotheken mit dem Emulator verwenden, indem Sie die Umgebungsvariable SPANNER_EMULATOR_HOST festlegen. Dazu gibt es mehrere Vorgehensweisen. Beispiel:

Linux/macOS

export SPANNER_EMULATOR_HOST=localhost:9010

Windows

set SPANNER_EMULATOR_HOST=localhost:9010

Oder mit gcloud env-init:

Linux/macOS

$(gcloud emulators spanner env-init)

Windows

gcloud emulators spanner env-init > set_vars.cmd && set_vars.cmd

Wenn Ihre Anwendung gestartet wird, sucht die Clientbibliothek automatisch nach SPANNER_EMULATOR_HOST und stellt eine Verbindung zum Emulator her, wenn sie ausgeführt wird.

Wenn SPANNER_EMULATOR_HOST festgelegt ist, können Sie den Emulator testen. Folgen Sie dazu den unten aufgeführten Startleitfäden. Sie können die Anweisungen zur Projekterstellung, zur Authentifizierung und zu den Anmeldedaten ignorieren, da diese nicht für die Verwendung des Emulators benötigt werden.

Unterstützte Versionen

In der folgenden Tabelle sind die Versionen der Clientbibliotheken aufgeführt, die den Emulator unterstützen.

Clientbibliothek Mindestversion
C++ v0.9.x+
C# v3.1.0+
Einfach loslegen (Go) v1.5.0+
Java v1.51.0+
Node.js v4.5.0+
PHP v1.25.0+
Python v1.15.0+
Ruby v1.13.0+

Zusätzliche Anweisungen für C#

Für die C#-Clientbibliothek müssen Sie auch die Option emulatordetection im Verbindungsstring angeben. Im Gegensatz zu den anderen Clientbibliotheken ignoriert C# standardmäßig die Umgebungsvariable SPANNER_EMULATOR_HOST. Gehen Sie so vor:

var builder = new SpannerConnectionStringBuilder
{
    DataSource = $"projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
    EmulatorDetection = "EmulatorOnly"
};