Stellen Sie ein projektbezogenes oder zentrales Autoscaling-Tool für Spanner bereit


In dieser Anleitung erfahren Sie, wie Sie die Infrastruktur des Autoscaling-Tools für Spanner einrichten. In dieser Anleitung werden zwei Möglichkeiten gezeigt, wie Sie die Infrastruktur gemäß Ihren Anforderungen einrichten können:

  • Eine projektspezifische Bereitstellungstopologie. Diese Topologie wird für unabhängige Teams empfohlen, die ihre eigene Autoscaling-Konfiguration und -Infrastruktur verwalten möchten. Eine projektspezifische Bereitstellungstopologie ist auch ein guter Ausgangspunkt zum Testen der Funktionen des Autoscalings.
  • Eine zentralisierte Bereitstellungstopologie. Diese Topologie wird für Teams empfohlen, die die Konfiguration und Infrastruktur einer oder mehrerer Spanner-Instanzen verwalten und gleichzeitig die Komponenten und die Konfiguration für Autoscaling an einem zentralen Ort aufbewahren. In der zentralisierten Topologie richten Sie zusätzlich zu 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.

Dieses Dokument ist Teil der folgenden Reihe:

Diese Reihe richtet sich an IT-, Betriebs- und Site Reliability Engineering-Teams (SRE), die den operativen Aufwand reduzieren und die Kosten von Spanner-Bereitstellungen optimieren möchten.

Lernziele

  • Stellen Sie Autoscaling mithilfe einer projektspezifischen oder zentralisierten Bereitstellungstopologie bereit.
  • 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.

Die Kosten für den Betrieb von Autoscaling-Komponenten bei der Implementierung dieser Anleitung sollten 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

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

    Cloud Shell aktivieren

  2. Klonen Sie in Cloud Shell das folgende GitHub-Repository:

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. Exportieren Sie Variablen für die Arbeitsverzeichnisse, in denen sich die Terraform-Konfigurationsdateien für jede Topologie befinden:

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/per-project"
    

Autoscaling-Projekt vorbereiten

In diesem Abschnitt bereiten Sie Ihr Autoscaling-Projekt für die Bereitstellung vor.

  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, Cloud Build, and Cloud Scheduler APIs aktivieren.

    Aktivieren Sie die APIs

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

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

    export REGION=us-central1
    export ZONE=us-central1-c
    export APP_ENGINE_LOCATION=us-central
    
  6. Erstellen Sie ein Dienstkonto für Terraform, um alle 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 "${PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. Erstellen Sie eine Dienstkonto-Schlüsseldatei:

    gcloud iam service-accounts keys create \
        --iam-account "terraformer@${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="${APP_ENGINE_LOCATION}"
    gcloud alpha firestore databases create --region="${APP_ENGINE_LOCATION}"
    

Anwendungsprojekt vorbereiten

Wenn Sie Autoscaling im projektspezifischen Modus bereitstellen, können Sie mit dem Abschnitt Autoscaling bereitstellen fortfahren.

In der zentralisierten Bereitstellungstopologie befinden sich alle Komponenten des Autoscalings im selben Projekt. Die Spanner-Instanzen können sich in verschiedenen Projekten befinden.

In diesem Abschnitt konfigurieren Sie das Anwendungsprojekt, in dem sich Ihre Spanner-Instanz befindet. Die Spanner-Instanz stellt eine oder mehrere bestimmte Anwendungen bereit. In dieser Anleitung wird davon ausgegangen, dass die Teams, die für diese Anwendungen zuständig sind, sich von dem für die Autoscaling-Infrastruktur und -Konfiguration zuständigen Team unterscheiden.

  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. Spanner API aktivieren.

    Aktivieren Sie die API

  4. Legen Sie in Cloud Shell die Umgebungsvariablen fest:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    

    Ersetzen Sie INSERT_YOUR_APP_PROJECT_ID durch die ID des Anwendungsprojekts.

  5. Weisen Sie dem erstellten Dienstkonto terraformer die Inhaberrolle (roles/owner) im Anwendungsprojekt zu:

    gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    

    Wenn Sie dem Dienstkonto diese Rolle zuweisen, kann es Ressourcen erstellen.

  6. Legen Sie die Anwendungsprojekt-ID in der entsprechenden Terraform-Umgebungsvariable fest:

    export TF_VAR_app_project_id="${APP_PROJECT_ID}"
    

Autoscaling bereitstellen

In diesem Abschnitt stellen Sie die Komponenten für das Autoscaling mithilfe von vorkonfigurierten Terraform-Modulen bereit. Die Terraform-Dateien, die diese Module definieren, befinden sich in den folgenden Verzeichnissen:

Verzeichnis Verzeichnisinhalt
terraform/ Top-Level-Konfiguration, die alle Bereitstellungsoptionen und die wiederverwendbaren Module enthält.
terraform/cloud-functions/per-project/ Anleitung für die projektspezifische Bereitstellungsoption.
terraform/modules/autoscaler-functions/ Konfiguration der Poller- und Scaler-Cloud Functions-Funktionen und Pub/Sub-Themen
terraform/modules/scheduler/ Konfiguration von Cloud Scheduler zum Auslösen von Abfragen.
terraform/modules/spanner/ Konfiguration der Spanner-Datenbank
terraform/cloud-functions/centralized/ Anleitung für die zentralisierte Bereitstellungsoption.
  1. Legen Sie in Cloud Shell die Projekt-ID, die Region und die Zone in den entsprechenden Terraform-Umgebungsvariablen fest:

    export TF_VAR_project_id="${PROJECT_ID}"
    export TF_VAR_region="${REGION}"
    export TF_VAR_zone="${ZONE}"
    
  2. In diesem Schritt richten Sie eine vorhandene Instanz ein, die das Autoscaling überwachen soll, oder Sie erstellen eine neue Instanz und richten eine ein.

    Wenn Sie bereits eine Spanner-Instanz haben, legen Sie den Namen der Instanz in der folgenden Variable fest:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    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.

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

  3. Legen Sie als Arbeitsverzeichnis das projektspezifische Terraform-Verzeichnis fest:

    cd "${AUTOSCALER_DIR}"
    terraform init
    

    Mit diesem Befehl wird auch das projektspezifische Terraform-Verzeichnis initialisiert.

  4. Importieren Sie die vorhandene App Engine-Anwendung in den Terraform-Status:

    terraform import module.scheduler.google_app_engine_application.app "${PROJECT_ID}"
    
  5. Erstellen Sie die Autoscaling-Infrastruktur:

    terraform apply -parallelism=2
    

    In der folgenden Meldung werden Sie aufgefordert, zu prüfen, ob die Liste der Ressourcen, die von Terraform erstellt werden sollen, korrekt ist:

       Do you want to perform these actions?
       Terraform will perform the actions described above.
       Only 'yes' will be accepted to approve.
       Enter a value:
       

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

Spanner-Instanzen importieren

Wenn Sie vorhandene Spanner-Instanzen haben, die für die Verwaltung durch Terraform importiert werden sollen, folgen Sie der Anleitung in diesem Abschnitt. Andernfalls fahren Sie mit Autoscaling konfigurieren fort.

  1. Listen Sie Ihre Spanner-Instanzen in Cloud Shell auf:

    gcloud spanner instances list
    
  2. Legen Sie die folgende Variable mit dem Instanznamen fest, der automatisch skaliert werden soll:

    SPANNER_INSTANCE_NAME=YOUR_SPANNER_INSTANCE_NAME
    
  3. Erstellen Sie eine Terraform-Konfigurationsdatei mit einer leeren google_spanner_instance-Ressource:

    echo "resource \"google_spanner_instance\" \"${SPANNER_INSTANCE_NAME}\" {}" > "${SPANNER_INSTANCE_NAME}.tf"
    
  4. Importieren Sie die Spanner-Instanz in den Terraform-Status:

    terraform import "google_spanner_instance.${SPANNER_INSTANCE_NAME}" "${SPANNER_INSTANCE_NAME}"
    
  5. Wenn der Import abgeschlossen ist, aktualisieren Sie die Terraform-Konfigurationsdatei für die Instanz mit dem tatsächlichen Instanzattribut:

    terraform state show -no-color "google_spanner_instance.${SPANNER_INSTANCE_NAME}" \
        | grep -vE "(id|num_nodes|state|timeouts).*(=|\{)" \
        > "${SPANNER_INSTANCE_NAME}.tf"
    

    Wenn weitere Spanner-Instanzen importiert werden sollen, wiederholen Sie den Importvorgang.

Autoscaling konfigurieren

Nach der Bereitstellung des Autoscalings konfigurieren Sie dessen Parameter.

  1. Rufen Sie in der Google Cloud Console die Seite „Cloud Scheduler“ auf.

    Zu Cloud Scheduler

  2. Klicken Sie auf das Kästchen neben dem Job poll-main-instance-metrics, der durch die Autoscaling-Bereitstellung erstellt wurde.

  3. Klicken Sie auf Bearbeiten.

  4. Ändern Sie die im Nutzlastfeld angezeigten Parameter für das Autoscaling.

    Das folgende Beispiel zeigt eine Nutzlast:

        [
            {
                "projectId": "my-spanner-project",
                "instanceId": "spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "NODES",
                "minSize": 1,
                "maxSize": 3
            },{
                "projectId": "different-project",
                "instanceId": "another-spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "PROCESSING_UNITS",
                "minSize": 500,
                "maxSize": 3000,
                "scalingMethod": "DIRECT"
            }
        ]
       

    Die Nutzlast wird über ein JSON-Array definiert. Jedes Element im Array stellt eine Spanner-Instanz dar, die denselben Autoscaling-Jobzeitplan hat.

    Weitere Informationen zu den Parametern und ihren Standardwerten finden Sie unter README für die Poller-Komponente.

  5. Klicken Sie auf Aktualisieren, um die Änderungen zu speichern.

    Das Autoscaling ist jetzt konfiguriert und bereit, mit dem Monitoring und der Skalierung Ihrer Instanzen beim nächsten geplanten Job zu beginnen.

    Wenn die JSON-Nutzlast Syntaxfehler enthält, können Sie sie in der Google Cloud Console auf der Seite Log-Explorer als Logeinträge der Funktion tf-poller-function untersuchen.

    Zum Log-Explorer

    Das folgende Beispiel zeigt einen möglichen Fehler:

    SyntaxError: Unexpected token errortext in JSON at position 15 JSON.parse

    Um Syntaxfehler zu vermeiden, sollten Sie einen Editor verwenden, mit dem JSON neu formatiert und validiert werden kann.

Autoscaling überwachen

In diesem Schritt richten Sie das Monitoring für die Cloud Functions-Funktionen Poller und Scaler ein.

  1. Öffnen Sie in der Google Cloud Console die Seite Logs-Explorer.

    Zum Log-Explorer

  2. Klicken Sie auf Abfragevorschau und geben Sie den folgenden Filter in Query Builder ein:

    resource.type="cloud_function"
    resource.labels.function_name=~"tf-.*-function"
    
  3. Klicken Sie auf Abfrage ausführen.

    Unter "Abfrageergebnisse" können Sie alle Nachrichten aus Autoscaling-Funktionen anzeigen. Da der Poller alle 2 Minuten ausgeführt wird, müssen Sie die Abfrage möglicherweise noch einmal ausführen, um die Lognachrichten zu erhalten.

  4. Wenn Sie nur Nachrichten von Scaler-Cloud Functions-Funktionen sehen möchten, klicken Sie auf das Feld Abfragevorschau und ersetzen Sie den vorherigen Filter im Textfeld Query Builder durch Folgendes:

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  5. Klicken Sie auf Abfrage ausführen.

    Unter Abfrageergebnisse sehen Sie aufgrund des Filters, der auf die Textnutzlast angewendet wird, nur die Nachrichten aus der Scaler-Funktion, die sich auf Skalierungsvorschläge und -entscheidungen beziehen.

    Mit einer Filterabfrage oder ähnlichen Filtern können Sie logbasierte Messwerte erstellen. Diese Messwerte sind nützlich für Funktionen, z. B. zum Erfassen der Häufigkeit von Autoscaling-Ereignissen oder in Cloud Monitoring-Diagrammen und Benachrichtigungsrichtlinien.

Autoscaling testen

In diesem Abschnitt prüfen Sie die Funktion des Autoscalings, indem Sie die Mindestinstanzgröße ändern und die Logs überwachen.

Wenn Sie das Autoscaling mit einer Testdatenbank bereitstellen, wird das Autoscaling so konfiguriert, dass NODES als Einheit für die Rechenkapazität verwendet wird. Sie können prüfen, ob das Tool funktioniert, indem Sie die Einstellung für die Mindestgröße (minSize) in 2 ändern. Wenn das Tool wie erwartet ausgeführt wird, skaliert die Spanner-Instanz auf 2 Knoten. Wenn Sie für diese Anleitung eine vorhandene Datenbank verwendet haben, sehen Sie möglicherweise andere Werte.

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Scheduler auf.

    Zu Cloud Scheduler

  2. Klicken Sie auf das Kästchen neben dem Job poll-main-instance-metrics, der durch die Autoscaling-Bereitstellung erstellt wurde.

  3. Klicken Sie auf Bearbeiten.

  4. Ändern Sie im Feld Jobnutzlast den Wert von minSize von 1 in 2:

    "minSize": 2
    
  5. Klicken Sie auf Aktualisieren, um die Änderungen zu speichern.

  6. Rufen Sie die Seite Log-Explorer auf.

    Log-Explorer öffnen

  7. Klicken Sie auf Abfragevorschau und geben Sie den folgenden Filter in Query Builder ein:

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  8. Klicken Sie auf Abfrage ausführen.

  9. Klicken Sie auf Zu jetzt springen, bis die folgende Lognachricht angezeigt wird:

    Scaling spanner instance to 2 NODES

  10. Wenn Sie prüfen möchten, ob Spanner auf 2 Knoten skaliert wurde, rufen Sie in der Google Cloud Console die Seite der Spanner-Konsole auf.

    Zu Spanner

  11. Klicken Sie auf die Instanz autoscale-test.

    Prüfen Sie im Überblick, ob die Anzahl der Knoten jetzt auf 2 eingestellt ist. Dieser Schnelltest zeigt ein horizontal skaliertes Ereignis durch Ändern der Autoscaling-Parameter. Sie können einen Lasttest mit einem Tool wie YCSB ausführen, um Autoscaling zu simulieren, das basierend auf der Nutzung ein Skalierungsereignis auslöst.

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