Projektspezifisches oder zentralisiertes Autoscaling-Tool für Spanner bereitstellen


In dieser Anleitung erfahren Sie, wie Sie die Infrastruktur des Autoscaling-Tools einrichten. für Spanner. 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, Operations und Site Reliability Engineering (SRE) Teams, die den operativen Aufwand reduzieren und die Kosten ihrer Spanner-Bereitstellungen.

Lernziele

  • Stellen Sie Autoscaling mithilfe einer projektspezifischen oder zentralisierten Bereitstellungstopologie bereit.
  • Importieren Sie vorhandene Spanner-Instanzen in den Terraform-Zustand.
  • 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 nicht die Kosten für die Spanner-Instanzen. Ein Beispiel für Wie die Kosten von Spanner-Instanzen berechnet werden, siehe Autoscaling von Spanner

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. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, Cloud Build, and Cloud Scheduler APIs.

    Enable the 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 fest. und App Engine-Standort (für Cloud Scheduler und Firestore für die Autoscaling-Infrastruktur:

    export REGION=us-central1
    export ZONE=us-central1-c
    export APP_ENGINE_LOCATION=us-central
    
  6. Dienstkonto erstellen damit Terraform alle Ressourcen in Ihrer Infrastruktur erstellt:

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

    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 keine Firestore 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Spanner API.

    Enable the 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 von Ihnen erstellten Dienstkonto terraformer den Eigentümer zu. Rolle (roles/owner) im Anwendungsprojekt:

    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 Cloud Run-Funktionen für Poller und Scaler sowie 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-Zustand:

    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. Terraform-Konfigurationsdatei mit einem leeren Feld erstellen google_spanner_instance Ressource:

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

    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.

    Falls in der JSON-Nutzlast Syntaxfehler auftreten, können Sie diese in der Google Cloud Console auf der Seite Log Explorer als Logeinträge von 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 Run-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 Run-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, wird die Spanner-Instanz skaliert. 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. Prüfen Sie in der Google Cloud Console, ob Spanner auf 2 Knoten hochskaliert wurde rufen Sie die Spanner-Konsolenseite auf.

    Spanner aufrufen

  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 Belastungstest mit einem der folgenden Tools durchführen: YCSB um zu simulieren, dass Autoscaling ein Skalierungsereignis basierend auf der Auslastung 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Nächste Schritte