Einführung
Heartbeat ist ein Open-Source-Programm, das Client-Servern Cluster-Infrastrukturfunktionen (Cluster-Mitgliedschaft und Messaging) zur Verfügung stellt. Dies ist eine wichtige Komponente in einer Hochverfügbarkeitsserverinfrastruktur (HA). Heartbeat wird normalerweise in Verbindung mit einem Cluster Resource Manager (CRM) wie Pacemaker verwendet, um eine vollständige HA-Einrichtung zu erzielen. In diesem Lernprogramm wird jedoch gezeigt, wie Sie ein HA-Server-Setup mit zwei Knoten erstellen, indem Sie einfach Heartbeat und eine DigitalOcean Floating IP verwenden.
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 14.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 Tutorial behandelt nur das Einrichten der aktiven / passiven Hochverfügbarkeit auf Gateway-Ebene. Das heißt, es enthält die Floating IP und dieload balancer-Server - Primär und Sekundär. Anstatt zu Demonstrationszwecken Reverse-Proxy-Load-Balancer auf jedem Server zu konfigurieren, konfigurieren wir sie einfach so, dass sie mit ihrem jeweiligen Hostnamen und ihrer öffentlichen IP-Adresse antworten.
#
Um dieses Ziel zu erreichen, folgen wir diesen Schritten:
-
Erstelle 2 Tröpfchen, die Verkehr erhalten
-
Erstellen Sie Floating IP und weisen Sie es einem der Droplets zu
-
DNS erstellen Ein Eintrag, der auf 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
Voraussetzungen
Um die Floating IP-Neuzuweisung zu automatisieren, müssen wir die DigitalOcean-API verwenden. Dies bedeutet, dass Sie ein persönliches Zugriffstoken (PAT) generieren müssen, ein API-Token, mit dem Sie sich bei Ihrem DigitalOcean-Konto authentifizieren können. Der Zugriff erfolgt mitread undwrite, indem SieHow To Generate a Personal Access Tokenfolgen ) s Abschnitt des API-Tutorials. Ihr PAT wird in einem Skript verwendet, das zu beiden Servern in Ihrem Cluster hinzugefügt wird. Bewahren Sie es daher an einem sicheren Ort auf, da es den vollständigen Zugriff auf Ihr DigitalOcean-Konto ermöglicht.
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 eine echte Einrichtung sollten Ihre Server einen Webserver oder einen Load Balancer Ihrer Wahl ausführen.
Erstellen Sie zwei Ubuntu 14.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 > /usr/share/nginx/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 Seitenmenü 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 in/etc/ha.d
auf beiden Servern identisch 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.
Wir müssen auch die Netzwerkschnittstelle und die IP-Adresse ermitteln, über die jeder Knoten mit dem Rest des Clusters kommuniziert, um festzustellen, welche Knoten verfügbar sind. 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 104.236.6.11/18 brd 104.236.63.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 verwendenvi
:
sudo vi /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 vonprimary104.236.6.11
und die IP-Adresse vonsecondary104.236.6.22
:
node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22
Speichern und schließen. 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 example:auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa
Stellen Sie sicher, dass die Datei nur von root 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
Beide Server sollten 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 verwendenvi
:
sudo vi /etc/ha.d/haresources
Fügen Sie nun diese Zeile zur Datei hinzu und ersetzen Sie sie durch den Namen Ihres primären Knotens:
/etc/ha.d/haresources
primary floatip
Speichern und schließen. 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
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 einen Floatip-Service
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 vi /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='b7d03a6947b217efb6f3ec3bd3504582'
IP='45.55.96.8'
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.
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 vomsecondary-Server aufgerufen wird, um die Floating IP sich selbst neu zuzuweisen, wenn derprimary-Server ausfällt. 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 service heartbeat start
Sie sollten die Ausgabe so sehen:
Heartbeat output:Starting High-Availability services: Done.
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: 104.236.6.11
Dies zeigt an, dass die Floating-IP tatsächlich dem primären Droplet zugewiesen ist.
Öffnen wir nun ein Terminal und verwendencurl
, 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.
Schalten Sie jetzt denprimary-Server aus. Tun Sie dies über die DigitalOcean-Systemsteuerung oder indem Sie diesen Befehl auf dem Primärserver ausführen:
sudo poweroff
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: 104.236.6.11
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 104.236.6.22
Droplet: secondary, IP Address: 104.236.6.22
...
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.
Wenn Sie Ihr Heartbeat-Setup erweitern möchten, müssen Sie im nächsten Schritt das Beispiel-Nginx-Setup durch einen Reverse-Proxy-Load-Balancer ersetzen. Zu diesem Zweck können Sie Nginx oder HAProxy verwenden. Beachten Sie, dass Sie Ihren Load Balancer ananchor IP address binden möchten, damit Ihre Benutzer nur über die Floating-IP-Adresse (und nicht über die öffentliche IP-Adresse jedes Servers) auf Ihre Server zugreifen können.