So richten Sie hochverfügbare Webserver mit dauerhaften und unverankerten IP-Adressen unter Ubuntu 14.04 ein

Einführung

Hochverfügbarkeit ist eine Funktion des Systemdesigns, die es einer Anwendung ermöglicht, die Arbeit bei einem Ausfall automatisch neu zu starten oder auf ein anderes fähiges System umzuleiten. In Bezug auf Server sind einige unterschiedliche Technologien erforderlich, um ein hochverfügbares System einzurichten. Es muss eine Komponente vorhanden sein, die die Arbeit umleiten kann, und es muss ein Mechanismus zur Überwachung auf Fehler und zum Übergang des Systems vorhanden sein, wenn eine Unterbrechung festgestellt wird.

Der Daemonkeepalived kann verwendet werden, um Dienste oder Systeme zu überwachen und bei Problemen automatisch ein Failover in einen Standby-Modus durchzuführen. In diesem Handbuch wird gezeigt, wie Sie mitkeepalived einen hochverfügbaren Webdienst einrichten. Wir werdenfloating IP address konfigurieren, die zwischen zwei fähigen Webservern verschoben werden können. Wenn der primäre Server ausfällt, wird die Floating-IP automatisch auf den zweiten Server verschoben, sodass der Dienst fortgesetzt werden kann.

Voraussetzungen

Um dieses Handbuch zu vervollständigen, müssen Sie zwei Ubuntu 14.04-Server in Ihrem DigitalOcean-Konto erstellen. Beide Server müssen sich im selben Datencenter befinden und das private Netzwerk muss aktiviert sein.

Auf jedem dieser Server benötigen Sie einen Nicht-Root-Benutzer, der mitsudoZugriff konfiguriert ist. Sie können unserenUbuntu 14.04 initial server setup guide folgen, um zu erfahren, wie Sie diese Benutzer einrichten.

Wenn Sie bereit sind, melden Sie sich bei beiden Servern mit Ihrem Nicht-Root-Benutzer an.

Installieren und konfigurieren Sie Nginx

Währendkeepalived häufig zur Überwachung und zum Failover von Load Balancern verwendet wird, verwenden wir in diesem Handbuch Nginx als einfachen Webserver, um die Komplexität des Betriebs zu verringern.

Aktualisieren Sie zunächst den lokalen Paketindex auf jedem Ihrer Server. Wir können dann Nginx installieren:

sudo apt-get update
sudo apt-get install nginx

In den meisten Fällen möchten Sie für ein hochverfügbares Setup, dass beide Server genau den gleichen Inhalt bereitstellen. Aus Gründen der Übersichtlichkeit verwenden wir in diesem Handbuch jedoch Nginx, um anzugeben, welcher der beiden Server zu einem bestimmten Zeitpunkt unsere Anforderungen erfüllt. Zu diesem Zweck ändern wir die Standardseiteindex.htmlauf jedem unserer Hosts. Öffne die Datei jetzt:

sudo nano /usr/share/nginx/html/index.html

Ersetzen Sie auf Ihrem ersten Server den Inhalt der Datei durch Folgendes:

/Usr/share/nginx/html/index.html des Primärservers

Primary

Ersetzen Sie auf Ihrem zweiten Server den Inhalt der Datei durch Folgendes:

/Usr/share/nginx/html/index.html des sekundären Servers

Secondary

Speichern und schließen Sie die Dateien, wenn Sie fertig sind.

Erstellen und installieren Sie Keepalived

Als nächstes installieren wir den Daemonkeepalived auf unseren Servern. Es gibt eine Version vonkeepalived in den Standard-Repositorys von Ubuntu, diese ist jedoch veraltet und weist einige Fehler auf, die verhindern, dass unsere Konfiguration funktioniert. Stattdessen installieren wir die neueste Version vonkeepalived aus dem Quellcode.

Bevor wir beginnen, sollten wir die Abhängigkeiten ermitteln, die wir zum Erstellen der Software benötigen. Das Meta-Paketbuild-essentialbietet die erforderlichen Kompilierungswerkzeuge, während das Paketlibssl-devdie SSL-Bibliotheken enthält, für diekeepalived erstellt werden muss:

sudo apt-get install build-essential libssl-dev

Sobald die Abhängigkeiten vorhanden sind, können wir den Tarball fürkeepalived herunterladen. Besuchen Siethis page, um die neueste Version der Software zu finden. Klicken Sie mit der rechten Maustaste auf die neueste Version und kopieren Sie die Linkadresse. Wechseln Sie auf Ihren Servern in Ihr Ausgangsverzeichnis und verwenden Siewget, um den von Ihnen kopierten Link abzurufen:

cd ~
wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

Verwenden Sie den Befehltar, um das Archiv zu erweitern, und wechseln Sie dann in das resultierende Verzeichnis:

tar xzvf keepalived*
cd keepalived*

Erstellen und installieren Sie den Daemon, indem Sie Folgendes eingeben:

./configure
make
sudo make install

Der Dämon sollte jetzt auf dem System installiert sein.

Erstellen Sie ein Keepalived-Upstart-Skript

Durch die Installation vonkeepalivedwurden alle Binärdateien und unterstützenden Dateien auf unserem System verschoben. Ein Teil, der jedoch nicht enthalten war, war ein Upstart-Skript für unsere Ubuntu 14.04-Systeme.

Wir können ein sehr einfaches Upstart-Skript erstellen, das den Dienst vonkeepalivedverarbeiten kann. Öffnen Sie eine Datei mit dem Namenkeepalived.conf im Verzeichnis/etc/init, um loszulegen:

sudo nano /etc/init/keepalived.conf

Im Inneren können wir mit einer einfachen Beschreibung der Funktionalität beginnen, diekeepalived bietet. Wir verwenden die Beschreibung auf der Seite mit dem enthaltenenman. Als nächstes geben wir die Runlevel an, in denen der Dienst gestartet und gestoppt werden soll. Wir möchten, dass dieser Dienst unter allen normalen Bedingungen aktiv ist (Runlevel 2-5) und für alle anderen Runlevel angehalten wird (wenn beispielsweise ein Neustart, ein Ausschalten oder ein Einzelbenutzermodus eingeleitet wird):

/etc/init/keepalived.conf

description "load-balancing and high-availability service"

start on runlevel [2345]
stop on runlevel [!2345]

Da dieser Service für die Verfügbarkeit unseres Web-Service von entscheidender Bedeutung ist, möchten wir diesen Service im Falle eines Fehlers neu starten. Wir können dann die tatsächlicheexec-Zeile angeben, mit der der Dienst gestartet wird. Wir müssen die Option--dont-fork hinzufügen, damit Upstart diepid korrekt verfolgen kann:

/etc/init/keepalived.conf

description "load-balancing and high-availability service"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec /usr/local/sbin/keepalived --dont-fork

Speichern und schließen Sie die Dateien, wenn Sie fertig sind.

Erstellen Sie die Keepalived-Konfigurationsdatei

Mit unserer Upstart-Datei können wir nun mit der Konfiguration vonkeepalived fortfahren.

Der Dienst sucht nach seinen Konfigurationsdateien im Verzeichnis/etc/keepalived. Erstellen Sie dieses Verzeichnis jetzt auf beiden Servern:

sudo mkdir -p /etc/keepalived

Erfassung der privaten IP-Adressen Ihrer Server

Bevor wir die Konfigurationsdatei erstellen, müssen wir die privaten IP-Adressen unserer beiden Server ermitteln. Auf DigitalOcean-Servern können Sie unsere private IP-Adresse über den Metadatendienst abrufen, indem Sie Folgendes eingeben:

curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
Output10.132.7.107

Dies kann auch mit den Tools voniproute2durch Eingabe von:

ip -4 addr show dev eth1

Den gewünschten Wert finden Sie hier:

Output3: eth1:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.132.7.107/16 brd 10.132.255.255 scope global eth1
       valid_lft forever preferred_lft forever

Kopieren Sie diesen Wert von beiden Systemen. Wir müssen auf diese Adressen in unseren Konfigurationsdateien unten verweisen.

Konfiguration des Primärservers erstellen

Erstellen Sie als Nächstes auf Ihrem Primärserver die Hauptkonfigurationsdateikeepalived. Der Dämon sucht im Verzeichnis/etc/keepalivednach einer Datei mit dem Namenkeepalived.conf:

sudo nano /etc/keepalived/keepalived.conf

Im Inneren definieren wir zunächst einen Gesundheitscheck für unseren Nginx-Service, indem wir einenvrrp_script-Block öffnen. Dadurch kannkeepalived unseren Webserver auf Fehler überwachen, um zu signalisieren, dass der Prozess ausgefallen ist, und mit den Wiederherstellungsmaßnahmen beginnen.

Unsere Prüfung wird sehr einfach sein. Alle zwei Sekunden überprüfen wir, ob ein Prozess namensnginx immer nochpid beansprucht:

/Etc/keepalived/keepalived.conf des Primärservers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

Als nächstes öffnen wir einen Block namensvrrp_instance. Dies ist der Hauptkonfigurationsabschnitt, der definiert, wiekeepalived Hochverfügbarkeit implementiert.

Wir beginnen damit,keepalived anzuweisen, mit seinen Kollegen übereth1, unsere private Schnittstelle, zu kommunizieren. Da wir unseren Primärserver konfigurieren, setzen wir die Konfiguration vonstateauf "MASTER". Dies ist der Anfangswert, denkeepalived verwendet, bis der Dämon seinen Peer kontaktieren und eine Wahl abhalten kann.

Während der Wahl wird mit der Optionpriorityentschieden, welches Mitglied gewählt wird. Die Entscheidung basiert einfach darauf, welcher Server die höchste Nummer für diese Einstellung hat. Wir werden "200" für unseren Primärserver verwenden:

/Etc/keepalived/keepalived.conf des Primärservers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    priority 200


}

Als Nächstes weisen wir eine ID für diese Clustergruppe zu, die von beiden Knoten gemeinsam genutzt wird. Wir werden für dieses Beispiel "33" verwenden. Wir müssenunicast_src_ip auf die private IP-Adresse unseresprimary-Servers setzen, die wir zuvor abgerufen haben. Wir setzenunicast_peer auf die private IP-Adresse unseressecondary-Servers:

/Etc/keepalived/keepalived.conf des Primärservers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    priority 200

    virtual_router_id 33
    unicast_src_ip primary_private_IP
    unicast_peer {
        secondary_private_IP
    }


}

Als Nächstes können wir eine einfache Authentifizierung für diekeepalived-Dämonen einrichten, um miteinander zu kommunizieren. Dies ist nur eine grundlegende Maßnahme, um sicherzustellen, dass die fraglichen Server legitim sind. Erstellen Sie einenauthentication-Unterblock. Geben Sie im Inneren die Kennwortauthentifizierung an, indem Sieauth_type festlegen. Legen Sie für den Parameterauth_pass ein gemeinsames Geheimnis fest, das von beiden Knoten verwendet wird. Leider sind nur die ersten acht Zeichen von Bedeutung:

/Etc/keepalived/keepalived.conf des Primärservers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    priority 200

    virtual_router_id 33
    unicast_src_ip primary_private_IP
    unicast_peer {
        secondary_private_IP
    }

    authentication {
        auth_type PASS
        auth_pass password
    }


}

Als Nächstes weisen wirkeepalived an, die oben in der Datei erstellte Routine mit der Bezeichnungchk_nginx zu verwenden, um den Zustand des lokalen Systems zu bestimmen. Schließlich setzen wir einnotify_master-Skript, das immer dann ausgeführt wird, wenn dieser Knoten zum „Master“ des Paares wird. Dieses Skript ist für das Auslösen der Neuzuweisung der Floating-IP-Adresse verantwortlich. Wir werden dieses Skript gleich erstellen:

/Etc/keepalived/keepalived.conf des Primärservers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    priority 200

    virtual_router_id 33
    unicast_src_ip primary_private_IP
    unicast_peer {
        secondary_private_IP
    }

    authentication {
        auth_type PASS
        auth_pass password
    }

    track_script {
        chk_nginx
    }

    notify_master /etc/keepalived/master.sh
}

Speichern und schließen Sie die Datei, nachdem Sie die obigen Informationen eingerichtet haben.

Konfiguration des Sekundärservers erstellen

Als Nächstes erstellen wir das Begleitskript auf unserem sekundären Server. Öffnen Sie eine Datei bei/etc/keepalived/keepalived.conf auf Ihrem sekundären Server:

sudo nano /etc/keepalived/keepalived.conf

Im Inneren entspricht das Skript, das wir verwenden, weitgehend dem Skript des Primärservers. Folgende Elemente müssen geändert werden:

  • state: Dies sollte auf dem sekundären Server in "BACKUP" geändert werden, damit der Knoten vor den Wahlen in den Sicherungsstatus initialisiert wird.

  • priority: Dies sollte auf einen niedrigeren Wert als der Primärserver eingestellt werden. In diesem Handbuch wird der Wert "100" verwendet.

  • unicast_src_ip: Dies sollte die private IP-Adresse dessecondary-Servers sein.

  • unicast_peer: Dies sollte die private IP-Adresse desprimary-Servers enthalten.

Wenn Sie diese Werte ändern, sollte das Skript für den sekundären Server folgendermaßen aussehen:

/Etc/keepalived/keepalived.conf des sekundären Servers

vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    interface eth1
    state BACKUP
    priority 100

    virtual_router_id 33
    unicast_src_ip secondary_private_IP
    unicast_peer {
        primary_private_IP
    }

    authentication {
        auth_type PASS
        auth_pass password
    }

    track_script {
        chk_nginx
    }

    notify_master /etc/keepalived/master.sh
}

Speichern und schließen Sie die Datei, nachdem Sie das Skript eingegeben und die entsprechenden Werte geändert haben.

Erstellen Sie die Floating IP Transition Scripts

Als Nächstes müssen wir ein Paar Skripte erstellen, mit denen wir die schwebende IP-Adresse dem aktuellen Droplet neu zuweisen können, wenn die lokalekeepalived-Instanz zum Master-Server wird.

Laden Sie das Floating IP Assignment Script herunter

Zunächst laden wir ein generisches Python-Skript herunter (geschrieben vonDigitalOcean community manager), mit dem eine schwebende IP-Adresse mithilfe der DigitalOcean-API einem Droplet neu zugewiesen werden kann. Wir sollten diese Datei in das Verzeichnis/usr/local/binherunterladen:

cd /usr/local/bin
sudo curl -LO http://do.co/assign-ip

Mit diesem Skript können Sie eine vorhandene unverankerte IP-Adresse neu zuweisen, indem Sie Folgendes ausführen:

python /usr/local/bin/assign-ip floating_ip droplet_ID

Dies funktioniert nur, wenn für eine Umgebungsvariable namensDO_TOKENein gültiges DigitalOcean-API-Token für Ihr Konto festgelegt ist.

Erstellen Sie ein DigitalOcean-API-Token

Um das obige Skript verwenden zu können, müssen wir ein DigitalOcean-API-Token in unserem Konto erstellen.

Klicken Sie in der Systemsteuerung oben auf den Link „API“. Klicken Sie auf der rechten Seite der API-Seite auf "Neues Token erstellen":

DigitalOcean generate API token

Wählen Sie auf der nächsten Seite einen Namen für Ihr Token und klicken Sie auf die Schaltfläche "Token generieren":

DigitalOcean make new token

Auf der API-Seite wird Ihr neues Token angezeigt:

DigitalOcean token

Kopieren Sie das Tokennow. Aus Sicherheitsgründen kann dieses Token später nicht mehr angezeigt werden. Wenn Sie dieses Token verlieren, müssen Sie es zerstören und ein neues erstellen.

Konfigurieren Sie eine Floating IP für Ihre Infrastruktur

Als Nächstes werden wir eine Floating-IP-Adresse erstellen und zuweisen, die für unsere Server verwendet wird.

Klicken Sie in der DigitalOcean-Systemsteuerung auf die Registerkarte "Netzwerk" und wählen Sie das Navigationselement "Floating IPs". Wählen Sie das Droplet aus der Liste aus, die Sie als "primären" Server zugewiesen haben:

DigitalOcean add floating IP

Eine neue Floating-IP-Adresse wird in Ihrem Konto erstellt und dem angegebenen Droplet zugewiesen:

DigitalOcean floating IP assigned

Wenn Sie die Floating-IP in Ihrem Webbrowser besuchen, sollte die Seiteindex.htmldes „primären“ Servers angezeigt werden:

DigitalOcean primary index.html

Kopieren Sie die Floating-IP-Adresse nach unten. Sie benötigen diesen Wert im folgenden Skript.

Erstellen Sie das Wrapper-Skript

Jetzt haben wir die Elemente, die wir zum Erstellen des Wrapper-Skripts benötigen, das unser/usr/local/bin/assign-ip-Skript mit den richtigen Anmeldeinformationen aufruft.

Erstellen Sie die Datei jetzt auf den Servern vonboth, indem Sie Folgendes eingeben:

sudo nano /etc/keepalived/master.sh

Beginnen Sie im Inneren mit dem Zuweisen und Exportieren einer Variablen namensDO_TOKEN, die das soeben erstellte API-Token enthält. Darunter können wir eine Variable namensIP zuweisen, die Ihre schwebende IP-Adresse enthält:

/etc/keepalived/master.sh

export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'

Als Nächstes werden wircurl verwenden, um den Metadatendienst nach der Droplet-ID des Servers zu fragen, auf dem wir uns gerade befinden. Dies wird einer Variablen namensID zugewiesen. Wir werden auch fragen, ob diesem Droplet derzeit die Floating-IP-Adresse zugewiesen ist. Wir werden die Ergebnisse dieser Anfrage in einer Variablen namensHAS_FLOATING_IP speichern:

/etc/keepalived/master.sh

export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)

Jetzt können wir die obigen Variablen verwenden, um das Skriptassign-ipaufzurufen. Das Skript wird nur aufgerufen, wenn die Floating-IP noch nicht mit unserem Droplet verknüpft ist. Dies hilft, API-Aufrufe zu minimieren und Konflikte bei Anfragen an die API zu vermeiden, wenn der Masterstatus schnell zwischen Ihren Servern wechselt.

Um Fälle zu behandeln, in denen auf der schwebenden IP bereits ein Ereignis ausgeführt wird, wiederholen wir das Skriptassign-ipeinige Male. Im Folgenden wird versucht, das Skript zehnmal mit einem Intervall von drei Sekunden zwischen den einzelnen Aufrufen auszuführen. Die Schleife wird sofort beendet, wenn der Floating IP Move erfolgreich ist:

/etc/keepalived/master.sh

export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)

if [ $HAS_FLOATING_IP = "false" ]; then
    n=0
    while [ $n -lt 10 ]
    do
        python /usr/local/bin/assign-ip $IP $ID && break
        n=$((n+1))
        sleep 3
    done
fi

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Jetzt müssen wir nur noch das Skript ausführbar machen, damitkeepalived es aufrufen kann:

sudo chmod +x /etc/keepalived/master.sh

Starten Sie den Keepalived-Dienst und testen Sie das Failover

Derkeepalived-Daemon und alle zugehörigen Skripte sollten jetzt vollständig konfiguriert sein. Wir können den Service auf beiden Maschinen starten, indem wir Folgendes eingeben:

sudo start keepalived

Der Dienst sollte auf jedem Server gestartet werden und sich mit seinem Peer in Verbindung setzen, um sich mit dem von uns konfigurierten gemeinsamen Geheimnis zu authentifizieren. Jeder Daemon überwacht den lokalen Nginx-Prozess und hört Signale vom Remote-Prozesskeepalivedab.

Wenn beide Server fehlerfrei sind und Sie Ihre Floating-IP in Ihrem Webbrowser aufrufen, sollten Sie zur Nginx-Seite des Primärservers weitergeleitet werden:

DigitalOcean primary index.html

Jetzt können wir die Failover-Funktionen unserer Konfiguration testen.

Ein Failover sollte erfolgen, wenn eine der folgenden Bedingungen eintritt:

  • When the Nginx health check on the primary server indicates that Nginx is no longer running. In diesem Fall wechselt derkeepalived-Dämon des Primärservers in den Status "Fehler". Es benachrichtigt den sekundären Server, dass er in den Master-Status wechseln und die Floating-IP beanspruchen soll.

  • When the secondary server loses its keepalived connection to the primary server. Wenn der sekundäre Server den primären Server aus irgendeinem Grund nicht erreichen kann, wechselt er in den Status „Master“ und versucht, die Floating-IP zu beanspruchen.

Wenn der primäre Server später wiederhergestellt wird, kehrt er in den Master-Status zurück und fordert die unverankerte IP zurück, da er eine neue Wahl initiiert (er hat weiterhin die höchste Prioritätsnummer).

Testen des Nginx-Fehlers

Wir können die erste Bedingung testen, indem wir den Nginx-Dienst auf dem Primärserver stoppen:

sudo service nginx stop

Wenn Sie Ihren Webbrowser aktualisieren, erhalten Sie möglicherweise zunächst eine Antwort, die darauf hinweist, dass die Seite nicht verfügbar ist:

DigitalOcean page not available

Wenn Sie die Seite jedoch einige Male aktualisieren, werden Sie nach wenigen Sekunden feststellen, dass der Sekundärserver die Floating-IP-Adresse beansprucht hat:

DigitalOcean secondary index.html

Wir können den Fehler beheben, indem wir den Nginx-Daemon auf dem Primärserver neu starten:

sudo service nginx start

Nach ein paar Sekunden, wenn Sie die Seite aktualisieren, werden Sie feststellen, dass der primäre Server wieder den Besitz der Floating-IP zurückerlangt hat:

DigitalOcean primary index.html

Testen des Serverausfalls

Das andere Szenario, das wir testen sollten, ist, ob die Sekundärseite korrekt in den Master-Status übergeht, wenn sie keine Verbindung zum Primärserver herstellen kann. Wir können den Master-Server neu starten, um dies zu testen:

sudo reboot

Wieder sollten wir zuerst eine Dienstunterbrechung an der schwebenden IP-Adresse sehen:

DigitalOcean page not available

Einige Sekunden später nimmt der sekundäre Server die Anforderungen auf:

DigitalOcean secondary index.html

Einen Moment später, wenn der primäre Server den Neustart abgeschlossen hat, wird die IP-Adresse zurückgefordert:

DigitalOcean primary index.html

Dies bestätigt unser zweites Fehlerszenario.

Fazit

In diesem Handbuch haben wir eine hochverfügbare Webserverumgebung mitkeepalived, der DigitalOcean-API und einer schwebenden IP-Adresse konfiguriert. Die eigentliche Infrastruktur war recht einfach, aber die Konzepte können auf jede Art von Infrastruktur angewendet werden, bei der Serviceverfügbarkeit und Betriebszeit wichtig sind.