In Kubernetes-Umgebungen können Sie Ihre Datenbankressourcen dynamisch skalieren, wenn sich die Arbeitslastanforderungen ändern. Verwenden Sie diese Skalierungsverfahren, wenn Sie Spanner Omni mit dem Helm-Diagramm bereitgestellt haben.
Hinweis
Bevor Sie Ihre Kubernetes-Bereitstellung skalieren, müssen Sie Folgendes tun:
Laden Sie die Spanner Omni CLI herunter und installieren Sie sie.
Installieren Sie Helm und erstellen Sie eine Helm-Diagrammkonfiguration.
Als Best Practice empfehlen wir, vertikal auf mindestens 32 GB Arbeitsspeicher pro Server zu skalieren, bevor Sie weitere Server hinzufügen, um horizontal zu skalieren.
Beschränkungen
Für die Skalierung in Kubernetes gelten die folgenden Einschränkungen:
Nur Nicht-Root-Server: Die horizontale Skalierung wird für Nicht-Root-Instanzen unterstützt. Das Skalieren von Root-Servern wird nicht unterstützt.
Speicherbeschränkungen für StatefulSets: Da Kubernetes-
volumeClaimTemplatesunveränderlich sind, können Sie Pod-Festplatten nicht mit einem einzelnenhelm upgrade-Befehl erweitern. Stattdessen erfordert das Skalieren von Speicherplatz manuelle Schritte zur Erweiterung des Volumes.
Vertikal skalieren
Wenn Sie die CPU- oder Arbeitsspeicherressourcen für Ihre Server anpassen möchten, aktualisieren Sie Ihre Konfiguration mit einem Helm-Upgrade:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set resources.cpu=CPU_CORES \
--set resources.memory=MEMORY_LIMIT \
-n NAMESPACE
Ersetzen Sie Folgendes:
HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B.oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: Die Version des Helm-Charts, z. B.1.0.0.CPU_CORES: Die Anzahl der vCPU-Kerne, die jedem Server-Pod zugewiesen werden sollen, z. B.8.MEMORY_LIMIT: Das RAM-Limit für jeden Server-Pod, z. B.32Gi.NAMESPACE: Der Kubernetes-Namespace der Bereitstellung, z. B.spanner-ns.
Horizontal skalieren
Wenn Sie horizontal skalieren möchten, fügen Sie Ihrer Bereitstellung weitere Server hinzu. Die horizontale Skalierung wird für Nicht-Root-Server unterstützt.
Nicht-Root-Server hinzufügen
Wenn Sie Nicht-Root-Server hinzufügen möchten, erhöhen Sie die Anzahl der Replikate in der Helm-Diagrammkonfiguration. Sie können alle Zonen einheitlich oder eine bestimmte Zone skalieren.
Einheitlich skalieren
Führen Sie den folgenden Befehl aus, um jede Zone im Deployment auf 15 Server zu skalieren:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set deployment.replicasPerZone=REPLICAS \
-n NAMESPACE
Ersetzen Sie Folgendes:
HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B.oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: Die Version des Helm-Charts, z. B.1.0.0.REPLICAS: Die Zielanzahl der Serverreplikate pro Zone, z. B.15.NAMESPACE: Der Kubernetes-Namespace, z. B.spanner-ns.
Bestimmte Zone skalieren
Wenn bei der ersten Bereitstellung unterschiedliche Serveranzahlen für die einzelnen Zonen konfiguriert wurden, können Sie auf eine einzelne Zone ausrichten. Wenn Sie beispielsweise die Anzahl der Replikate der ersten Zone am ersten Standort auf 15 erhöhen möchten, führen Sie den folgenden Befehl aus:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set locations[0].zones[0].replicas=REPLICAS \
-n NAMESPACE
Ersetzen Sie REPLICAS durch die Anzahl der Replikate in der Zielzone, z. B. 15.
Um zu prüfen, ob die neuen Server der Bereitstellung erfolgreich beigetreten sind, fragen Sie die Spanner Omni CLI ab, um die Bereitstellungsserver aufzulisten, oder rufen Sie Ihr Grafana-Dashboard auf.
spanner deployment servers list \
--zone=ZONE \
--deployment-endpoint=ENDPOINT
Ersetzen Sie Folgendes:
ZONE: Die Zone, die Sie auflisten möchten, z. B.us-central1-a.ENDPOINT: Der externe Endpunkt Ihrer Bereitstellung, z. B.${ENDPOINT}:15000.
Nicht-Root-Server entfernen
Das Herunterfahren von Servern erfordert zusätzliche Schritte, da das System Datenpartitionen sicher von den außer Betrieb genommenen Servern verschieben muss. Da Kubernetes-StatefulSets Pods vom höchsten zum niedrigsten Index entfernen, müssen Sie zuerst die Nicht-Root-Server mit dem höchsten Index entfernen.
So verringern Sie die Anzahl der Server:
Listen Sie die Server in Ihrer Zone auf, um Kandidaten für das Entfernen zu identifizieren:
spanner deployment servers list \ --zone=ZONE \ --deployment-endpoint=ENDPOINTBeispielausgabe:
NAME HOST PORT_BASE ROOT STATE zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000 spanner-a-0.pod.spanner-ns 15000 true - zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000 spanner-a-1.pod.spanner-ns 15000 - -Löschen Sie den außer Betrieb genommenen Nicht-Root-Server mit dem höchsten Index (z. B.
spanner-a-1.pod.spanner-ns:15000):spanner deployment servers delete SERVER_NAME \ --zone=ZONE \ --deployment-endpoint=ENDPOINTErsetzen Sie
SERVER_NAMEdurch die Server-ID, z. B.spanner-a-1.pod.spanner-ns:15000.Prüfen Sie die Serverliste, bis der Zielserver daraus entfernt wurde. Nach dem Löschen wechselt der Server in einen fehlerhaften Zustand und wird aus dem aktiven Dienstpfad entfernt.
Skalieren Sie das Helm-Deployment herunter, indem Sie einen Helm-Upgrade-Befehl ausführen, der Ihrer Zielreplikatzahl entspricht. Wenn Sie beispielsweise die Anzahl der Replikate pro Zone auf
1Pods verringern möchten, führen Sie den folgenden Befehl aus:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set deployment.replicasPerZone=REPLICAS \ -n NAMESPACEErsetzen Sie
REPLICASdurch die aktualisierte Anzahl der Replikate, z. B.1.Löschen Sie die Kubernetes-Anforderungen nichtflüchtiger Volumes (Persistent Volume Claims, PVCs), die mit den entfernten Pods verknüpft sind. Um versehentlichen Datenverlust zu verhindern, werden PVCs von Helm und Kubernetes nicht automatisch gelöscht, wenn ein StatefulSet herunterskaliert wird. So löschen Sie die PVCs manuell, um den Speicherplatz vollständig freizugeben:
kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACESo löschen Sie beispielsweise die Logs und Datenvolumen für
spanner-a-1im Namespacespanner-ns:kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
Zonen hinzufügen
Wenn Sie Ihrer Bereitstellung eine neue Zone hinzufügen, erhöhen Sie die Verfügbarkeit und schützen Ihre Datenbank vor Ausfällen einzelner Zonen.
Mit dem folgenden Befehl wird beispielsweise ein laufendes Single-Zone-Deployment in Google Kubernetes Engine (GKE) in der Zone us-east1-b der Region us initialisiert:
helm upgrade --install spanner-omni HELM_CHART_PATH \
--version VERSION \
--set resources.cpu=2 \
--set resources.memory=8Gi \
--set global.platform=gke \
--set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
-n NAMESPACE
Fügen Sie dieser Konfiguration die Zone us-east1-c hinzu, indem Sie die folgenden Schritte ausführen:
Starten Sie die Pods in der neuen Zone, indem Sie den Befehl
helm upgradeausführen und einen aktualisierten JSON-Block übergeben, der die neue Standortzone enthält:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \ -n NAMESPACEFügen Sie die neue Zone mit der Spanner Omni-CLI hinzu. Warten Sie, bis die Root-Server-Pods in der neu erstellten Zone den Status
Runningund „Bereit“ erreicht haben. Führen Sie dann den Befehl zum Erstellen der Zone aus:spanner deployment zones create NEW_ZONE \ --location=LOCATION \ --root-servers=ROOT_SERVERS_LIST \ --deployment-endpoint=ENDPOINTErsetzen Sie Folgendes:
NEW_ZONE: Die Kennung der Zone, die hinzugefügt werden soll, z. B.us-east1-c.LOCATION: Der Bereitstellungsort, z. B.us.ROOT_SERVERS_LIST: Eine durch Kommas getrennte Liste von Root-Server-Endpunkten in der neuen Zone, z. B.spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000.ENDPOINT: Der externe Bereitstellungsendpunkt, z. B.${ENDPOINT}:15000.
Warten Sie, bis die Zonenerstellung abgeschlossen ist. Die Replikation vorhandener Datenbankschemas und ‑tabellen in eine neue Zone dauert einige Zeit. Überwachen Sie den Fortschritt der Zonensynchronisierung, indem Sie die Bereitstellungszonen auflisten:
spanner deployment zones list --deployment-endpoint=ENDPOINT
Zone entfernen
Sie können eine aktive Zone aus Ihrer Bereitstellung mit mehreren Zonen außer Betrieb nehmen, um Ressourcen zu reduzieren oder sich an Topologieänderungen anzupassen.
Entfernen Sie die Zone us-east1-c, die Sie im vorherigen Abschnitt erstellt haben, indem Sie die folgenden Schritte ausführen:
Löschen Sie die Zone und starten Sie die Zone-Tear-Down-Prozedur in Spanner Omni:
spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINTErsetzen Sie
ZONEdurch die Zone, die entfernt werden soll, z. B.us-east1-c.Prüfen Sie, ob der Bereich entfernt wurde. Führen Sie einen List-Befehl aus und warten Sie, bis die Zone nicht mehr in der Ausgabe angezeigt wird:
spanner deployment zones list --deployment-endpoint=ENDPOINTEntfernen Sie die Server aus dem Kubernetes-Cluster, indem Sie den Befehl „helm upgrade“ ausführen und einen aktualisierten JSON-Block für „locations“ übergeben, in dem die entfernte Zone ausgeschlossen wird:
helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \ -n NAMESPACE
Speicher skalieren
Da Kubernetes-volumeClaimTemplates unveränderlich sind, können Sie die Speicherkapazitäten von Pods nicht direkt mit dem Befehl helm upgrade hochskalieren. Stattdessen müssen Sie das Volume manuell erweitern. Weitere Informationen finden Sie im
Leitfaden zum Erweitern von StatefulSet-Volumes in GKE.
So erweitern Sie den Festplattenspeicher:
Definieren Sie die Parameter für die Volumenerweiterung als Umgebungsvariablen in Ihrem Terminal:
NEW_SIZE="NEW_SIZE" NAMESPACE="NAMESPACE" RELEASE_NAME="spanner-omni" STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3" HELM_CHART_PATH="HELM_CHART_PATH" VERSION="VERSION"Ersetzen Sie Folgendes:
NEW_SIZE: Die Zielgröße der Speicherkapazität, z. B.200Gi.NAMESPACE: Der Kubernetes-Namespace, z. B.spanner-ns.STATEFULSET_NAME_1,STATEFULSET_NAME_2, …: Die Namen der StatefulSets in Ihrem Deployment, die in der Regel den Kurznamen Ihrer Zonen entsprechen (z. B.spanner-east-b spanner-east-c).HELM_CHART_PATH: Der Pfad zu Ihrem Helm-Diagramm, z. B.oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: Die Version des Helm-Charts, z. B.1.0.0.
Führen Sie die Befehle aus, um die PVCs zu patchen, die StatefulSets zu löschen (wobei die Backend-Pods intakt bleiben) und das Helm-Deployment zu aktualisieren:
# Patch all associated PVCs directly. for pvc in $(kubectl get pvc -n $NAMESPACE \ -l app.kubernetes.io/instance=$RELEASE_NAME \ -o name | grep "data-volume"); do kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}" done # Delete the StatefulSet while leaving backend pods intact (orphan cascade). kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan # Run Helm upgrade to align the templates with the expanded size. helm upgrade $RELEASE_NAME $HELM_CHART_PATH \ --version $VERSION \ --reuse-values \ --set storage.data.size=$NEW_SIZE \ -n $NAMESPACE