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).
[.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.
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:
-
ha.cf
- Globale Konfiguration des Heartbeat-Clusters einschließlich seiner Mitgliedsknoten -
authkeys
- Enthält einen Sicherheitsschlüssel, mit dem Knoten sich beim Cluster authentifizieren können -
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 vonauthkeys
festlegen:
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 vonfloatip
konfiguriert, der derzeit nicht definiert ist. Richten wir als nächstes den Dienstfloatip
ein.
Erstellen Sie einen Floating IP-Neuzuweisungsdienst
Unser Heartbeat-Cluster ist so konfiguriert, dass der Dienstfloatip
verwaltet 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-ip
herunter:
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-ip
erfordert 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 Umgebungsvariable
DO_TOKEN
übergeben, Ihre Lese- / Schreib-DigitalOcean-PAT
Lesen Sie den Inhalt des Skripts, bevor Sie fortfahren.
Jetzt können wir den Dienstfloatip
erstellen.
Erstellen Sie den Service vonfloatip
Um den Dienstfloatip
zu erstellen, müssen wir lediglich ein Init-Skript erstellen, das das zuvor erstellte Skriptassign-ip
aufruft und auf die Unterbefehlestart
undstop
reagiert. 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-ip
auf 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 refused
angezeigt, 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).