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

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

Active/passive Diagram

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

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 in/etc/ha.d auf beiden Servern identisch 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.

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 vonauthkeysfestlegen:

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

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 einen Floatip-Service

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

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.

Related