Erstellen eines Hochverfügbarkeits-Setups mit Pacemaker, Corosync und Floating IPs unter CentOS 7

Einführung

Corosync ist eine Open Source-Cluster-Engine, mit der Hochverfügbarkeit in Anwendungen implementiert wird. Corosync wird allgemein alsmessaging layer bezeichnet und bietet eine Cluster-Mitgliedschaft und ein geschlossenes Kommunikationsmodell zum Erstellen replizierter Zustandsautomaten, auf denen Cluster-Ressourcenmanager wie Pacemaker ausgeführt werden können. Corosync kann als das zugrunde liegende System angesehen werden, das die Clusterknoten miteinander verbindet, während Pacemaker den Cluster überwacht und bei einem Ausfall Maßnahmen ergreift.

Dieses Tutorial zeigt, wie Sie mit Corosync und Pacemaker eine Hochverfügbarkeitsinfrastruktur (HA) auf DigitalOcean mit CentOS 7-Servern und Floating IPs erstellen. Um das Einrichten und Verwalten der Clusterknoten zu vereinfachen, verwenden wir PCS, eine Befehlszeilenschnittstelle, die sowohl mit Corosync als auch mit Pacemaker interagiert.

Voraussetzungen

Um dieser Anleitung zu folgen, benötigen Sie:

Verwenden Sie beim Erstellen dieser Droplets beschreibende Hostnamen, um sie eindeutig zu identifizieren. In diesem Tutorial werden diese Tröpfchen alsprimary undsecondary bezeichnet.

Wenn Sie bereit sind, fortzufahren, stellen Sie sicher, dass Sie mit dem Benutzer Ihressudoan beiden Servern angemeldet sind.

[[Schritt-1 -—- Nginx einrichten]] == Schritt 1 - Nginx einrichten

Um die Arbeit zu beschleunigen, verwenden wir ein einfachesshell script, das Nginx installiert und eine grundlegende Webseite mit Informationen zu diesem bestimmten Server erstellt. Auf diese Weise können wir in unserem Floating IP-Setup leicht erkennen, welcher Server gerade aktiv ist. Das Skript verwendetMetadata servicevon DigitalOcean, um die IP-Adresse und den Hostnamen des Droplets abzurufen.

Führen Sie die folgenden Befehle auf beiden Servern aus, um das Skript auszuführen:

sudo curl -L -o install.sh http://do.co/nginx-centos
sudo chmod +x install.sh
sudo ./install.sh

Wenn Sie nach Beendigung des Skripts über die öffentliche IP-Adresse eines Browsers auf eines der Droplets zugreifen, wird eine einfache Webseite mit dem Hostnamen und der IP-Adresse des Droplets angezeigt.

Um die Komplexität dieses Tutorials zu verringern, verwenden wir einfache Webserver als Clusterknoten. In einer Produktionsumgebung werden die Knoten normalerweise so konfiguriert, dass sie als redundante Load Balancer fungieren. Weitere Informationen zu Load Balancern finden Sie in unseremIntroduction to HAProxy and Load Balancing Concepts-Handbuch.

[[Schritt-2 - Erstellen und Zuweisen von Floating-IP]] == Schritt 2 - Erstellen und Zuweisen von Floating-IP

Der erste Schritt besteht darin, eine Floating IP zu erstellen und sie dem Server vonprimaryzuzuweisen. Klicken Sie in der DigitalOcean-Systemsteuerung im oberen Menü aufNetworking und im Seitenmenü aufFloating IPs.

Sie sollten eine Seite wie diese sehen:

Floating IPs Control Panel

Wählen Sie den Server Ihresprimaryaus und klicken Sie auf die Schaltfläche "Floating IP zuweisen". Überprüfen Sie nach der Zuweisung der Floating IP, ob Sie dasprimary Droplet erreichen können, indem Sie über Ihren Browser auf die Floating IP-Adresse zugreifen:

http://your_floating_ip

Sie sollten die Indexseite Ihres primären Droplets sehen.

[[Schritt-3 -—- IP-Neuzuweisungsskript erstellen]] == Schritt 3 - IP-Neuzuweisungsskript erstellen

In diesem Schritt wird gezeigt, wie die DigitalOcean-API verwendet werden kann, um eine Floating-IP einem anderen Droplet zuzuweisen. Später werden wir Pacemaker so konfigurieren, dass dieses Skript ausgeführt wird, wenn der Cluster einen Fehler in einem der Knoten feststellt.

In unserem Beispiel verwenden wir ein einfaches Python-Skript, das eine Floating-IP-Adresse und eine Droplet-ID als Argumente verwendet, um die Floating-IP dem angegebenen Droplet zuzuweisen. Die ID des Droplets kann mithilfe des Metadaten-Dienstes aus dem Droplet selbst abgerufen werden.

Beginnen wir damit, das Skriptassign-ipherunterzuladen und ausführbar zu machen. Sie können den Inhalt des Skripts jederzeit überprüfen, bevor Sie es herunterladen.

Die folgenden zwei Befehle sollten fürboth servers (primär und sekundär) ausgeführt werden:

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

Das Skriptassign-ipbenötigt die folgenden Informationen, um ausgeführt zu werden:

  • 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 API Token: Als Umgebungsvariable DO_TOKEN übergeben, Ihr Lese- / Schreib-DigitalOcean Personal Access Token

Testen des IP-Neuzuweisungsskripts

Um die IP-Neuzuweisung zu überwachen, können wir den Befehlcurl verwenden, um in einer Schleife mit einem Intervall von 1 Sekunde zwischen jeder Anforderung auf die Floating IP-Adresse zuzugreifen.

Öffnen Sie ein neues lokales Terminal und führen Sie den folgenden Befehl aus. Stellen Sie dabei sicher, dass Siefloating_IP_address durch Ihre tatsächliche Floating-IP-Adresse ersetzen:

while true; do curl floating_IP_address; sleep 1; done

Dieser Befehl wird im aktiven Terminal so lange ausgeführt, bis er mitCTRL+C unterbrochen wird. Es wird einfach die Webseite abgerufen, die von dem Server gehostet wird, dem Ihre Floating IP derzeit zugewiesen ist. Die Ausgabe sollte folgendermaßen aussehen:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...

Führen Sie nun das Skriptassign-ipaus, um die Floating IP demsecondary-Tröpfchen neu zuzuweisen. Wir werden den Metadatendienst von DigitalOcean verwenden, um die aktuelle Droplet-ID abzurufen und als Argument für das Skript zu verwenden. Das Abrufen der Droplet-ID vom Metadaten-Service kann erfolgen mit:

curl -s http://169.254.169.254/metadata/v1/id

Wobei169.254.169.254 eine statische IP-Adresse ist, die vom Metadatendienst verwendet wird und daher nicht geändert werden sollte. Diese Informationen sind nur im Droplet selbst verfügbar.

Bevor wir das Skript ausführen können, müssen wir die UmgebungsvariableDO_TOKENfestlegen, die das DigitalOcean-API-Token enthält. Führen Sie den folgenden Befehl vomsecondary-Server aus und vergessen Sie nicht,your_api_token durch Ihr persönliches Lese- / Schreibzugriffstoken für die DigitalOcean-API zu ersetzen:

export DO_TOKEN=your_api_token

Führen Sie weiterhin auf dem Server vonsecondarydas Skriptassign-ipaus und ersetzen Siefloating_IP_address durch Ihre Floating IP-Adresse:

assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress

Wenn Sie die vom Befehlcurl auf Ihrem lokalen Terminal erzeugte Ausgabe überwachen, werden Sie feststellen, dass die Floating IP ihre zugewiesene IP-Adresse ändert und nach einigen Sekunden auf dassecondary-Tröpfchen zeigt:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address

Sie können auch über Ihren Browser auf die Floating-IP-Adresse zugreifen. Sie sollten eine Seite mit den Droplet-Informationen vonsecondaryerhalten. Dies bedeutet, dass das Neuzuweisungsskript wie erwartet funktioniert hat.

Um die Floating IP wieder dem Primärserver zuzuweisen, wiederholen Sie den zweistufigen Vorgang, diesmal jedoch aus demprimary Droplet:

export DO_TOKEN=your_api_token
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`

Nach einigen Sekunden sollte die Floating IP wieder auf Ihr primäres Droplet zeigen.

[[Schritt 4 - Installation von Corosync-Schrittmacher und PCs]] == Schritt 4 - Installation von Corosync, Schrittmacher und PCS

Der nächste Schritt besteht darin, Corosync, Pacemaker und PCS auf Ihren Droplets zu installieren. Da Corosync eine Abhängigkeit von Pacemaker darstellt, ist es normalerweise besser, Pacemaker einfach zu installieren und das System entscheiden zu lassen, welche Corosync-Version installiert werden soll.

Installieren Sie die Softwarepakete aufboth servers:

sudo yum install pacemaker pcs

Das PCS-Dienstprogramm erstellt während der Installation einen neuen Systembenutzer mit dem Namenhacluster mit einem deaktivierten Kennwort. Wir müssen auf beiden Servern ein Passwort für diesen Benutzer definieren. Dadurch kann PCS Aufgaben wie das Synchronisieren der Corosync-Konfiguration auf mehreren Knoten sowie das Starten und Stoppen des Clusters ausführen.

Führen Sie aufboth servers Folgendes aus:

passwd hacluster

Sie solltensame password auf beiden Servern verwenden. Wir werden dieses Kennwort verwenden, um den Cluster im nächsten Schritt zu konfigurieren.

[.note] #Der Benutzerhacluster hat keine interaktive Shell oder kein Ausgangsverzeichnis mit seinem Konto verknüpft. Dies bedeutet, dass es nicht möglich ist, sich mit seinen Anmeldeinformationen beim Server anzumelden.
#

[[Schritt-5 -—- Einrichten des Clusters]] == Schritt 5 - Einrichten des Clusters

Nachdem Corosync, Pacemaker und PCS auf beiden Servern installiert sind, können wir den Cluster einrichten.

PCS aktivieren und starten

Führen Sie zum Aktivieren und Starten des PCS-Dämons Folgendes aufboth servers aus:

sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service

Abrufen der privaten Netzwerk-IP-Adresse für jeden Knoten

Zur Verbesserung der Netzwerkleistung und -sicherheit sollten die Knoten mitprivate network verbunden werden. Der einfachste Weg, die private Netzwerk-IP-Adresse des Droplets zu erhalten, ist über den Metadaten-Dienst. Führen Sie auf jedem Server den folgenden Befehl aus:

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

Dieser Befehl gibt einfach die IP-Adresse des privaten Netzwerks des Droplets aus, bei dem Sie angemeldet sind. Sie finden diese Informationen auch auf der Seite Ihres Droplets in der DigitalOcean-Systemsteuerung (auf der RegisterkarteSettings).

Sammeln Sie die IP-Adresse des privaten Netzwerks aus beiden Droplets für die nächsten Schritte.

Authentifizierung der Clusterknoten

Authentifizieren Sie die Clusterknoten mit dem Benutzernamenhacluster und demselben Kennwort, das Sie in Schritt 3 definiert haben. Sie müssen die IP-Adresse des privaten Netzwerks für jeden Knoten angeben. Führen Sie auf dem Server vonprimaryFolgendes aus:

sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address

Sie sollten die Ausgabe folgendermaßen erhalten:

OutputUsername: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized

Generieren der Corosync-Konfiguration

Generieren Sie die Corosync-Konfigurationsdatei weiterhin auf demprimary-Server mit dem folgenden Befehl:

sudo pcs cluster setup --name webcluster \
primary_private_IP_address secondary_private_IP_address

Die Ausgabe sollte ungefähr so ​​aussehen:

OutputShutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop  pacemaker.service
Redirecting to /bin/systemctl stop  corosync.service
Killing any remaining services...
Removing all cluster configuration files...
primary_private_IP_address: Succeeded
secondary_private_IP_address: Succeeded
Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Restaring pcsd on the nodes in order to reload the certificates...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Dadurch wird eine neue Konfigurationsdatei generiert, die sich bei/etc/corosync/corosync.conf befindet, basierend auf den Parametern, die für den Befehlpcs cluster setup angegeben wurden. In diesem Beispiel haben wirwebcluster als Clusternamen verwendet, aber Sie können den Namen Ihrer Wahl verwenden.

Starten des Clusters

Führen Sie den folgenden Befehl auf dem Server vonprimaryaus, um den gerade eingerichteten Cluster zu starten:

sudo pcs cluster start --all
Outputprimary_private_IP_address: Starting Cluster...
secondary_private_IP_address: Starting Cluster...

Sie können nun überprüfen, ob beide Knoten dem Cluster beigetreten sind, indem Sie auf einem der Server den folgenden Befehl ausführen:

sudo pcs status corosync
OutputMembership information
----------------------
    Nodeid      Votes Name
         2          1 secondary_private_IP_address
         1          1 primary_private_IP_address (local)

Um weitere Informationen zum aktuellen Status des Clusters zu erhalten, können Sie Folgendes ausführen:

sudo pcs cluster status

Die Ausgabe sollte ungefähr so ​​aussehen:

OutputCluster Status:
 Last updated: Fri Dec 11 11:59:09 2015     Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
 Stack: corosync
 Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
 2 nodes and 0 resources configured
 Online: [ primary secondary ]

PCSD Status:
  primary (primary_private_IP_address): Online
  secondary (secondary_private_IP_address): Online

Jetzt können Sie die Dienstecorosync undpacemaker aktivieren, um sicherzustellen, dass sie beim Systemstart gestartet werden. Führen Sie aufboth servers Folgendes aus:

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service

STONITH deaktivieren

STONITH (Shoot The Other Node In The Head) ist eine Abschirmtechnik, die Datenbeschädigungen verhindert, die durch fehlerhafte Knoten in einem Cluster verursacht werden, die nicht mehr reagieren, aber dennoch auf Anwendungsdaten zugreifen. Da die Konfiguration von einer Reihe von Faktoren abhängt, die für dieses Handbuch nicht relevant sind, werden wir STONITH in unserem Cluster-Setup deaktivieren.

Führen Sie zum Deaktivieren von STONITH den folgenden Befehl für eines der primären oder sekundären Droplets aus:

sudo pcs property set stonith-enabled=false

[[Schritt-6 - Erstellen eines Floating-IP-Neuzuweisungs-Ressourcenagenten]] == Schritt 6 - Erstellen eines Floating-IP-Neuzuweisungs-Ressourcenagenten

Sie müssen lediglich den Ressourcenagenten konfigurieren, der das IP-Neuzuweisungsskript ausführt, wenn in einem der Clusterknoten ein Fehler festgestellt wird. Der Ressourcenagent ist dafür verantwortlich, eine Schnittstelle zwischen dem Cluster und der Ressource selbst zu erstellen. In unserem Fall ist die Ressource das Skript assign-ip. Der Cluster verlässt sich darauf, dass der Ressourcenagent die richtigen Prozeduren ausführt, wenn er einen Start-, Stopp- oder Überwachungsbefehl erhält. Es gibt verschiedene Arten von Ressourcenagenten, die häufigste ist jedoch der OCF-Standard (Open Cluster Framework).

Wir werden einen neuen OCF-Ressourcenagenten erstellen, um denassign-ip-Dienst auf beiden Servern zu verwalten.

Erstellen Sie zunächst das Verzeichnis, das den Ressourcenagenten enthalten soll. Der Verzeichnisname wird von Pacemaker als Kennung für diesen benutzerdefinierten Agenten verwendet. Führen Sie aufboth servers Folgendes aus:

sudo mkdir /usr/lib/ocf/resource.d/digitalocean

Laden Sie als Nächstes das FloatIP-Ressourcenagenten-Skript herunter und legen Sie es im neu erstellten Verzeichnis aufboth servers ab:

sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip

Machen Sie das Skript nun mit dem folgenden Befehl aufboth servers ausführbar:

sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip

Wir müssen den Ressourcenagenten weiterhin mit dem PCS-Dienstprogramm im Cluster registrieren. Der folgende Befehl sollte vonone der Knoten ausgeführt werden (vergessen Sie nicht,your_api_token durch Ihr DigitalOcean-API-Token undfloating_IP_address durch Ihre tatsächliche Floating-IP-Adresse zu ersetzen):

sudo pcs resource create FloatIP ocf:digitalocean:floatip \
    params do_token=your_api_token \
    floating_ip=floating_IP_address

Die Ressource sollte jetzt registriert und im Cluster aktiv sein. Sie können die registrierten Ressourcen von jedem der Knoten mit dem Befehlpcs status überprüfen:

sudo pcs status
Output...
2 nodes and 1 resource configured

Online: [ primary secondary ]

Full list of resources:

 FloatIP    (ocf::digitalocean:floatip):    Started primary

...

[[Schritt-7-Test-Failover]] == Schritt 7 - Test-Failover

Ihr Cluster sollte jetzt bereit sein, einen Knotenfehler zu behandeln. Eine einfache Möglichkeit zum Testen des Failovers besteht darin, den Server neu zu starten, der derzeit in Ihrem Floating IP-Setup aktiv ist. Wenn Sie alle Schritte in diesem Lernprogramm ausgeführt haben, sollte dies derprimary-Server sein.

Lassen Sie uns erneut die IP-Neuzuweisung mithilfe eines Befehlscurl in einer Schleife überwachen. Führen Sie von einem lokalen Terminal aus:

while true; do curl floating_IP_address; sleep 1; done

Führen Sie auf dem Server vonprimaryeinen Neustartbefehl aus:

sudo reboot

Nach einigen Augenblicken sollte der Primärserver nicht mehr verfügbar sein. Dadurch wird der sekundäre Server als aktiver Knoten übernommen. Eine ähnliche Ausgabe sollte in Ihrem lokalen Terminal mitcurl angezeigt werden:

Output...
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
curl: (7) Failed connect to floating_IP_address; Connection refused
Droplet: secondary, IP Address: secondary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
…

[.note] #Der Fehler "Verbindung abgelehnt" tritt auf, wenn die Anforderung unmittelbar vor oder zur gleichen Zeit erfolgt, zu der die IP-Neuzuweisung stattfindet. Es kann in der Ausgabe angezeigt werden oder nicht.
#

Wenn Sie die Floating IP zurück auf den Primärknoten verweisen möchten, während Sie gleichzeitig das Failover auf dem Sekundärknoten testen, wiederholen Sie einfach den Vorgang, diesmal jedoch aus demsecondary-Droplet:

sudo reboot

Fazit

In diesem Handbuch haben wir gesehen, wie Floating IPs zusammen mit Corosync, Pacemaker und PCS verwendet werden können, um eine hochverfügbare Webserverumgebung auf CentOS 7-Servern zu erstellen. Wir haben eine recht einfache Infrastruktur verwendet, um die Verwendung von Floating IPs zu demonstrieren. Diese Konfiguration kann jedoch skaliert werden, um eine hohe Verfügbarkeit auf jeder Ebene Ihres Anwendungsstacks zu implementieren.

Related