In diesem Dokument wird beschrieben, wie Sie eine kalte Failover-Topologie für einen Webserver mithilfe einer verwalteten Instanzgruppe und Snapshots von nichtflüchtigem Speicher bereitstellen. Dieses Dokument richtet sich an Architekten und Personen, die in Betriebs- und Verwaltungsteams arbeiten.
Sie erstellen eine verwaltete Instanzgruppe, die eine einzelne VM mit einem nichtflüchtigen Speicher ausführt, in dem Daten gespeichert werden. Geplante Snapshots des nichtflüchtigen Speichers minimieren den Datenverlust in einem Failover-Szenario. Ein externer Application Load Balancer leitet Nutzer an die VM weiter, die in der verwalteten Instanzgruppe ausgeführt wird, wie in der folgenden Abbildung dargestellt:
Wenn ein Instanzfehler auftritt, versucht die verwaltete Instanzgruppe, die VM in derselben Zone neu zu erstellen. Wenn der Fehler auf Zonenebene erfolgt, informiert Sie Cloud Monitoring oder ein ähnliches System darüber, dass ein Problem vorliegt, und Sie erstellen manuell eine weitere verwaltete Instanzgruppe in einer anderen Zone oder Region. In beiden Failover-Szenarien verwendet die Plattform den neuesten Snapshot des nichtflüchtigen Speichers, um ein Ersatzlaufwerk zu erstellen und der neuen VM in der Instanzgruppe hinzuzufügen.
In diesem Dokument verwenden Sie die externe IP-Adresse der VM oder des Load-Balancers, um eine einfache Seite auf dem Webserver aufzurufen. Mit diesem Ansatz können Sie das kalte Failover-Muster testen, wenn Sie keinen registrierten Domainnamen haben, ohne DNS-Änderungen zu verwenden. Erstellen und konfigurieren Sie in einer Produktionsumgebung eine Cloud-DNS-Zone und einen Datensatz, die zu der externen IP-Adresse aufgelöst werden, die dem Load Balancer zugewiesen ist.
Dieses Muster entspricht des Kostenunterschieds für die Ausführung mehrerer VMs oder regionaler nichtflüchtiger Speicher mit einem gewissen Datenschutzniveau. Die Kosten sind niedriger, wenn Sie eine VM und einen nichtflüchtigen Speicher ausführen. Allerdings besteht das Risiko eines Datenverlusts, da die Snapshots des nichtflüchtigen Speichers nur in einem festgelegten Intervall aufgenommen werden. Zur Reduzierung des potenziellen Datenverlusts sollten Sie stattdessen einen kalten wiederherstellbaren Webserver mit regionalen nichtflüchtigen Speichern bereitstellen.
In der folgenden Tabelle werden einige grobe Unterschiede in den Datenschutzoptionen für kalte Wiederherstellungsansätze beschrieben, die regionale nichtflüchtige Speicher oder Snapshots nichtflüchtiger Speicher verwenden. Weitere Informationen finden Sie unter Hochverfügbarkeitsoptionen mit nichtflüchtigem Speicher.
Regionale nichtflüchtige Speicher | Snapshots nichtflüchtiger Speicher | |
---|---|---|
Datenverlust – Recovery Point Objective (RPO) | Null bei einem einzelnen Ausfall, z. B. einem anhaltenden Ausfall in einer Zone oder einer Netzwerkverbindung. | Alle Daten seit dem letzten Snapshot, was normalerweise eine Stunde oder länger ist. Der potenzielle Datenverlust hängt von Ihrem Snapshot-Zeitplan ab, der steuert, wie häufig Snapshots erstellt werden. |
Recovery Time Objective (RTO) | Bereitstellungszeit für eine neue VM zuzüglich mehrerer Sekunden, bis der regionale nichtflüchtige Speicher wieder angehängt wird. | Die Bereitstellungszeit einer neuen VM zuzüglich der Zeit zum Erstellen eines neuen nichtflüchtigen Speichers aus dem letzten Snapshot. Die Erstellungszeit des Laufwerks hängt von der Größe des Snapshots ab und kann mehrere Minuten oder Stunden dauern. |
Cost | Die Speicherkosten werden verdoppelt, wenn der regionale nichtflüchtige Speicher kontinuierlich in eine andere Zone repliziert wird. | Sie zahlen nur für den tatsächlich verbrauchten Snapshot-Speicherplatz. |
Weitere Informationen finden Sie unter Preise für Laufwerke und Images. |
Ziele
- Eine verwaltete Instanzgruppe erstellen, um eine VM mit einem nichtflüchtigen Speicher auszuführen.
- Snapshot-Zeitplan für das Erstellen regelmäßiger Snapshots des nichtflüchtigen Speichers konfigurieren
- Eine Instanzvorlage und ein Startskript erstellen
- Einen externen Application Load Balancer erstellen und konfigurieren
- Das kalte Failover des Webservers mit einer verwalteten Instanzgruppe testen, die als Ersatz dient
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.
Vorbereitung
- Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Compute Engine API aktivieren.
- Installieren Sie die Google Cloud CLI.
-
Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Compute Engine API aktivieren.
- Installieren Sie die Google Cloud CLI.
-
Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init
Sie können die Google Cloud CLI in der Google Cloud Console ausführen, ohne die Google Cloud CLI zu installieren. Verwenden Sie Cloud Shell, um die gcloud CLI in der Google Cloud Console auszuführen.
Umgebung vorbereiten
In diesem Abschnitt definieren Sie einige Variablen für Ihre Ressourcennamen und Standorte. Diese Variablen werden von den Google Cloud CLI-Befehlen verwendet, wenn Sie die Ressourcen bereitstellen.
Sofern nicht anders angegeben, geben Sie in dieser Anleitung alle Befehle in Cloud Shell oder in Ihrer lokalen Entwicklungsumgebung ein.
Ersetzen Sie
PROJECT_ID
durch Ihre Projekt-ID: Geben Sie bei Bedarf ein eigenes Namenssuffix für Ressourcen an, z. B.app
.Geben Sie eine Region wie
us-central1
und zwei Zonen innerhalb dieser Region an, z. B.us-central1-a
undus-central1-f
. Diese Zonen definieren, wo der ursprüngliche nichtflüchtige Speicher und die verwaltete Instanzgruppe bereitgestellt werden und wo Sie bei Bedarf manuell ein Failover ausführen können.PROJECT_ID=PROJECT_ID NAME_SUFFIX=app REGION=us-central1 ZONE1=us-central1-a ZONE2=us-central1-f
VPC und Subnetz erstellen
Erstellen Sie eine Virtual Private Cloud (VPC) und ein Subnetz, um Netzwerkzugriff auf die VMs zu gewähren. Da die verwaltete Instanzgruppe zonenübergreifend in einer einzelnen Region funktioniert, wird nur ein Subnetz erstellt. Weitere Informationen zu den Vorteilen des benutzerdefinierten Subnetzmodus für die Verwaltung von IP-Adressbereichen in Ihrer Umgebung finden Sie unter VPC-Netzwerke im benutzerdefinierten Modus verwenden.
Erstellen Sie die VPC mit einem benutzerdefinierten Subnetzmodus:
gcloud compute networks create network-$NAME_SUFFIX \ --subnet-mode=custom
Wenn Sie eine Cloud Shell-Eingabeaufforderung sehen, autorisieren Sie diese erste Anfrage für das Durchführen von API-Aufrufen.
Erstellen Sie ein Subnetz in der neuen VPC. Definieren Sie einen eigenen Adressbereich wie
10.1.0.0/20
, der in Ihren Netzwerkbereich passt:gcloud compute networks subnets create subnet-$NAME_SUFFIX-$REGION \ --network=network-$NAME_SUFFIX \ --range=10.1.0.0/20 \ --region=$REGION
Firewallregeln erstellen
Erstellen Sie Firewallregeln, um Web-Traffic und Systemdiagnosen für den Load-Balancer und die verwalteten Instanzgruppen zuzulassen:
gcloud compute firewall-rules create allow-http-$NAME_SUFFIX \ --network=network-$NAME_SUFFIX \ --direction=INGRESS \ --priority=1000 \ --action=ALLOW \ --rules=tcp:80 \ --source-ranges=0.0.0.0/0 \ --target-tags=http-server gcloud compute firewall-rules create allow-health-check-$NAME_SUFFIX \ --network=network-$NAME_SUFFIX \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp:80
Die HTTP-Regel lässt Traffic zu jeder VM zu, auf die das Tag
http-server
angewendet wird, sowie aus einer beliebigen Quelle mithilfe des Bereichs0.0.0.0/0
. Für die Regel „Systemdiagnose“ sind für Google Cloud Standardbereiche festgelegt, damit die Plattform den Zustand von Ressourcen ordnungsgemäß überprüfen kann.Wenn Sie SSH-Traffic für die Erstkonfiguration eines Basis-VM-Images zulassen möchten, legen Sie für Ihre Firewallregel mithilfe des Parameters
--source-range
Ihre Firewallregel fest. Möglicherweise müssen Sie zusammen mit Ihrem Netzwerkteam ermitteln, welche Quellbereiche in Ihrer Organisation verwendet werden.Ersetzen Sie
IP_ADDRESS_SCOPE
durch Ihre eigenen IP-Adressbereiche:gcloud compute firewall-rules create allow-ssh-$NAME_SUFFIX \ --network=network-$NAME_SUFFIX \ --direction=INGRESS \ --priority=1000 \ --action=ALLOW \ --rules=tcp:22 \ --source-ranges=IP_ADDRESS_SCOPE
Prüfen Sie nach dem Erstellen der Firewallregeln, ob die drei Regeln hinzugefügt wurden:
gcloud compute firewall-rules list \ --project=$PROJECT_ID \ --filter="NETWORK=network-$NAME_SUFFIX"
Die folgende Beispielausgabe zeigt, dass die drei Regeln korrekt erstellt wurden:
NAME NETWORK DIRECTION PRIORITY ALLOW allow-health-check-app network-app INGRESS 1000 tcp:80 allow-http-app network-app INGRESS 1000 tcp:80 allow-ssh-app network-app INGRESS 1000 tcp:22
Basis-VM-Image erstellen und konfigurieren
Wenn Sie identische VMs erstellen möchten, die Sie ohne zusätzliche Konfiguration bereitstellen, verwenden Sie ein benutzerdefiniertes VM-Image. Dieses Image erfasst die Betriebssystem- und Apache-Konfiguration und wird in den nächsten Schritten verwendet, um jede VM in der verwalteten Instanzgruppe zu erstellen.
Zum Speichern der Anwendungsdaten legen Sie einen nichtflüchtigen Speicher an. In diesem Dokument verwenden Sie eine einfache Apache-Website, um die Anwendung bereitzustellen. Später in diesem Dokument erstellen Sie einen Snapshot-Zeitplan, der diesem nichtflüchtigen Speicher zugeordnet ist, um automatisierte Laufwerk-Snapshots zu erstellen.
Erstellen Sie auf der VM eine einfache index.html
-Datei im nichtflüchtigen Speicher und stellen Sie sie auf /var/www/example.com
bereit. Eine Apache-Konfigurationsdatei unter /etc/apache2/sites-available/example.com.conf
stellt Webinhalte für den bereitgestellten nichtflüchtigen Speicherspeicherort bereit.
Das folgende Diagramm zeigt die einfache HTML-Seite, die von Apache bereitgestellt und im nichtflüchtigen Speicher gespeichert wird:
Sie erstellen diese Umgebung in den folgenden Schritten.
Erstellen Sie eine SSD mit 10 GiB Informieren Sie sich über Ihre Speicheranforderungen und die damit verbundenen Kosten für den bereitgestellten Speicherplatz, nicht für den verbrauchten Speicherplatz. Weitere Informationen finden Sie unter Preise für nichtflüchtigen Speicher.
gcloud compute disks create disk-$NAME_SUFFIX \ --zone $ZONE1 \ --size=10 \ --type=pd-ssd
Erstellen Sie eine Basis-VM mit einem angehängten nichtflüchtigen Speicher:
gcloud compute instances create vm-base-$NAME_SUFFIX \ --zone=$ZONE1 \ --machine-type=n1-standard-1 \ --subnet=subnet-$NAME_SUFFIX-$REGION \ --tags=http-server \ --image=debian-10-buster-v20210721 \ --image-project=debian-cloud \ --boot-disk-size=10GB \ --boot-disk-type=pd-balanced \ --boot-disk-device-name=vm-base-$NAME_SUFFIX \ --disk=mode=rw,name=disk-$NAME_SUFFIX,device-name=disk-$NAME_SUFFIX
Sie verwenden die zu Beginn dieses Dokuments definierten Parameter, um die VM zu benennen und eine Verbindung zum richtigen Subnetz herzustellen. Namen werden auch von den Parametern für das Bootlaufwerk und das Datenlaufwerk zugewiesen.
Stellen Sie zum Installieren und Konfigurieren der einfachen Website zuerst eine SSH-Verbindung zur Basis-VM her:
gcloud compute ssh vm-base-$NAME_SUFFIX --zone=$ZONE1
Erstellen Sie in Ihrer SSH-Sitzung zur VM ein Skript, um die VM in einem Editor Ihrer Wahl zu konfigurieren. Im folgenden Beispiel wird Nano als Editor verwendet:
nano configure-vm.sh
Fügen Sie das folgende Konfigurationsskript in die Datei ein. Aktualisieren Sie die Variable
NAME_SUFFIX
so, dass sie dem Wert zu Beginn dieses Dokuments entspricht, z. B. app.#!/bin/bash NAME_SUFFIX=app # Create directory for the basic website files sudo mkdir -p /var/www/example.com sudo chmod a+w /var/www/example.com sudo chown -R www-data: /var/www/example.com # Find the disk name, then format and mount it DISK_NAME="google-disk-$NAME_SUFFIX" DISK_PATH="$(find /dev/disk/by-id -name "${DISK_NAME}" | xargs -I '{}' readlink -f '{}')" sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard $DISK_PATH sudo mount -o discard,defaults $DISK_PATH /var/www/example.com # Install Apache, additional utilities, and cloud-init sudo apt-get update && sudo apt-get -y install apache2 moreutils cloud-init # Write out a basic HTML file to the mounted persistent disk sudo tee -a /var/www/example.com/index.html >/dev/null <<'EOF' <!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>HA / DR example</title> </head> <body> <p>Welcome to a test web server with persistent disk snapshots!</p> </body> </html> EOF # Write out an Apache configuration file sudo tee -a /etc/apache2/sites-available/example.com.conf >/dev/null <<'EOF' <VirtualHost *:80> ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/example.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> EOF # Enable the Apache configuration file and reload service sudo a2dissite 000-default sudo a2ensite example.com.conf sudo systemctl reload apache2
Geben Sie die Datei aus und beenden Sie den Editor. In Nano verwenden Sie beispielsweise
Ctrl-O
, um die Datei auszugeben, und beenden dann mitCtrl-X
.Machen Sie das Konfigurationsskript ausführbar und führen Sie es dann aus:
chmod +x configure-vm.sh ./configure-vm.sh
Wenn ein Instanzfehler auftritt und die verwaltete Instanzgruppe einen Ersatz von dieser Basis-VM erstellen muss, müssen die Anwendungsdaten verfügbar sein. Die folgenden Schritte sollten automatisch auf jeder neuen VM ausgeführt werden:
- Informationen vom Metadatenserver abrufen.
- Neuesten Snapshot des nichtflüchtigen Speichers abrufen.
- Laufwerk aus diesem neuesten Snapshot erstellen.
- Neues Laufwerk an die VM anhängen.
- Laufwerk in der VM bereitstellen.
Erstellen Sie zuerst ein Startskript mit dem Namen
app-startup.sh
, das diese für die VM erforderlichen Schritte ausführt: Dieses Startskript wird in einem folgenden Schritt auf eine Instanzvorlage angewendet.sudo mkdir /opt/cloud-init-scripts sudo tee -a /opt/cloud-init-scripts/app-startup.sh >/dev/null <<'EOF' #!/bin/bash # Install jq and get an access token for API requests apt-get install -y jq OAUTH_TOKEN=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \ -H "Metadata-Flavor: Google" --silent | jq -r '.access_token') # Make a request against the metadata server to determine the project name, # instance name, and what zone it's running in ZONE_INFO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone \ -H "Metadata-Flavor: Google" --silent) PROJECT_NAME=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone \ -H "Metadata-Flavor: Google" --silent | awk -v FS="/" '{print $2}') ZONE_NAME=$(curl http://metadata.google.internal/computeMetadata/v1/instance/zone \ -H "Metadata-Flavor: Google" --silent | sed 's:.*/::') INSTANCE_NAME=$(curl http://metadata.google.internal/computeMetadata/v1/instance/name \ -H "Metadata-Flavor: Google" --silent) # Get the latest snapshot of the app disk LATEST_SNAPSHOT=$(curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" \ https://compute.googleapis.com/compute/v1/projects/$PROJECT_NAME/global/snapshots \ --silent | jq -s '.[].items[] | select(.name | contains("disk-$NAME")) | .name' \ | sort -r | head -n 1 | tr -d '"') # Create a persistent disk using the latest persistent disk snapshot curl -X POST -H "Authorization: Bearer $OAUTH_TOKEN" -H "Content-Type: application/json; charset=utf-8" \ https://compute.googleapis.com/compute/v1/$ZONE_INFO/disks \ --data '{"name":"'$LATEST_SNAPSHOT'-restored","sizeGb":"10","type":"zones/'$ZONE_NAME'/diskTypes/pd-ssd","sourceSnapshot":"https://www.googleapis.com/compute/v1/projects/'$PROJECT_NAME'/global/snapshots/'$LATEST_SNAPSHOT'"}' # Wait for the persistent disk to be created from the disk snapshot DISK_STATUS=$(curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" \ https://compute.googleapis.com/compute/v1/projects/$PROJECT_NAME/zones/$ZONE_NAME/disks/$LATEST_SNAPSHOT-restored \ --silent | jq -r .status) while [ $DISK_STATUS != "READY" ] do sleep 2 DISK_STATUS=$(curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" \ https://compute.googleapis.com/compute/v1/projects/$PROJECT_NAME/zones/$ZONE_NAME/disks/$LATEST_SNAPSHOT-restored \ --silent | jq -r .status) done # Attach the new persistent disk created from the snapshot to the VM curl -X POST -H "Authorization: Bearer $OAUTH_TOKEN" -H "Content-Type: application/json; charset=utf-8" \ https://compute.googleapis.com/compute/v1/$ZONE_INFO/instances/$INSTANCE_NAME/attachDisk \ --data '{ "source": "/compute/v1/'$ZONE_INFO'/disks/'$LATEST_SNAPSHOT'-restored"}' # Wait for the persistent disk to be attached before mounting ATTACH_STATUS=$(curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" \ https://compute.googleapis.com/compute/v1/projects/$PROJECT_NAME/zones/$ZONE_NAME/instances/$INSTANCE_NAME \ --silent | jq '.disks[] | select(.source | contains("disk-"))') while [ -z "$ATTACH_STATUS" ] do sleep 2 ATTACH_STATUS=$(curl -X GET -H "Authorization: Bearer $OAUTH_TOKEN" GET \ https://compute.googleapis.com/compute/v1/projects/$PROJECT_NAME/zones/$ZONE_NAME/instances/$INSTANCE_NAME \ --silent | jq '.disks[] | select(.source | contains("disk-"))') done # With the disk attached, mount the disk and restart Apache echo UUID=`blkid -s UUID -o value /dev/sdb` /var/www/example.com ext4 discard,defaults,nofail 0 2 \ | tee -a /etc/fstab mount -a systemctl reload apache2 # Remove jq so it's not left on the VM apt-get remove -y jq EOF
Um die Variable
NAME_SUFFIX
, die Sie am Anfang des Dokuments definiert haben, in das Startskript, z. B.app
, zu übernehmen, verwenden Sie den Befehlenvsubst
:export NAME=app envsubst '$NAME' < "/opt/cloud-init-scripts/app-startup.sh" \ | sudo sponge "/opt/cloud-init-scripts/app-startup.sh"
Beenden Sie die SSH-Sitzung zur VM:
exit
Rufen Sie die IP-Adresse der VM ab und rufen Sie mit
curl
die einfache Webseite auf:curl $(gcloud compute instances describe vm-base-$NAME_SUFFIX \ --zone $ZONE1 \ --format="value(networkInterfaces.accessConfigs.[0].natIP)")
Die einfache Website wird zurückgegeben, wie in der folgenden Beispielausgabe gezeigt:
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>HA / DR example</title> </head> <body> <p>Welcome to a test web server with persistent disk snapshots!</p> </body> </html>
Mit diesem Schritt wird bestätigt, dass Apache richtig konfiguriert ist, und die Seite wird aus dem angehängten nichtflüchtigen Speicher geladen. In den nächsten Abschnitten erstellen Sie ein Image mit dieser Basis-VM und konfigurieren eine Instanzvorlage mit einem Startskript.
Snapshot-Zeitplan für nichtflüchtige Speicher erstellen
Damit in der verwalteten Instanzgruppe erstellte VMs immer die neuesten Daten des nichtflüchtigen Speichers haben, erstellen Sie einen Snapshot-Zeitplan. Dieser Zeitplan nimmt automatische Snapshots eines nichtflüchtigen Speichers zu bestimmten Zeiten vor und steuert, wie lange die Snapshots gespeichert werden sollen. Die folgende Abbildung zeigt, wie dieser Snapshot-Prozess funktioniert:
Denken Sie über die Anforderungen Ihrer Anwendung und Ihre Geschäftsziele nach, wie oft Snapshots erstellt werden. Eine statische Website benötigt weniger Snapshots als eine aktive Anwendung, die Daten auf das Laufwerk schreibt.
Weitere Informationen zur Bestimmung des besten Ansatzes für Ihre eigenen Anwendungen und der Methode zur Wiederherstellung finden Sie im Leitfaden zur Planung der Notfallwiederherstellung.
In diesem Szenario verwenden Sie einen Snapshot-Zeitplan, um reguläre Snapshots von nichtflüchtigem Speicher zu erstellen. Dieser Snapshot-Zeitplan wird in einer Ressourcenrichtlinie definiert. Mit Ressourcenrichtlinien können Sie Aktionen definieren, die ausgeführt werden sollen, und sie an Ressourcen in Ihrer Umgebung anhängen.
In dieser Ressourcenrichtlinie definieren Sie einen Zeitplan zum Erstellen eines Snapshots mit den folgenden Einstellungen:
- Alle 4 Stunden einen Snapshot erstellen, ab 12:00 Uhr (UTC)
- Die Snapshots für 1 Tag aufbewahren
Sie können diesen Zeitplan nach Bedarf für Ihre Umgebung konfigurieren, z. B. zur Startzeit und wie oft Sie die Snapshots erstellen möchten:
gcloud compute resource-policies create snapshot-schedule snapshot-schedule-$NAME_SUFFIX \ --description "Snapshot persistent disk every 4 hours" \ --max-retention-days 1 \ --start-time 22:00 \ --hourly-schedule 4 \ --region $REGION
Weitere Informationen finden Sie unter Geplante Snapshots für nichtflüchtige Speicher verwenden.
Hängen Sie die Ressourcenrichtlinie an den nichtflüchtigen Speicher an, um den Snapshot-Zeitplan zu verwenden. Geben Sie den Namen Ihres nichtflüchtigen Speichers und die Ressourcenrichtlinie an, die Sie im vorherigen Schritt erstellt haben:
gcloud compute disks add-resource-policies disk-$NAME_SUFFIX \ --resource-policies snapshot-schedule-$NAME_SUFFIX \ --zone $ZONE1
Sie können den Rest dieses Dokuments nicht fertigstellen und die verwaltete Instanzgruppe in Aktion sehen, bis der erste Laufwerk-Snapshot erstellt wurde. Erstellen Sie jetzt manuell einen Laufwerk-Snapshot und lassen Sie den Snapshot-Zeitplan für Ressourcenrichtlinien wie beschrieben erstellen:
gcloud compute disks snapshot disk-$NAME_SUFFIX \ --zone=$ZONE1 \ --snapshot-names=disk-$NAME_SUFFIX-$(date "+%Y%m%d%H%M%S")
Dienstkonto erstellen
Jede VM in der verwalteten Instanzgruppe, die in den nächsten Schritten erstellt wird, muss ein Startskript ausführen. Dieses Startskript erstellt einen nichtflüchtigen Speicher aus einem Snapshot und hängt ihn dann an die VM an. Erstellen Sie als Best Practice ein neues Dienstkonto, das nur die Berechtigungen enthält, die zum Ausführen dieser Laufwerkvorgänge erforderlich sind. Anschließend weisen Sie dieses Dienstkonto der VM zu.
Erstellen Sie ein Dienstkonto zur Verwendung mit den VMs in der verwalteten Instanzgruppe:
gcloud iam service-accounts create instance-sa-$NAME_SUFFIX \ --description="Service account for HA/DR example" \ --display-name="HA/DR for VM instances"
Erstellen Sie eine benutzerdefinierte Rolle und weisen Sie nur die Berechtigungen zu, die zum Ausführen der Datenträgerverwaltungsaufgaben erforderlich sind. Folgende Berechtigungen sind erforderlich:
compute.snapshots.list
compute.snapshots.useReadOnly
compute.disks.get
compute.disks.create
compute.instances.get
compute.instances.attachDisk
compute.disks.use
gcloud iam roles create instance_snapshot_management_$NAME_SUFFIX \ --project=$PROJECT_ID \ --title="Snapshot management for VM instances" \ --description="Custom role to allow an instance to create a persistent disk from a snapshot and attach to VM." \ --permissions=compute.snapshots.list,compute.snapshots.useReadOnly,compute.disks.get,compute.disks.create,compute.instances.get,compute.instances.attachDisk,compute.disks.use \ --stage=GA
Fügen Sie die erforderlichen Rollenbindungen für das neue Dienstkonto hinzu:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:instance-sa-$NAME_SUFFIX@$PROJECT_ID.iam.gserviceaccount.com" \ --role="projects/$PROJECT_ID/roles/instance_snapshot_management_$NAME_SUFFIX" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:instance-sa-$NAME_SUFFIX@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"
VM-Image und Instanzvorlage erstellen
Zum Erstellen identischer VMs, die automatisch ohne zusätzliche Konfiguration bereitgestellt werden können, verwenden Sie ein benutzerdefiniertes VM-Image. Dieses Image erfasst die Betriebssystem- und Apache-Konfiguration. Dieses Image wird von jeder VM verwendet, die in den nächsten Schritten in der verwalteten Instanzgruppe erstellt wurde.
Bevor Sie ein Image erstellen können, müssen Sie die VM beenden:
gcloud compute instances stop vm-base-$NAME_SUFFIX --zone=$ZONE1
Erstellen Sie ein Image der im vorherigen Abschnitt konfigurierten Basis-VM:
gcloud compute images create image-$NAME_SUFFIX \ --source-disk=vm-base-$NAME_SUFFIX \ --source-disk-zone=$ZONE1 \ --storage-location=$REGION
Sie verwenden cloud-init, um das vorherige Startskript auszuführen, wenn eine VM in den verwalteten Instanzgruppen zum ersten Mal gestartet wird. Jedes Mal, wenn die VM gestartet wird, wird ein reguläres Startskript ausgeführt, das auf die VM angewendet wird, z. B. wenn Sie die VM nach Updates neu starten.
Erstellen Sie eine cloud-init-Konfigurationsdatei für die Verwendung mit der Instanzvorlage:
tee -a cloud-init.yaml >/dev/null <<'EOF' #cloud-config runcmd: - [ bash, /opt/cloud-init-scripts/app-startup.sh ] EOF
Erstellen Sie eine Instanzvorlage, die die Konfiguration „cloud-init” zum Ausführen des Startskripts anwendet, das ein Laufwerk aus dem Snapshot erstellt und das Laufwerk dann an die VM anhängt und bereitstellt:
gcloud compute instance-templates create template-$NAME_SUFFIX \ --machine-type=n1-standard-1 \ --subnet=projects/$PROJECT_ID/regions/$REGION/subnetworks/subnet-$NAME_SUFFIX-$REGION \ --tags=http-server \ --image=image-$NAME_SUFFIX \ --scopes cloud-platform \ --service-account="instance-sa-$NAME_SUFFIX@$PROJECT_ID.iam.gserviceaccount.com" \ --metadata-from-file user-data=cloud-init.yaml
Verwaltete Instanzgruppe erstellen
Eine verwaltete Instanzgruppe führt die VMs aus. Die verwaltete Instanzgruppe wird in einer definierten Zone ausgeführt und überwacht den Zustand der VMs. Wenn ein Fehler auftritt und die VM nicht mehr ausgeführt wird, versucht die verwaltete Instanzgruppe, eine weitere VM in derselben Zone neu zu erstellen, und erstellt einen nichtflüchtigen Speicher aus dem letzten Snapshot. Wenn der Fehler auf Zonenebene liegt, müssen Sie das kalte Failover manuell ausführen und eine weitere verwaltete Instanzgruppe in einer anderen Zone erstellen. Dieselbe benutzerdefinierte Image- und Instanzvorlage konfiguriert die VM automatisch auf die gleiche Weise.
Erstellen Sie eine Systemdiagnose, um die VMs in der verwalteten Instanzgruppe zu überwachen. Diese Systemdiagnose gewährleistet, dass die VM auf Port 80 antwortet. Überwachen Sie für Ihre eigenen Anwendungen die entsprechenden Ports, um den VM-Status zu prüfen.
gcloud compute health-checks create http http-basic-check-$NAME_SUFFIX --port 80
Erstellen Sie eine verwaltete Instanzgruppe mit nur einer VM. Diese einzelne VM startet und erstellt einen nichtflüchtigen Speicher aus dem letzten Snapshot, stellt ihn und dann Webtraffic bereit.
gcloud compute instance-groups managed create instance-group-$NAME_SUFFIX-$ZONE1 \ --base-instance-name=instance-vm-$NAME_SUFFIX \ --template=template-$NAME_SUFFIX \ --size=1 \ --zone=$ZONE1 \ --health-check=http-basic-check-$NAME_SUFFIX
Load-Balancer erstellen und konfigurieren
Damit Nutzer auf Ihre Website zugreifen können, müssen Sie Traffic zu den VMs zulassen, die in der verwalteten Instanzgruppe ausgeführt werden. Außerdem möchten Sie den Traffic automatisch an neue VMs weiterleiten, wenn in einer verwalteten Instanzgruppe ein Zonenfehler auftritt.
Im folgenden Abschnitt erstellen Sie einen externen Load-Balancer mit einem Back-End-Dienst für HTTP-Traffic an Port 80, verwenden die in den vorherigen Schritten erstellte Systemdiagnose und ordnen eine externe IP-Adresse dem Back-End-Dienst zu.
Weitere Informationen finden Sie unter Einfachen externen HTTP-Load-Balancer einrichten.
Erstellen und konfigurieren Sie den Load-Balancer für Ihre Anwendung:
# Configure port rules for HTTP port 80 gcloud compute instance-groups set-named-ports \ instance-group-$NAME_SUFFIX-$ZONE1 \ --named-ports http:80 \ --zone $ZONE1 # Create a backend service and add the managed instance group to it gcloud compute backend-services create \ web-backend-service-$NAME_SUFFIX \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check-$NAME_SUFFIX \ --global gcloud compute backend-services add-backend \ web-backend-service-$NAME_SUFFIX \ --instance-group=instance-group-$NAME_SUFFIX-$ZONE1 \ --instance-group-zone=$ZONE1 \ --global # Create a URL map for the backend service gcloud compute url-maps create web-map-http-$NAME_SUFFIX \ --default-service web-backend-service-$NAME_SUFFIX # Configure forwarding for the HTTP traffic gcloud compute target-http-proxies create \ http-lb-proxy-$NAME_SUFFIX \ --url-map web-map-http-$NAME_SUFFIX gcloud compute forwarding-rules create \ http-content-rule-$NAME_SUFFIX \ --global \ --target-http-proxy=http-lb-proxy-$NAME_SUFFIX \ --ports=80
Rufen Sie die IP-Adresse der Weiterleitungsregel für den Web-Traffic ab:
IP_ADDRESS=$(gcloud compute forwarding-rules describe http-content-rule-$NAME_SUFFIX \ --global \ --format="value(IPAddress)")
Verwenden Sie
curl
oder öffnen Sie Ihren Webbrowser, um die Website mithilfe der IP-Adresse des Load-Balancers aus dem vorherigen Schritt aufzurufen:curl $IP_ADDRESS
Es dauert einige Minuten, bis der Load-Balancer die Bereitstellung abgeschlossen hat und Traffic korrekt an Ihr Back-End weitergeleitet wird. Wenn der Load-Balancer noch bereitgestellt wird, wird der HTTP-Fehler 404 oder 502 zurückgegeben. Warten Sie gegebenenfalls einige Minuten und versuchen Sie noch einmal, auf die Website zuzugreifen.
Die einfache Website wird zurückgegeben, wie in der folgenden Beispielausgabe gezeigt:
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>HA / DR example</title> </head> <body> <p>Welcome to a Compute Engine website with warm failover to Cloud Storage!</p> </body> </html>
Zonenausfall und -wiederherstellung simulieren
Sehen Sie sich die Ressourcenbereitstellungen an, bevor Sie einen Fehler auf Zonenebene simulieren. Alle Ressourcen wurden für die Unterstützung der folgenden Umgebung erstellt:
- Eine VM wird in einer verwalteten Instanzgruppe mit einem zugeordneten nichtflüchtigen Speicher ausgeführt, auf dem eine einfache Website gespeichert ist.
- Snapshots werden regelmäßig mithilfe eines Snapshot-Zeitplans für Ressourcenrichtlinien erstellt.
- Ein Startskript wird auf eine Instanzvorlage angewendet, sodass alle in der verwalteten Instanzgruppe erstellten VMs aus dem letzten Laufwerk-Snapshot einen nichtflüchtigen Speicher erstellen und anhängen.
- Mit einer Systemdiagnose wird der Status der VM in der verwalteten Instanzgruppe überwacht.
- Der externe Application Load Balancer leitet Nutzer an die VM weiter, die in der verwalteten Instanzgruppe ausgeführt wird.
- Wenn die VM ausfällt, versucht die verwaltete Instanzgruppe, eine VM in derselben Zone neu zu erstellen. Wenn der Fehler auf Zonenebene auftritt, müssen Sie manuell eine verwaltete Ersatzinstanzgruppe in einer anderen, funktionierenden Zone erstellen.
In einer Produktionsumgebung können Sie mithilfe von Cloud Monitoring oder einer anderen Monitoring-Lösung eine Benachrichtigung erhalten, wenn ein Problem auftritt. In der Benachrichtigung wird ein Mensch aufgefordert, den Umfang des Fehlers zu verstehen, bevor Sie manuell eine verwaltete Ersatzinstanzgruppe in einer anderen, funktionierenden Zone erstellen. Alternativ können Sie Ihre Monitoring-Lösung verwenden, um Ausfälle bei der verwalteten Instanzgruppe automatisch zu beheben.
Wenn Sie oder Ihre Überwachungslösung feststellen, dass ein Failover am sinnvollsten ist, erstellen Sie eine verwaltete Ersatzinstanzgruppe. In diesem Dokument erstellen Sie diese Ersatzressource manuell.
Löschen Sie das Back-End des Load-Balancers und die verwaltete Instanzgruppe, um einen Ausfall auf Zonenebene zu simulieren:
gcloud compute backend-services remove-backend \ web-backend-service-$NAME_SUFFIX \ --instance-group=instance-group-$NAME_SUFFIX-$ZONE1 \ --instance-group-zone=$ZONE1 \ --global gcloud compute instance-groups managed delete instance-group-$NAME_SUFFIX-$ZONE1 \ --zone=$ZONE1
Bestätigen Sie bei entsprechender Aufforderung die Anfrage zum Löschen der verwalteten Instanzgruppe.
In einer Produktionsumgebung generiert das Monitoringsystem eine Benachrichtigung, um nun eine kalte Failover-Aktion auszuführen.
Verwenden Sie wieder
curl
oder Ihren Webbrowser, um auf die IP-Adresse des Load-Balancers zuzugreifen:curl $IP_ADDRESS --max-time 5
Die Anfrage
curl
schlägt fehl, da es keine fehlerfreien Ziele für den Load-Balancer gibt.Erstellen Sie eine verwaltete Instanzgruppe in einer anderen Zone, um den kalten Failover zu simulieren:
gcloud compute instance-groups managed create instance-group-$NAME_SUFFIX-$ZONE2 \ --template=template-$NAME_SUFFIX \ --size=1 \ --zone=$ZONE2 \ --health-check=http-basic-check-$NAME_SUFFIX
Das VM-Image, die Instanzvorlage und der nichtflüchtige Speicher verwalten die Konfiguration für die Anwendungsinstanz.
Aktualisieren Sie den Load-Balancer, um die neue verwaltete Instanzgruppe und die VM hinzuzufügen:
gcloud compute instance-groups set-named-ports \ instance-group-$NAME_SUFFIX-$ZONE2 \ --named-ports http:80 \ --zone $ZONE2 gcloud compute backend-services add-backend \ web-backend-service-$NAME_SUFFIX \ --instance-group=instance-group-$NAME_SUFFIX-$ZONE2 \ --instance-group-zone=$ZONE2 \ --global
Verwenden Sie noch einmal
curl
oder Ihren Webbrowser, um auf die IP-Adresse des Load-Balancers zuzugreifen, die den Traffic an die VM weiterleitet, welche in der verwalteten Instanzgruppe ausgeführt wird:curl $IP_ADDRESS
Es dauert einige Minuten, bis die VM fertig ist mit der Bereitstellung und Daten aus dem letzten Snapshot des nichtflüchtigen Speichers wiederhergestellt wurden. Wenn die VM noch bereitgestellt wird, wird der HTTP-Fehler 404 oder 502 zurückgegeben. Wenn Sie gerade Daten noch wiederherstellt, wird der Standard-Apache angezeigt. Warten Sie gegebenenfalls einige Minuten und versuchen Sie noch einmal, auf die Website zuzugreifen.
Die folgende Beispielantwort zeigt, dass die Webseite auf der VM korrekt ausgeführt wird:
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>HA / DR example</title> </head> <body> <p>Welcome to a test web server with persistent disk snapshots!</p> </body> </html>
Prüfen Sie den Systemstatus der verwalteten Instanzgruppe:
gcloud compute instance-groups managed list-instances instance-group-$NAME_SUFFIX-$ZONE2 \ --zone $ZONE2
Das folgende Beispiel zeigt den Status der VM als
RUNNING
undHEALTHY
:NAME ZONE STATUS HEALTH_STATE ACTION instance-vm-app us-central1-f RUNNING HEALTHY NONE
Sehen Sie sich die Quelle an, um zu überprüfen, ob das angehängte nichtflüchtige Laufwerk aus einem Snapshot erstellt wurde. Geben Sie die Instanz
NAME
an, die durch den vorherigen Befehllist-instances
angezeigt wurde.gcloud compute instances describe NAME \ --zone=$ZONE2 \ --format="value(disks.[1].source)"
Das folgende Beispiel zeigt, dass der nichtflüchtige Speicher disk-app-us-central1-a-20210630165529-umopkt17-restored heißt. Das Suffix -restored wird vom Startskript dem Namen des letzten Laufwerk-Snapshots hinzugefügt:
https://www.googleapis.com/compute/v1/projects/project/zones/us-central1-f/disks/disk-app-us-central1-a-20210630165529-umopkt17-restored
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.
Führen Sie die folgenden Schritte aus, um die in diesem Dokument erstellten einzelnen Ressourcen zu löschen.
Löschen Sie die Konfiguration des Load-Balancers:
gcloud compute forwarding-rules delete \ http-content-rule-$NAME_SUFFIX --global --quiet gcloud compute target-http-proxies delete \ http-lb-proxy-$NAME_SUFFIX --quiet gcloud compute url-maps delete web-map-http-$NAME_SUFFIX --quiet gcloud compute backend-services delete \ web-backend-service-$NAME_SUFFIX --global --quiet
Löschen Sie die verwaltete Instanzgruppe und die Systemdiagnose:
gcloud compute instance-groups managed delete instance-group-$NAME_SUFFIX-$ZONE2 \ --zone=$ZONE2 --quiet gcloud compute health-checks delete http-basic-check-$NAME_SUFFIX --quiet
Löschen Sie die Instanzvorlage, die cloud-init-Konfiguration, Images, die Basis-VM, den nichtflüchtigen Speicher und den Snapshot-Zeitplan.
gcloud compute instance-templates delete template-$NAME_SUFFIX --quiet rm cloud-init.yaml gcloud compute images delete image-$NAME_SUFFIX --quiet gcloud compute instances delete vm-base-$NAME_SUFFIX --zone=$ZONE1 --quiet gcloud compute disks delete disk-$NAME_SUFFIX --zone=$ZONE1 --quiet gcloud compute resource-policies delete \ snapshot-schedule-$NAME_SUFFIX --region $REGION --quiet
Snapshots und Laufwerke auflisten und löschen, die von den Instanzen erstellt wurden:
gcloud compute disks list --filter="name:disk-$NAME_SUFFIX" \ --uri | xargs gcloud compute disks delete gcloud compute snapshots list --filter="name:disk-$NAME_SUFFIX" \ --uri | xargs gcloud compute snapshots delete
Löschen Sie die benutzerdefinierte Rolle und das benutzerdefinierte Dienstkonto:
gcloud iam roles delete instance_snapshot_management_$NAME_SUFFIX \ --project=$PROJECT_ID --quiet gcloud iam service-accounts delete \ instance-sa-$NAME_SUFFIX@$PROJECT_ID.iam.gserviceaccount.com --quiet
Löschen Sie die Firewallregeln:
gcloud compute firewall-rules delete allow-health-check-$NAME_SUFFIX --quiet gcloud compute firewall-rules delete allow-ssh-$NAME_SUFFIX --quiet gcloud compute firewall-rules delete allow-http-$NAME_SUFFIX --quiet
Löschen Sie das Subnetz und die VPC:
gcloud compute networks subnets delete \ subnet-$NAME_SUFFIX-$REGION --region=$REGION --quiet gcloud compute networks delete network-$NAME_SUFFIX --quiet
Nächste Schritte
- Ein alternativer Ansatz zur Reduzierung des potenziellen Datenverlusts finden Sie unter Kalt wiederherstellbaren Anwendungsserver mit regionalen nichtflüchtigen Speichern bereitstellen.
- Informationen zur Bestimmung des besten Ansatzes für Ihre eigenen Anwendungen und zur Verwendung der richtigen Wiederherstellungsmethode finden Sie im Leitfaden zur Planung der Notfallwiederherstellung.
- Unter Szenarien der Notfallwiederherstellung für Anwendungen finden Sie weitere Muster für Anwendungen, z. B. kalten und heißen Failover.
- Weitere Möglichkeiten zur Handhabung von Skalierung und Verfügbarkeit finden Sie unter Muster für skalierbare und robuste Anwendungen.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center