Einen kalten wiederherstellbaren Webserver mit Snapshots nichtflüchtiger Speicher bereitstellen

Last reviewed 2021-08-04 UTC

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:

Ein externer Application Load Balancer leitet Nutzer zu einer einzelnen VM weiter, die in einer verwalteten Instanzgruppe ausgeführt wird. Eine Ressourcenrichtlinie erstellt außerdem regelmäßige Snapshots eines nichtflüchtigen Speichers, der mit der VM verbunden ist.

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. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

  1. 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.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Compute Engine API aktivieren.

    Aktivieren Sie die API

  5. Installieren Sie die Google Cloud CLI.
  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  8. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  9. Compute Engine API aktivieren.

    Aktivieren Sie die API

  10. Installieren Sie die Google Cloud CLI.
  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. 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.

  1. 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 und us-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.

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

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

  1. 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 Bereichs 0.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.

  2. 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
    
  3. 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:

Die VM verfügt über eine einfache HTML-Seite, die auf dem nichtflüchtigen Speicher mit einer Apache-Konfigurationsdatei gespeichert ist, die aus dem bereitgestellten Speicherort geladen wird.

Sie erstellen diese Umgebung in den folgenden Schritten.

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

  3. 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
    
  4. 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
    
  5. Geben Sie die Datei aus und beenden Sie den Editor. In Nano verwenden Sie beispielsweise Ctrl-O, um die Datei auszugeben, und beenden dann mit Ctrl-X.

  6. Machen Sie das Konfigurationsskript ausführbar und führen Sie es dann aus:

    chmod +x configure-vm.sh
    ./configure-vm.sh
    
  7. 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
    
  8. Um die Variable NAME_SUFFIX, die Sie am Anfang des Dokuments definiert haben, in das Startskript, z. B. app, zu übernehmen, verwenden Sie den Befehl envsubst:

    export NAME=app
    envsubst '$NAME' < "/opt/cloud-init-scripts/app-startup.sh" \
        | sudo sponge "/opt/cloud-init-scripts/app-startup.sh"
    
  9. Beenden Sie die SSH-Sitzung zur VM:

    exit
    
  10. 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:

Eine Ressourcenrichtlinie wird erstellt, die einen Snapshot-Zeitplan definiert und an den nichtflüchtigen Speicher angehängt wird, um regelmäßige Snapshots zu erstellen.

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.

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

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

  1. 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"
    
  2. 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
    
  3. 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.

  1. Bevor Sie ein Image erstellen können, müssen Sie die VM beenden:

    gcloud compute instances stop vm-base-$NAME_SUFFIX --zone=$ZONE1
    
  2. 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
    
  3. 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
    
  4. 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.

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

  1. 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
    
  2. 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)")
    
  3. 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:

Ein externer Application Load Balancer leitet Nutzer zu einer einzelnen VM weiter, die in einer verwalteten Instanzgruppe ausgeführt wird. Eine Ressourcenrichtlinie erstellt außerdem regelmäßige Snapshots eines nichtflüchtigen Speichers, der mit der VM verbunden ist.

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

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

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

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

  4. 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
    
  5. 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>
    
  6. 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 und HEALTHY:

    NAME             ZONE           STATUS   HEALTH_STATE  ACTION
    instance-vm-app  us-central1-f  RUNNING  HEALTHY       NONE
    
  7. 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 Befehl list-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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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
    
  7. 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