Verteiltes Autoscaling-Tool für Spanner bereitstellen


In dieser Anleitung wird beschrieben, wie Sie die Infrastruktur des Autoscaling-Tools für Spanner mithilfe einer Topologie für verteilte Bereitstellung einrichten. In der in dieser Anleitung vorgestellten Bereitstellungsoption befinden sich alle Komponenten von Autoscaling in einem einzigen Projekt, mit Ausnahme von Cloud Scheduler, dem Forwarder-Thema und der entsprechenden Funktion.

Diese Anleitung richtet sich an IT-, Betriebs- und Site Reliability Engineering-Teams, die den operativen Aufwand reduzieren und die Kosten ihrer Spanner-Bereitstellungen optimieren möchten. Dieses Dokument ist Teil der folgenden Reihe:

Die Topologie für verteilte Bereitstellungen vereint die folgenden Vorteile projektspezifischer und zentralisierter Bereitstellungen:

  • Teams, die Inhaber der Spanner-Instanzen sind, werden Anwendungsteams genannt und verwalten Autoscaling-Konfigurationsparameter für ihre Instanzen mit eigenen Cloud Scheduler-Jobs.
  • Abgesehen von den Konfigurationsparametern verwaltet ein zentrales Team den Rest der Autoscaling-Infrastruktur und minimiert den Verwaltungsaufwand.

Architektur

Das folgende Diagramm zeigt die Autoscaling-Architektur in einer verteilten Bereitstellungstopologie:

Topologie für verteilte Bereitstellung

Eine Erläuterung der Autoscaling-Komponenten und der einzelnen nummerierten Schritte im Ereignisfluss finden Sie unter Autoscaling von Spanner.

Forwarder-Funktion

Cloud Scheduler kann nur Nachrichten zu Themen im selben Projekt veröffentlichen. In dieser Anleitung wird für die verteilte Topologie eine Zwischenkomponente namens Forwarder-Funktion verwendet.

Die Forwarder-Funktion übernimmt Nachrichten, die von Cloud Scheduler in Pub/Sub veröffentlicht wurden, überprüft ihre JSON-Syntax und leitet sie an das Poller-Pub/Sub-Thema weiter. Das Thema kann zu einem separaten Projekt für Cloud Scheduler gehören.

Das folgende Diagramm zeigt die Komponenten, die für den Weiterleitungsmechanismus verwendet werden:

Weiterleitungsmechanismus

Wie im obigen Diagramm dargestellt, befinden sich die Spanner-Instanzen in Projekten mit den Namen Anwendung 1 und Anwendung 2:

  1. Cloud Scheduler ist dasselbe Projekt wie die Spanner-Instanzen.
  2. (2a) Cloud Scheduler veröffentlicht seine Nachrichten im Forwarder-Thema in den Projekten "Anwendung 1" und "Anwendung 2".

    (2b) Die Forwarder-Funktion liest Nachrichten aus dem Forwarder-Thema.

    (2c) Die Forwarder-Funktion leitet Nachrichten an das Abfragethema im Autoscaling-Projekt weiter.

  3. Die Poller-Funktion liest die Nachrichten aus dem Abfragethema und der Prozess wird fortgesetzt, wie unter Autoscaling von Spanner beschrieben.

Lernziele

  • Autoscaling mit einem verteilten Bereitstellungsmodell bereitstellen
  • Vorhandene Spanner-Instanzen in den Terraform-Zustand importieren.
  • Autoscaling konfigurieren.

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.

Wenn Sie den Anweisungen in dieser Anleitung folgen, sollten die Kosten für den Betrieb von Autoscaling-Komponenten gleich null oder nahe null sein. Diese Schätzung enthält jedoch nicht die Kosten für die Spanner-Instanzen. Ein Beispiel für die Berechnung der Kosten von Spanner-Instanzen finden Sie unter Spanner automatisch skalieren.

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.

Hinweise

In einer Topologie für verteilte Bereitstellungen richten Sie neben einem Autoscaling-Projekt ein zweites Projekt ein, das in dieser Anleitung als Anwendungsprojekt bezeichnet wird. Das Anwendungsprojekt enthält die Anwendungsressourcen, einschließlich Spanner. Sie richten die Abrechnung und APIs für diese beiden Projekte in dieser Anleitung separat ein.

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

    Cloud Shell aktivieren

  2. Klonen Sie in Cloud Shell das folgende Repository:

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. Exportieren Sie Variablen für die Arbeitsverzeichnisse:

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project"
    export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
    

Autoscaling-Projekt vorbereiten

In diesem Abschnitt bereiten Sie die Bereitstellung des Projekts vor, das die gesamte zentralisierte Autoscaling-Infrastruktur enthält, mit Ausnahme von Cloud Scheduler.

  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. Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build APIs aktivieren.

    Aktivieren Sie die APIs

  4. Legen Sie in Cloud Shell Umgebungsvariablen mit der ID Ihres Autoscaling-Projekts fest:

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. Legen Sie die Region und Zone und den App Engine-Standort (für Firestore) für die Autoscaling-Infrastruktur fest:

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. Dienstkonto erstellen:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    

    Terraform verwendet dieses Konto, um alle Ressourcen in der Infrastruktur zu erstellen.

  7. Weisen Sie dem Dienstkonto die Rolle "Projektinhaber" zu:

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Erstellen Sie eine DienstkontoSchlüsseldatei:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. Wenn Ihr Projekt noch keine Firestore-Instanz hat, erstellen Sie eine:

     gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
     gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    

Autoscaling bereitstellen

In diesem Abschnitt stellen Sie die Komponenten, aus denen Autoscaling besteht, mithilfe von Terraform-Dateien in den folgenden Verzeichnissen bereit:

Verzeichnis Verzeichnisinhalt
terraform/ Top-Level-Konfiguration, die alle Bereitstellungsoptionen und die wiederverwendbaren Module enthält.
terraform/cloud-functions/distributed/autoscaler-project/ Konfiguration für das Projekt, in dem sich das Autoscaling befindet Delegiert das Autoscaling-Modul.
terraform/modules/autoscaler-functions Konfiguration der Poller- und Scaler-Cloud Functions-Funktionen und Pub/Sub-Themen.
  1. Legen Sie in Cloud Shell die Projekt-ID, die Region, die Zone und den App Engine-Standort in den entsprechenden Terraform-Umgebungsvariablen fest:

    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. Ändern Sie das Verzeichnis in das Terraform-Verzeichnis scaler-project und initialisieren Sie es:

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. Erstellen Sie die Autoscaling-Infrastruktur:

    terraform apply -parallelism=2
    

    Nachdem Sie die Ressourcen überprüft haben, geben Sie yes ein, wenn Sie dazu aufgefordert werden.

    Wenn Sie diesen Befehl in Cloud Shell ausführen, kann die folgende Fehlermeldung angezeigt werden: "Error: cannot assign requested address"

    Dies ist ein bekanntes Problem im Terraform-Google-Anbieter. Führen Sie in diesem Fall den folgenden Befehl aus:

    terraform apply -parallelism=1
    

Anwendungsprojekt vorbereiten

In diesem Abschnitt bereiten Sie im Projekt, das die Spanner-Instanzen enthält, die Bereitstellung des Themas und der Funktion von Cloud Scheduler und Forwarder ein.

  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. Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build APIs aktivieren.

    Aktivieren Sie die APIs

  4. Legen Sie in Cloud Shell die Umgebungsvariablen mit der ID des Anwendungsprojekts fest:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. Legen Sie die Region und Zone und den App Engine-Standort für das Anwendungsprojekt fest:

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. Erstellen Sie ein Dienstkonto für Terraform, um die Ressourcen in Ihrer Infrastruktur zu erstellen:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. Weisen Sie dem Dienstkonto die Rolle "Projektinhaber" (roles/owner) zu:

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Erstellen Sie eine DienstkontoSchlüsseldatei:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Erstellen Sie eine Anwendung, um Cloud Scheduler zu aktivieren:

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    Sie müssen keine Firestore-Datenbank erstellen, da der Status im Autoscaling-Projekt gespeichert wird.

Infrastruktur des Anwendungsprojekts bereitstellen

Die Terraform-Komponenten des Anwendungsprojekts befinden sich in den folgenden Verzeichnissen:

In diesem Abschnitt stellen Sie mithilfe der Terraform-Dateien die Komponenten des Anwendungsprojekts bereit.

  1. Legen Sie in Cloud Shell die Projekt-ID, Region, Zone und den App Engine-Standort in den entsprechenden Terraform-Umgebungsvariablen fest:

      export TF_VAR_project_id="${APP_PROJECT_ID}"
      export TF_VAR_region="${APP_REGION}"
      export TF_VAR_zone="${APP_ZONE}"
      export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
    
  2. Legen Sie die Projekt-ID fest, unter der der Autoscaling-Status gespeichert wird:

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    Der Autoscaling-Status enthält die Zeitstempel für die Skalierungsereignisse, die für jede Instanz ausgelöst wurden.

  3. Wenn Sie eine neue Spanner-Instanz zum Testen von Autoscaling erstellen möchten, legen Sie die folgende Variable fest:

    export TF_VAR_terraform_spanner=true
    

    Die von Terraform erstellte Spanner-Instanz heißt autoscale-test.

    Wenn Sie keine neue Spanner-Instanz erstellen möchten, da Sie bereits eine Instanz haben, die Autoscaling überwachen soll, legen Sie den Namen Ihrer Instanz in der folgenden Variable fest:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Weitere Informationen zur Einrichtung von Terraform zum Verwalten Ihrer Spanner-Instanz finden Sie unter Spanner-Instanzen importieren.

  4. Wechseln Sie in das Verzeichnis Terraform app-project und initialisieren Sie es:

    cd "${APP_DIR}"
    terraform init
    
  5. Erstellen Sie die Infrastruktur im Anwendungsprojekt:

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    Prüfen Sie, ob die Liste der von Terraform zu erstellenden Ressourcen korrekt ist. Geben Sie dann yes ein, wenn Sie dazu aufgefordert werden.

    Wenn Sie diesen Befehl in Cloud Shell ausführen, kann die folgende Fehlermeldung angezeigt werden: "Error: cannot assign requested address"

    Dies ist ein bekanntes Problem im Terraform-Google-Anbieter. Führen Sie in diesem Fall den folgenden Befehl aus:

    terraform apply -parallelism=1
    

Forwarder Cloud Functions dazu autorisieren, im Poller-Thema zu veröffentlichen

  1. Wechseln Sie in Cloud Shell wieder zum Autoscaling-Terraform-Projektverzeichnis und überprüfen Sie, ob die Terraform-Variablen richtig festgelegt sind:

    cd "${AUTOSCALER_DIR}"
    
    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. Legen Sie die Terraform-Variablen für Ihre Forwarder-Dienstkonten fest. Aktualisieren Sie Ihre Dienstkonten und fügen Sie sie nach Bedarf hinzu:

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    Prüfen Sie, ob die Liste der von Terraform zu erstellenden Ressourcen korrekt ist. Geben Sie dann yes ein, wenn Sie dazu aufgefordert werden.

    Wenn Sie diesen Befehl in Cloud Shell ausführen, kann die folgende Fehlermeldung angezeigt werden: "Error: cannot assign requested address"

    Dies ist ein bekanntes Problem im Terraform-Google-Anbieter. Führen Sie in diesem Fall den folgenden Befehl aus:

    terraform apply -parallelism=1.
    

Deployment prüfen

Wenn die Infrastruktur für das Autoscaling bereit ist, können Sie ihre Parameter konfigurieren. Weitere Informationen finden Sie unter Autoscaling konfigurieren.

Da Sie in dieser Anleitung ein verteiltes Deployment erstellen, haben Logs die folgenden Attribute:

  • Logs der Poller- und Scaler-Funktionen werden im Log-Explorer des Autoscaling-Projekts angezeigt.
  • Logs zu Syntaxfehlern in der JSON-Konfiguration der Cloud Scheduler-Nutzlast werden im Log-Explorer für jedes Anwendungsprojekt angezeigt. So kann das für eine bestimmte Spanner-Instanz zuständige Team die Konfigurationsprobleme eigenständig beheben.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

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