So erstellen Sie ein Hochverfügbarkeits-Setup mit Heartbeat- und Floating-IPs unter Ubuntu 16.04

Einführung

Heartbeat ist ein Open-Source-Programm, das Client-Servern Clusterinfrastrukturfunktionen (Cluster-Mitgliedschaft und Messaging) zur Verfügung stellt. Diese Funktionen sind eine wichtige Komponente in einer Hochverfügbarkeitsserverinfrastruktur. In diesem Tutorial zeigen wir, wie Sie ein HA-Server-Setup mit zwei Knoten erstellen, indem Sie einfach Heartbeat und aDigitalOcean Floating IP verwenden.

Heartbeat wird normalerweise in Verbindung mit einem Cluster Resource Manager (CRM) wie Pacemaker verwendet, um eine vollständige HA-Einrichtung zu erzielen. Wenn Sie ein robusteres HA-Setup erstellen möchten, sollten SieCorosync and Pacemaker oderKeepalived verwenden.

Goal

Wenn das HA-Setup abgeschlossen ist, besteht es aus zwei Ubuntu 16.04-Servern in einer Aktiv / Passiv-Konfiguration. Dies wird erreicht, indem Sie eine Floating-IP angeben, mit der Ihre Benutzer auf Ihre Dienste oder Ihre Website zugreifen, um auf den primären oder aktiven Server zu verweisen, sofern kein Fehler festgestellt wird. Wenn der Heartbeat-Dienst feststellt, dass der Primärserver nicht verfügbar ist, führt der Sekundärserver automatisch ein Skript aus, um die Floating-IP über die DigitalOcean-API selbst zuzuweisen. Auf diese Weise wird der nachfolgende Netzwerkverkehr zur Floating-IP an Ihren Sekundärserver geleitet, der als aktiver Server fungiert, bis der Primärserver wieder verfügbar ist (an diesem Punkt weist der Primärserver die Floating-IP sich selbst zu).

Active/passive Diagram

[.note] #Note: Dieses Lernprogramm dient nur zu Demonstrationszwecken und behandelt nur einige Aspekte der Einrichtung einer zuverlässigen HA-Lösung.
Die wichtigsten Aspekte dieses Dokuments sind die Details zur Installation Aktiv / Passiv-Knoten auf Gateway-Ebene und zum Binden an eine Floating-IP.
Um das Lernprogramm zu vereinfachen, konfigurieren wir sie so, dass sie mit ihren jeweiligen Knoten antworten, anstatt Reverse-Proxy-Load-Balancer auf jedem Server zu konfigurieren Hostname und öffentliche IP-Adresse.
#

Um dieses Ziel zu erreichen, folgen wir diesen Schritten:

  • Erstelle 2 Tröpfchen, die Verkehr erhalten

  • Erstellen Sie eine Floating IP und weisen Sie sie einem der Droplets zu

  • Erstellen Sie einen DNS-A-Eintrag, der auf die Floating-IP verweist (optional).

  • Installieren Sie Heartbeat on Droplets

  • Konfigurieren Sie Heartbeat für die Ausführung des Floating IP-Neuzuweisungsdienstes

  • Erstellen Sie einen Floating IP-Neuzuweisungsdienst

  • Testen Sie das Failover

Mit diesem Ziel können wir beginnen, unser HA-Setup einzurichten.

Voraussetzungen

Um die Floating IP-Neuzuweisung zu automatisieren, müssen wir die DigitalOcean-API verwenden. Dies bedeutet, dass Sie ein PAT (Personal Access Token) generieren müssen, ein API-Token, mit dem Sie sich bei Ihrem DigitalOcean-Konto mitread undwrite Zugriff authentifizieren können. Sie können dies erreichen, indem Sie dem AbschnittHow To Generate a Personal Access Token des API-Tutorials folgen. Ihre PAT wird in einem Skript verwendet, das beiden Servern in Ihrem Cluster hinzugefügt wird. Es ist wichtig, dass Sie es an einem sicheren Ort aufbewahren, damit Sie uneingeschränkt auf Ihr DigitalOcean-Konto zugreifen können.

Zusätzlich zur API werden in diesem Lernprogramm die folgenden DigitalOcean-Funktionen verwendet:

Bitte lesen Sie die verlinkten Tutorials, wenn Sie mehr darüber erfahren möchten.

Erstellen Sie Tröpfchen

Der erste Schritt besteht darin, zwei Ubuntu-Droplets im selben Datencenter zu erstellen, die als primärer und sekundärer Server fungieren, wie oben beschrieben. In unserem Beispiel-Setup werden wir sie zur leichteren Bezugnahme als "primär" und "sekundär" bezeichnen. Wir werden Nginx auf beiden Droplets installieren und deren Indexseiten durch Informationen ersetzen, die sie eindeutig identifizieren. Auf diese Weise können wir auf einfache Weise demonstrieren, dass das HA-Setup funktioniert. Für ein Produktionssetup sollten Ihre Server einen Webserver oder Load Balancer Ihrer Wahl ausführen.

Erstellen Sie zwei Ubuntu 16.04-Droplets,primary undsecondary, mit diesem Bash-Skript als Benutzerdaten:

Beispiel Benutzerdaten

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /var/www/html/index.html

Dadurch wird Nginx installiert und der Inhalt vonindex.html durch den Hostnamen und die IP-Adresse des Droplets ersetzt (unter Bezugnahme auf den Metadatendienst). Wenn Sie auf eines der Droplets über seine öffentliche IP-Adresse zugreifen, wird eine einfache Webseite mit dem Hostnamen und der IP-Adresse des Droplets angezeigt. Dies ist hilfreich, um zu testen, auf welches Droplet die Floating-IP zu einem bestimmten Zeitpunkt verweist.

Erstellen Sie eine Floating IP

Klicken Sie in der DigitalOcean-Systemsteuerung im oberen Menü aufNetworking und im Untermenü aufFloating IPs.

No Floating IPs

Weisen Sie Ihremprimary-Droplet eine Floating-IP zu, und klicken Sie dann auf die SchaltflächeAssign Floating IP.

Überprüfen Sie nach der Zuweisung der Floating IP, ob Sie das zugewiesene Droplet erreichen können, indem Sie es in einem Webbrowser aufrufen.

http://your_floating_ip

Sie sollten die Indexseite Ihres primären Droplets sehen.

DNS konfigurieren (optional)

Wenn Sie über einen Domainnamen auf Ihr HA-Setup zugreifen möchten, erstellen Sie in Ihrem DNS einA record, das Ihre Domain auf Ihre Floating IP-Adresse verweist. Wenn Ihre Domain die Nameserver von DigitalOcean verwendet, befolgen Siestep threeim Tutorial Einrichten eines Hostnamens mit DigitalOcean. Sobald dies erfolgt ist, können Sie über den Domainnamen auf Ihren aktiven Server zugreifen.

Der von uns verwendete Beispieldomänenname istexample.com. Wenn Sie zurzeit keinen Domainnamen haben, sollten Sie stattdessen die Floating-IP-Adresse verwenden.

Installieren Sie Heartbeat

Der nächste Schritt ist die Installation von Heartbeat auf beiden Servern. Der einfachste Weg, Heartbeat zu installieren, ist apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Heartbeat ist jetzt installiert, muss jedoch konfiguriert werden, bevor etwas unternommen werden kann.

Herzschlag konfigurieren

Um unseren gewünschten Cluster zum Laufen zu bringen, müssen wir diese Heartbeat-Konfigurationsdateien identisch in den/etc/ha.d-Verzeichnissen beider Server erstellen und einrichten:

  1. ha.cf - Globale Konfiguration des Heartbeat-Clusters einschließlich seiner Mitgliedsknoten

  2. authkeys - Enthält einen Sicherheitsschlüssel, mit dem Knoten sich beim Cluster authentifizieren können

  3. haresources - Gibt die Dienste an, die vom Cluster verwaltet werden, und den Knoten, der der bevorzugte Eigentümer der Dienste ist. Beachten Sie, dass diese Datei nicht in einem Setup verwendet wird, das ein CRM wie Pacemaker verwendet

Außerdem müssen wir ein Skript bereitstellen, das die Neuzuweisung von Floating IP für den Fall ausführt, dass sich die Verfügbarkeit des primären Droplets ändert.

Knoteninformationen sammeln

Bevor Sieha.cf konfigurieren, sollten Sie die Namen der einzelnen Knoten nachschlagen. Heartbeat erfordert, dass jeder Knotenname mit der jeweiligenuname -n-Ausgabe übereinstimmt.

Führen Sie unterboth servers diesen Befehl aus, um die entsprechenden Knotennamen zu suchen:

uname -n

Beachten Sie die Ausgabe des Befehls. Die Beispielknotennamen lauten "primär" und "sekundär". Dies entspricht dem, was wir als Droplets bezeichnet haben.

Um festzustellen, welche Knoten verfügbar sind, müssen Sie auch die Netzwerkschnittstelle und die IP-Adresse ermitteln, die jeder Knoten für die Kommunikation mit dem Rest des Clusters verwendet. Sie können eine beliebige Netzwerkschnittstelle verwenden, solange jeder Knoten die anderen Knoten im Cluster erreichen kann. Wir werden die öffentliche Schnittstelle unserer Droplets verwenden, die zufälligeth0 beträgt.

Verwenden Sie unterboth servers diesen Befehl, um die IP-Adresse dereth0-Schnittstelle nachzuschlagen (oder in der DigitalOcean-Systemsteuerung nachzuschlagen):

ip addr show eth0
ip addr show eth0 output:2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff
    inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.17.0.28/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::601:76ff:fea5:4501/64 scope link
       valid_lft forever preferred_lft forever

Notieren Sie die IP-Adresse der Netzwerkschnittstelle (im Beispiel hervorgehoben). Stellen Sie sicher, dass Sie die IP-Adressen beider Server abrufen.

Erstellen Sie eine ha.cf-Datei

Öffnen Sie aufboth servers/etc/ha.d/ha.cf in Ihrem bevorzugten Editor. Wir verwenden Nano:

sudo nano /etc/ha.d/ha.cf

Die Datei sollte neu und leer sein. Wir müssen die Netzwerkschnittstellen und Namen der einzelnen Knoten in unserem Cluster hinzufügen.

Kopieren Sie diese Konfiguration und fügen Sie sie in die Datei ein. Ersetzen Sie dann die entsprechenden Knotennamen und IP-Adressen durch die Werte, die wir zuvor nachgeschlagen haben. In diesem Beispiel lautet die IP-Adresse vonprimary198.51.100.5 und die IP-Adresse vonsecondary198.51.100.6:

/etc/ha.d/ha.cf

node primary
ucast eth0 198.51.100.5
node secondary
ucast eth0 198.51.100.6

Speichern und schließen Sie die Datei. Als Nächstes richten wir den Autorisierungsschlüssel des Clusters ein.

Erstellen Sie eine Authkeys-Datei

Mit dem Autorisierungsschlüssel können Clustermitglieder einem Cluster beitreten. Zu diesem Zweck können wir einfach einen zufälligen Schlüssel generieren.

Führen Sie auf dem Knotenprimary diese Befehle aus, um einen geeigneten Autorisierungsschlüssel in einer Umgebungsvariablen mit dem NamenAUTH_KEY zu generieren:

if [ -z "${AUTH_KEY}" ]; then
  export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
      | command openssl sha1 \
      | command cut --delimiter=' ' --fields=2)"
fi

Schreiben Sie dann die/etc/ha.d/authkeys-Datei mit den folgenden Befehlen:

sudo bash -c "{
  echo auth1
  echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

Überprüfen Sie den Inhalt derauthkeys-Datei folgendermaßen:

sudo cat /etc/ha.d/authkeys

Es sollte ungefähr so ​​aussehen (mit einem anderen Autorisierungsschlüssel):

/etc/ha.d/authkeys

auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

Stellen Sie sicher, dass die Datei nur vom Root-Benutzer gelesen werden kann:

sudo chmod 600 /etc/ha.d/authkeys

Kopieren Sie nun die/etc/ha.d/authkeys-Datei von Ihrem Primärknoten auf Ihren Sekundärknoten. Sie können dies manuell oder mitscp tun.

Stellen Sie auf dem Server vonsecondaryicher, dass Sie die Berechtigungen für die Datei vonauthkeysfestlegen:

sudo chmod 600 /etc/ha.d/authkeys

Zu diesem Zeitpunkt sollten beide Server eine identische/etc/ha.d/authkeys-Datei haben.

Erstellen Sie eine Haresources-Datei

Die Dateiharesources gibtpreferred hosts an, gepaart mit Diensten, die der Cluster verwaltet. Der bevorzugte Host ist der Knoten, auf demshould die zugehörigen Dienste ausführen, wenn der Knoten verfügbar ist. Wenn der bevorzugte Wirtis notverfügbar ist, d.h. Ist es für den Cluster nicht erreichbar, übernimmt einer der anderen Knoten. Mit anderen Worten, der sekundäre Server übernimmt, wenn der primäre Server ausfällt.

Öffnen Sie unterboth servers die Dateiharesources in Ihrem bevorzugten Editor. Wir verwenden Nano:

sudo nano /etc/ha.d/haresources

Fügen Sie nun diese Zeile zur Datei hinzu und ersetzen Sie sie im Namen Ihres primären Knotens, falls dies nicht der Fall ist:

/etc/ha.d/haresources

primary floatip

Speichern und schließen Sie die Datei. Dadurch wird der Server vonprimaryals bevorzugter Host für den Dienst vonfloatipkonfiguriert, der derzeit nicht definiert ist. Richten wir als nächstes den Dienstfloatipein.

Erstellen Sie einen Floating IP-Neuzuweisungsdienst

Unser Heartbeat-Cluster ist so konfiguriert, dass der Dienstfloatipverwaltet wird, mit dem ein Knoten die Floating IP selbst zuweisen kann. Der Dienst muss jedoch noch erstellt werden. Bevor wir den Dienst selbst einrichten, erstellen wir jedoch ein Skript, das die Floating-IP über die DigitalOcean-API dem Knoten zuweist, auf dem er ausgeführt wird. Dann erstellen wir den Dienstfloatip, der das Floating IP-Neuzuweisungsskript ausführt.

Erstellen Sie ein Assign-IP-Skript

In unserem Beispiel laden wir ein einfaches Python-Skript herunter, das einer bestimmten Droplet-ID mithilfe der DigitalOcean-API eine Floating-IP zuweist.

Laden Sie unterboth servers das Python-Skriptassign-ipherunter:

sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

Machen Sie es aufboth servers ausführbar:

sudo chmod +x /usr/local/bin/assign-ip

Da unser Skript eine Anfrage an eine API stellt, muss die Bibliothek von PythonRequestsinstalliert sein:

sudo apt-get install python-requests

Die Verwendung des Skriptsassign-iperfordert die folgenden Details:

  • Floating IP: Das erste Argument für das Skript, die Floating IP, die zugewiesen wird

  • Droplet ID: Das zweite Argument für das Skript, die Droplet-ID, der die Floating IP zugewiesen werden soll

  • DigitalOcean PAT (API token): Als UmgebungsvariableDO_TOKEN übergeben, Ihre Lese- / Schreib-DigitalOcean-PAT

Lesen Sie den Inhalt des Skripts, bevor Sie fortfahren.

Jetzt können wir den Dienstfloatiperstellen.

Erstellen Sie den Service vonfloatip

Um den Dienstfloatipzu erstellen, müssen wir lediglich ein Init-Skript erstellen, das das zuvor erstellte Skriptassign-ipaufruft und auf die Unterbefehlestart undstopreagiert. Dieses Init-Skript ist dafür verantwortlich, die Droplet-ID des Servers über den Droplet-Metadaten-Dienst zu ermitteln. Außerdem sind die neu zugewiesene Floating-IP-Adresse und das DigitalOcean-API-Token (das im Abschnitt "Voraussetzungen" genannte Token für den persönlichen Zugriff) erforderlich.

Fügen Sie aufboth servers offene/etc/init.d/floatip in einem Editor hinzu:

sudo nano /etc/init.d/floatip

Kopieren Sie anschließend dieses Init-Skript und fügen Sie es ein. Ersetzen Sie dabei die hervorgehobenen Teile durch Ihren DigitalOcean-API-Schlüssel und die Floating-IP, die neu zugewiesen werden soll:

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN='your_DO_API_token'
IP='your_floating_IP_address'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)

if [ "start" == "$param" ] ; then
  python /usr/local/bin/assign-ip $IP $ID
  exit 0
elif [ "stop" == "$param" ] ; then
  exit 0;
elif [ "status" == "$param" ] ; then
  exit 0;
else
  echo "no such command $param"
  exit 1;
fi

Speichern und schließen Sie die Datei.

Machen Sie das Skript ausführbar:

sudo chmod u+x /etc/init.d/floatip

Wenn dieserfloatip-Dienst gestartet wird, ruft er einfach das Python-Skriptassign-ipauf und weist dem Droplet, das das Skript ausgeführt hat, die angegebene Floating-IP zu. Dies ist das Skript, das vom Server vonsecondaryaufgerufen wird, wenn der Server vonprimaryausfällt, um die Floating IP sich selbst neu zuzuweisen. Ebenso wird das gleiche Skript vomprimary-Server verwendet, um die Floating IP zurückzugewinnen, sobald sie wieder dem Cluster beitritt.

Starten Sie Heartbeat

Nachdem Heartbeat konfiguriert und alle Skripte eingerichtet wurden, auf die es sich stützt, können wir den Heartbeat-Cluster starten!

Führen Sie aufboth servers diesen Befehl aus, um Heartbeat zu starten:

sudo systemctl start heartbeat

Unser HA-Setup ist jetzt abgeschlossen! Bevor Sie fortfahren, sollten Sie testen, ob es wie beabsichtigt funktioniert.

Testen Sie die Hochverfügbarkeit

Es ist wichtig zu testen, ob ein Hochverfügbarkeits-Setup funktioniert. Lassen Sie uns das jetzt tun.

Derzeit wird die Floating IP dem Knotenprimaryzugewiesen. Wenn Sie jetzt über die IP-Adresse oder den darauf zeigenden Domänennamen auf die Floating IP zugreifen, wird einfach die Indexseite desprimary-Servers angezeigt. Wenn Sie das Beispiel-Benutzerdatenskript verwendet haben, sieht es ungefähr so ​​aus:

Floating IP is pointing to primary serverDroplet: primary, IP Address: 198.51.100.5

Dies zeigt an, dass die Floating-IP tatsächlich dem primären Droplet zugewiesen ist.

Öffnen Sie nun ein lokales Terminal und verwenden Siecurl, um in einer 1-Sekunden-Schleife auf die Floating IP zuzugreifen. Verwenden Sie dazu diesen Befehl. Ersetzen Sie jedoch die URL durch Ihre Domain oder Floating-IP-Adresse:

while true; do curl http://example.com; sleep 1; done

Derzeit werden derselbe Droplet-Name und die IP-Adresse des Primärservers ausgegeben. Wenn der primäre Server ausfällt, indem er ausgeschaltet oder der Heartbeat-Dienst gestoppt wird, wird geprüft, ob die Floating-IP dem sekundären Server neu zugewiesen wird.

Starten wir jetzt den Server vonprimaryneu. Tun Sie dies über die DigitalOcean-Systemsteuerung oder indem Sie diesen Befehl auf dem Primärserver ausführen:

sudo reboot

Nach einigen Augenblicken sollte der Primärserver nicht mehr verfügbar sein. Achten Sie auf die Ausgabe dercurl-Schleife, die im Terminal ausgeführt wird. Sie sollten eine Ausgabe bemerken, die so aussieht:

curl loop output:Droplet: primary, IP Address: 198.51.100.5
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 198.51.100.6
Droplet: secondary, IP Address: 198.51.100.6
...

Das heißt, die Floating-IP-Adresse sollte neu zugewiesen werden, um auf die IP-Adresse dessecondary-Servers zu verweisen. Das bedeutet, dass Ihr HA-Setup funktioniert, da ein erfolgreiches automatisches Failover stattgefunden hat.

Möglicherweise wird der FehlerConnection refusedangezeigt, der auftreten kann, wenn Sie versuchen, zwischen dem Ausfall des Primärservers und dem Abschluss der Neuzuweisung der Floating IP auf die Floating IP zuzugreifen.

Jetzt können Sie Ihrprimary Droplet über die DigitalOcean-Systemsteuerung einschalten. Da Heartbeat mit dem primären Droplet alspreferred host konfiguriert ist, um das Floating IP-Neuzuweisungsskript auszuführen, zeigt die Floating IP automatisch auf den Primärserver zurück, sobald es wieder verfügbar ist.

Fazit

Herzliche Glückwünsche! Sie haben jetzt ein grundlegendes HA-Server-Setup mit Heartbeat und einer DigitalOcean Floating IP.

Wenn Sie ein robusteres HA-Setup erstellen möchten, sollten SieCorosync and Pacemaker oderKeepalived verwenden.

In diesem Beispiel haben wir Nginx als Basis-Load-Balancer installiert. Wenn Sie jedoch Ihr Heartbeat-Setup mithilfe eines Reverse-Proxy-Load-Balancers verbessern möchten, können Sie dies tun, indem Sie entwederNginx als eins konfigurieren oder HAProxy verwenden.

Beachten Sie bitte, dass Sie bei beiden Alternativen Ihren Load Balancer / Reverse-Proxy ananchor IP address binden möchten, damit Ihre Benutzer nur über die Floating IP-Adresse (und nicht über) auf Ihre Server zugreifen können die öffentliche IP-Adresse jedes Servers).