VIP-Adresse in einem SLES-HA-Cluster zu einem internen Load-Balancer migrieren

In Google Cloud wird für die Implementierung einer virtuellen IP-Adresse (VIP) für einen betriebssystembasierten HA-Cluster (Hochverfügbarkeit) für SAP die Failover-Unterstützung eines internen TCP/UDP-Load-Balancers empfohlen.

Wenn Sie in Google Cloud einen SLES-HA-Cluster (SUSE Linux Enterprise Server) für SAP haben, der eine mit einer Alias-IP-Adresse implementierte VIP-Adresse nutzt, können Sie die VIP-Adresse migrieren, um stattdessen einen internen Load-Balancer zu verwenden.

Wenn Sie die sap_hana_ha-Deployment Manager-Vorlage von Google Cloud verwendet haben, um ein SAP HANA-System zur vertikalen Skalierung in einem HA-Cluster auf SLES bereitzustellen, wird Ihre VIP-Adresse mit einer Alias-IP-Adresse implementiert.

In dieser Anleitung wird gezeigt, wie Sie eine VIP-Adresse in einem SLES-HA-Cluster migrieren.

Voraussetzungen

In dieser Anleitung wird angenommen, dass Sie bereits einen korrekt konfigurierten HA-Cluster in Google Cloud haben, der für die VIP-Implementierung eine Alias-VIP-Adresse nutzt.

Die einzelnen Schritte im Überblick:

  • Konfigurieren und testen Sie einen Load-Balancer mithilfe einer temporären Weiterleitungsregel und einer temporären IP-Adresse anstelle der VIP-Adresse.
  • Versetzen Sie den Cluster in den Wartungsmodus und beenden Sie nach Möglichkeit die Instanzen Ihrer SAP-Anwendungsserver, um unerwartetes Verhalten zu vermeiden.
  • Heben Sie die Zuweisung der Alias-IP-Adresse vom primären Host auf. Diese Adresse wird zur VIP-Adresse des Load-Balancers.
  • Gehen Sie in der Konfiguration des Pacemaker-Clusters so vor:
    • Ändern Sie die Klasse der vorhandenen VIP-Ressource.
    • Ersetzen Sie die vorhandenen Parameter für die Alias-IP-Adresse durch die Parameter für den Systemdiagnosedienst.

Vorhandene VIP-Adresse bestätigen

Rufen Sie auf der primären VM-Instanz die vorhandene Alias-IP-basierte Clusterkonfiguration als Root auf:

$ crm configure show

Die VIP-Adresse ist die im Parameter alias_ip= angegebene Adresse. Beispiel:

primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.128.1.200/32" hostlist="ha1 ha2" gcloud_path="/usr/local/google-cloud-sdk/bin/gcloud" logging=yes \
        meta priority=10
primitive rsc_vip_int-primary IPaddr2 \
        params ip=10.128.1.200 cidr_netmask=32 nic=eth0 \
        op monitor interval=10s

Bestätigen Sie in der Cloud Console, dass die IP-Adresse, die mit der Alias-IP-Adresse verwendet wird, reserviert ist:

$ gcloud compute addresses list --filter="region:( cluster-region )"

Wenn die IP-Adresse reserviert und der primären VM-Instanz zugewiesen ist, wird ihr Status als IN_USE angezeigt. Wenn Sie die IP-Adresse dem Load-Balancer neu zuweisen, müssen Sie sie zuerst von der aktiven primären Instanz trennen. Der Status wechselt dann zu RESERVED.

Wenn die Adresse nicht in den IP-Adressen enthalten ist, die vom Befehl "list" zurückgegeben werden, reservieren Sie sie jetzt, um in Zukunft Konflikte zu vermeiden:

$ gcloud compute addresses create vip-name \
  --region cluster-region --subnet cluster-subnet \
  --addresses vip-address

Listen Sie die Adressen noch einmal auf, um zu prüfen, ob die IP-Adresse als RESERVED angezeigt wird.

Failover-Unterstützung für Cloud Load Balancing konfigurieren

Der interne TCP/UDP-Load-Balancing-Dienst mit Failover-Unterstützung leitet den Traffic basierend auf einem Systemdiagnosedienst an den aktiven Host in einem SAP HANA-Cluster weiter. Dies bietet Schutz in einer Aktiv/Passiv-Konfiguration und kann um die Unterstützung einer sekundären Aktiv/Aktiv-Konfiguration mit Lesezugriff erweitert werden.

Wenn Sie Konflikte vermeiden und Tests vor Abschluss der Migration ermöglichen möchten, müssen Sie gemäß dieser Anleitung eine temporäre Weiterleitungsregel mit einer Platzhalter-IP-Adresse aus dem Subnetz erstellen, dem die VIP-Adresse zugeordnet ist. Wenn Sie bereit sind, die VIP-Implementierung zu ändern, erstellen Sie mit der VIP-Adresse eine neue endgültige Weiterleitungsregel.

Temporäre IP-Adresse für virtuelle IP-Adresse reservieren

Die VIP-Adresse folgt dem aktiven SAP HANA-System. Der Load-Balancer leitet den an die VIP gesendeten Traffic an die VM weiter, die derzeit das aktive SAP HANA-System hostet.

  1. Öffnen Sie Cloud Shell:

    Zu Cloud Shell

  2. Reservieren Sie zu Testzwecken eine temporäre IP-Adresse für das Subnetz, dem die Alias-IP-Adresse zugeordnet ist. Wenn Sie das Flag --addresses weglassen, wird im angegebenen Subnetz automatisch eine IP-Adresse ausgewählt:

    $ gcloud compute addresses create vip-name \
      --region cluster-region --subnet cluster-subnet \
      --addresses vip-address

    Weitere Informationen zum Reservieren einer statischen IP-Adresse finden Sie unter Statische interne IP-Adresse reservieren.

  3. Bestätigen Sie die Reservierung der IP-Adresse:

    $ gcloud compute addresses describe vip-name \
      --region cluster-region

    Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:

    address: 10.0.0.19
    addressType: INTERNAL
    creationTimestamp: '2020-05-20T14:19:03.109-07:00'
    description: ''
    id: '8961491304398200872'
    kind: compute#address
    name: vip-for-hana-ha
    networkTier: PREMIUM
    purpose: GCE_ENDPOINT
    region: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/addresses/vip-for-hana-ha
    status: RESERVED
    subnetwork: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/subnetworks/example-subnet-us-central1

Instanzgruppen für Host-VMs erstellen

  1. Erstellen Sie in Cloud Shell zwei nicht verwaltete Instanzgruppen und weisen Sie die primäre Host-VM der einen und die sekundäre Host-VM der anderen zu:

    $ gcloud compute instance-groups unmanaged create primary-ig-name \
      --zone=primary-zone
    $ gcloud compute instance-groups unmanaged add-instances primary-ig-name \
      --zone=primary-zone \
      --instances=primary-host-name
    $ gcloud compute instance-groups unmanaged create secondary-ig-name \
      --zone=secondary-zone
    $ gcloud compute instance-groups unmanaged add-instances secondary-ig-name \
      --zone=secondary-zone \
      --instances=secondary-host-name
    
  2. Bestätigen Sie die Erstellung der Instanzgruppen:

    $ gcloud compute instance-groups unmanaged list

    Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:

    NAME          ZONE           NETWORK          NETWORK_PROJECT        MANAGED  INSTANCES
    hana-ha-ig-1  us-central1-a  example-network  example-project-123456 No       1
    hana-ha-ig-2  us-central1-c  example-network  example-project-123456 No       1

Compute Engine-Systemdiagnose erstellen

  1. Erstellen Sie die Systemdiagnose in Cloud Shell: Wählen Sie für die Systemdiagnose einen Port aus dem privaten Bereich 49152-65535 aus, um Konflikte mit anderen Diensten zu vermeiden. Die Werte für Prüfintervall und Zeitlimit sind etwas länger als die Standardwerte, um die Failover-Toleranz während Compute Engine-Live-Migrationsereignissen zu erhöhen. Sie können die Werte bei Bedarf anpassen:

    $ gcloud compute health-checks create tcp health-check-name --port=healthcheck-port-num \
      --proxy-header=NONE --check-interval=10 --timeout=10 --unhealthy-threshold=2 \
      --healthy-threshold=2
  2. Bestätigen Sie die Erstellung der Systemdiagnose:

    $ gcloud compute health-checks describe health-check-name

    Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:

    checkIntervalSec: 10
    creationTimestamp: '2020-05-20T21:03:06.924-07:00'
    healthyThreshold: 2
    id: '4963070308818371477'
    kind: compute#healthCheck
    name: hana-health-check
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/global/healthChecks/hana-health-check
    tcpHealthCheck:
     port: 60000
     portSpecification: USE_FIXED_PORT
     proxyHeader: NONE
    timeoutSec: 10
    type: TCP
    unhealthyThreshold: 2

Firewallregel für die Systemdiagnosen erstellen

Definieren Sie eine Firewallregel für einen Port im privaten Bereich, die den Zugriff auf Ihre Host-VMs aus den IP-Bereichen ermöglicht, die von Compute Engine-Systemdiagnosen verwendet werden: 35.191.0.0/16 und 130.211.0.0/22. Weitere Informationen finden Sie unter Firewallregeln für Systemdiagnosen erstellen.

  1. Wenn Sie noch keine haben, erstellen Sie eine Firewallregel, um die Systemdiagnosen zuzulassen:

    $ gcloud compute firewall-rules create  rule-name \
      --network network-name \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags network-tags \
      --rules tcp:hlth-chk-port-num

    Beispiel:

    gcloud compute firewall-rules create  fw-allow-health-checks \
    --network example-network \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges 35.191.0.0/16,130.211.0.0/22 \
    --target-tags cluster-ntwk-tag \
    --rules tcp:60000

Load-Balancer und Failover-Gruppe konfigurieren

  1. Erstellen Sie den Back-End-Dienst des Load-Balancers:

    $ gcloud compute backend-services create backend-service-name \
      --load-balancing-scheme internal \
      --health-checks health-check-name \
      --no-connection-drain-on-failover \
      --drop-traffic-if-unhealthy \
      --failover-ratio 1.0 \
      --region cluster-region \
      --global-health-checks
  2. Fügen Sie die primäre Instanzgruppe dem Back-End-Dienst hinzu:

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group primary-ig-name \
      --instance-group-zone primary-zone \
      --region cluster-region
  3. Fügen Sie dem Back-End-Dienst die sekundäre Failover-Instanzgruppe hinzu:

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group secondary-ig-name \
      --instance-group-zone secondary-zone \
      --failover \
      --region cluster-region
  4. Erstellen Sie eine temporäre Weiterleitungsregel. Geben Sie als IP-Adresse die temporäre IP-Adresse an, die Sie zum Testen reserviert haben:

    $ gcloud compute forwarding-rules create rule-name \
      --load-balancing-scheme internal \
      --address vip-address \
      --subnet cluster-subnet \
      --region cluster-region \
      --backend-service backend-service-name \
      --ports ALL

Konfiguration des Load-Balancers testen

Auch wenn Ihre Back-End-Instanzgruppen erst später als fehlerfrei registriert werden, können Sie die Konfiguration des Load-Balancers testen. Richten Sie dazu einen Listener ein, der auf die Systemdiagnosen reagiert. Wenn der Load-Balancer nach der Einrichtung eines Listeners korrekt konfiguriert ist, ändert sich der Status der Back-End-Instanzgruppen in "fehlerfrei".

In den folgenden Abschnitten werden verschiedene Methoden vorgestellt, mit denen Sie die Konfiguration testen können.

Load-Balancer mit dem socat-Dienstprogramm testen

Mit dem socat-Dienstprogramm können Sie vorübergehend den Port der Systemdiagnose beobachten. Sie müssen das socat-Dienstprogramm ohnehin installieren, da Sie es später beim Konfigurieren von Clusterressourcen benötigen.

  1. Installieren Sie als Root auf beiden Host-VMs das socat-Dienstprogramm:

    # zypper install -y socat

  2. Starten Sie einen socat-Prozess, um 60 Sekunden lang den Port der Systemdiagnose zu beobachten:

    # timeout 60s socat - TCP-LISTEN:hlth-chk-port-num,fork

  3. Warten Sie in Cloud Shell einige Sekunden, bis die Systemdiagnose den Listener erkennt, und prüfen Sie dann den Status Ihrer Back-End-Instanzgruppen:

    $ gcloud compute backend-services get-health backend-service-name \
      --region cluster-region

    Die Ausgabe sollte in etwa so aussehen:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth

Load-Balancer über Port 22 testen

Wenn Port 22 für SSH-Verbindungen auf Ihren Host-VMs geöffnet ist, können Sie die Systemdiagnose so bearbeiten, dass vorübergehend Port 22 verwendet wird, da hier ein Listener konfiguriert ist, der auf die Systemdiagnose reagieren kann.

So verwenden Sie vorübergehend Port 22:

  1. Klicken Sie in der Konsole auf Ihre Systemdiagnose:

    Zur Seite "Systemdiagnosen"

  2. Klicken Sie auf Bearbeiten.

  3. Ändern Sie im Feld Port die Portnummer in 22.

  4. Klicken Sie auf Speichern und warten Sie ein bis zwei Minuten.

  5. Prüfen Sie in Cloud Shell den Status Ihrer Back-End-Instanzgruppen:

    $ gcloud compute backend-services get-health backend-service-name \
      --region cluster-region

    Die Ausgabe sollte in etwa so aussehen:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth
  6. Wenn Sie fertig sind, ändern Sie die Portnummer der Systemdiagnose wieder in die ursprüngliche Portnummer.

VIP-Implementierung für Nutzung des Load-Balancers migrieren

Mit den folgenden Schritten bearbeiten Sie die Konfiguration des Pacemaker-Clusters und die Weiterleitungsregel des Load-Balancers, um die VIP-Migration abzuschließen.

System für Bearbeitung vorbereiten

  1. Beenden Sie falls möglich die SAP-Anwendung, damit keine Verbindung zur SAP HANA-Datenbank hergestellt wird, da Sie die Verbindung kurzzeitig unterbrechen, um die IP-Adressen auszutauschen. Über die NetWeaver-Arbeitsprozesse kann wieder eine Verbindung zur Datenbank hergestellt werden. Es sind jedoch Fehler oder Verzögerungen möglich, die durch das Unterbrechen der Verbindung verhindert werden können. Achten Sie darauf, dass Ihre IP-Adresse in einem internen Bereich registriert ist, der Teil Ihrer VPC in der Zielregion ist.

  2. Fügen Sie den Cluster als Root in die aktive primäre Instanz ein und aktivieren Sie für den Cluster den Wartungsmodus:

    $ crm configure property maintenance-mode="true"
  3. Sichern Sie die Clusterkonfiguration:

    $ crm configure show > clusterconfig.backup

Zuweisung der Alias-IP-Adresse aufheben

  1. Bestätigen Sie in Cloud Shell die Alias-IP-Bereiche, die der primären SAP-Instanz zugewiesen sind:

    $ gcloud compute instances describe \
        primary-host-name \
        --zone primary-zone \
        --format="flattened(name,networkInterfaces[].aliasIpRanges)"
  2. Aktualisieren Sie in der Cloud Console die Netzwerkschnittstelle. Wenn Sie keine Alias-IP-Adressen beibehalten müssen, geben Sie --aliases "" an:

    $ gcloud compute instances network-interfaces update primary-host-name \
    --zone primary-zone \
    --aliases "ip-ranges-to-retain"

VIP-Weiterleitungsregel erstellen und bereinigen

  1. Erstellen Sie in der Cloud Console eine neue Front-End-Weiterleitungsregel für den Load-Balancer. Geben Sie dazu die IP-Adresse an, die zuvor für die Alias-IP-Adresse verwendet wurde. Das ist Ihre VIP-Adresse.

    $ gcloud compute forwarding-rules create rule-name \
      --load-balancing-scheme internal \
      --address vip-address \
      --subnet cluster-subnet \
      --region cluster-region \
      --backend-service backend-service-name \
      --ports ALL
  2. Bestätigen Sie die Erstellung der Weiterleitungsregel und notieren Sie sich den Namen der temporären Weiterleitungsregel zum Löschen:

    $ gcloud compute forwarding-rules list
  3. Löschen Sie die temporäre Weiterleitungsregel:

    $ gcloud compute forwarding-rules delete rule-name --region=cluster-region
  4. Geben Sie die reservierte temporäre IP-Adresse frei:

    $ gcloud compute addresses delete temp-ip-name --region=cluster-region

Einfache VIP-Ressource in der Clusterkonfiguration bearbeiten

  1. Bearbeiten Sie auf der primären Instanz als Root die Definition der einfachen VIP-Ressourcen. Wenn der Cluster mit den von Google Cloud bereitgestellten Deployment Manager-Vorlagen erstellt wurde, lautet der Name der einfachen VIP-Ressource rsc_vip_gcp-primary:

    $ crm configure edit rsc_name

    Die Ressourcendefinition wird in einem Texteditor wie z. B. vi geöffnet.

  2. Nehmen Sie in der Pacemaker HA-Clusterkonfiguration die folgenden Änderungen an der VIP-Ressource vor:

    • Ersetzen Sie die Ressourcenklasse ocf:gcp:alias durch anything.
    • Ändern Sie das Intervall op monitor in interval=10s.
    • Ändern Sie das Zeitlimit op monitor in timeout=20s.
    • Ersetzen Sie die Alias-IP-Parameter:
      alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes
      durch Systemdiagnosedienstparameter:
      binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null"

    Ersetzen Sie beispielsweise die im nachfolgenden Code fett hervorgehobenen Einträge einer Alias-IP-Adresse:

    primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes \
        meta priority=10

    Wenn Sie mit der Bearbeitung fertig sind, sollte die Ressourcendefinition für den Systemdiagnosedienst wie im folgenden Beispiel aussehen:

    primitive rsc_vip_gcp-primary anything \
        op monitor interval=10s timeout=20s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null" \
        meta priority=10

    Im vorangegangenen Beispiel ist HC port der Port der Systemdiagnose, den Sie bei der Erstellung der Systemdiagnose und der Konfiguration des Dienstprogramms socat angegeben haben.

  3. Beenden Sie den Wartungsmodus des Clusters:

    $ crm configure property maintenance-mode="false"

Aktualisierten HA-Cluster testen

Prüfen Sie über die Anwendungsinstanz, ob Sie auf die Datenbank zugreifen können. Führen Sie dazu einen der folgenden Befehle aus:

  • Als sidadm-Nutzer

    > R3trans -d
  • Als beliebiger Nutzer:

    • telnet VIP HANA SQL port
    • nc -zv VIP HANA SQL port