Linux Cluster – Basics

Linux Cluster – Basics

September 21, 2021 1 Von Tobias

Wenn die meisten Menschen das Wort “Cluster” hören, denken sie vielleicht, dass es sich um eine Gruppe von Computern handelt, die als ein System agieren. Diese Vorstellung ist ein sehr grundlegendes Konzept des Clustering, aber im Wesentlichen richtig.

Ein Computercluster ist eine Gruppe von Systemen, die für verschiedene Zwecke als ein System agieren. Es gibt vier Arten von Clustern, die wir besprechen werden.

Typen von Clustern

Jeder Clustertyp hat einen anderen Zweck. Wenn Sie die Einrichtung eines Clusters planen, müssen Sie entscheiden, welchen Cluster Sie für Ihren speziellen Zweck benötigen.

Die vier Typen sind wie folgt:

  • Hochverfügbarkeit (HA) – wird für Fehlertoleranz verwendet, um Serverdienste für Mitarbeiter oder Kunden verfügbar zu halten
  • Lastausgleich – gleicht die Last zwischen mehreren Systemen aus, wenn ein Dienst für zahlreiche Systeme gleichzeitig verfügbar sein muss (kann für die anderen drei Clustertypen verwendet werden)
  • Verteilt – Aufträge werden von verschiedenen Systemen verwaltet
  • Parallel (Beowulf) – Aufträge werden von mehreren Prozessoren auf mehreren Systemen verwaltet

HINWEIS: Die verteilten und parallelen Cluster werden als High Performance (HP) Cluster bezeichnet.

Bevor wir uns zu sehr in die Typen vertiefen, wollen wir die verschiedenen Komponenten eines Clusters aufschlüsseln.

Cluster Komponenten

Da ein Cluster eine Gruppe von Computern ist, die als ein System agieren, müssen wir in der Lage sein, das System als Ganzes zu verstehen.

Nehmen wir an, wir haben zwei Systeme, die zusammenarbeiten. Zwei Systeme sind ein sehr minimaler Cluster, aber er funktioniert.

Jedes System in einem Cluster wird als Knoten bezeichnet. In einem System mit zwei Clustern haben wir also Node-1 und Node-2. Sie können den Hostnamen auf ‘Node-1’ und ‘Node-2’ setzen, wenn Sie wollen.

Für sehr einfache Zwecke ist es am besten, diese Systeme mit zwei Netzwerkkarten (NICs) einzurichten. Bei einem Hochverfügbarkeits-Cluster (HA-Cluster) ist der Bedarf deutlicher.

Ein Hochverfügbarkeitscluster kann auch ein externes Speichergerät erfordern, auf das alle Knoten Zugriff haben.

Heartbeat ist ein Mittel, um den Knoten zu signalisieren, dass der Hauptknoten noch aktiv ist. Der “Heartbeat” ist eine spezielle Nachricht, die über ein Netzwerk, in der Regel ein dediziertes Netzwerk, gesendet wird. Wenn ein Heartbeat ausbleibt, wissen die Backup-Knoten, dass der Hauptknoten offline ist und der sekundäre Knoten übernehmen sollte.

High Availability (HA)

Nehmen wir an, Sie haben ein Unternehmen, das allen Mitarbeitern Zugang zu einer Datenbank gewähren muss. Jede Minute, in der die Datenbank nicht verfügbar ist, bedeutet entgangene Einnahmen. Da die Datenbank rund um die Uhr verfügbar sein muss, wird beschlossen, sie in einem Cluster zu speichern. Hochverfügbarkeit (HA) sorgt für Redundanz.

Um eine bessere Redundanz zu gewährleisten, ist Folgendes geplant:

  • drei Knotenpunkte
  • eine externe RAID-Speichereinheit
  • mehrere Netzwerkkarten (NICs), zwei an verschiedene Hubs für das lokale Netzwerk (LAN) und eine oder mehrere für Heartbeat
  • vier separate unterbrechungsfreie Stromversorgungen (USV) – drei für die Knoten und eine für die Speichereinheit

HINWEIS: Dies ist eine grundlegende Einrichtung, um Redundanz nachzuweisen. Das Szenario könnte als Load Balancing eingerichtet werden, um eine schnellere Verbindung zur Datenbank zu ermöglichen, aber wir sind mehr um die Redundanz besorgt.

Das Szenario mag ein wenig kostspielig erscheinen, aber für einige Unternehmen ist es entscheidend, bestimmte Dienste jederzeit verfügbar zu halten. Jede Zeit, in der der Dienst nicht läuft, ist eine Zeit, in der Kunden und wichtige Informationen verloren gehen. Zugegeben, der RAID-Speicher könnte auf eine andere Speichereinheit gespiegelt werden, aber ich versuche, das Ganze etwas einfacher zu halten. Für jedes Gerät, das ausfallen kann, sollte ein Backup vorhanden sein. Selbst wenn der Strom ausfällt, können die USV-Systeme nur eine gewisse Zeit lang eingeschaltet bleiben. Ein Generator, der anspringt, bevor die USV-Systeme ausfallen, ist eine weitere Option. Wenn ein Gerät ausfällt, muss es repariert oder in einigen Fällen ersetzt werden.

Die Einrichtung eines Hochverfügbarkeitssystems ist keine kleine Aufgabe und muss sehr gründlich durchdacht werden. Es sollte ein Testlabor eingerichtet werden, in dem alle Geräte getestet werden, um sicherzustellen, dass sie so funktionieren, wie sie benötigt werden.

High Availability (HA) Walk-through

Die Systeme werden mit dem erforderlichen Dienst, z. B. einer Datenbank, eingerichtet. Die Datenbank wird auf einer externen Speichereinheit gespeichert, von der aus jeder Knoten auf die Daten zugreifen kann. Knoten 1 wird der Hauptserver sein und alles ausführen. Der Heartbeat wird über das dedizierte Netzwerk gesendet. Knoten-2 und Knoten-3 hören auf den Heartbeat und sind bereit, wenn er aufhört.

Wenn Knoten-1 ausfällt, wird der Heartbeat beendet. Nach einer bestimmten Zeit wird Node-2 zum Hauptserver und startet die Datenbankdienste. Die Daten werden von Node-2 abgerufen und sind verfügbar. Node-2 nimmt nun Client-Anfragen entgegen und der Verlust von Node-1 sollte minimal sein. Die Übernahme von Knoten-2 sollte nur minimal Zeit in Anspruch genommen haben (abhängig von den Einstellungen).

Knoten-3 wird dann beginnen, auf den Heartbeat von Knoten-2 zu hören und bereit sein, den Betrieb zu übernehmen, falls Knoten-2 ausfallen sollte.

Knoten-1 sollte repariert und bereit sein, wieder als Hauptsystem zu fungieren. Die Umschaltung könnte zu einer Zeit erfolgen, in der das Netz nur wenig genutzt wird. Knoten-1 könnte auch als Standby für den nächsten sekundären Knoten eingesetzt werden, wodurch Knoten-3 wieder zu einem tertiären Server wird.

HINWEIS: Denken Sie daran, dass im Hintergrund noch viele Dinge ablaufen, die noch nicht behandelt wurden, aber dies sind nur die Grundlagen.

Dezentrale Cluster

Ein weiterer Punkt, der im Szenario der Hochverfügbarkeit (HA) nicht berücksichtigt wird, ist die Möglichkeit einer Naturkatastrophe. Nehmen wir an, der Cluster befindet sich in einem Gebiet, in dem die Wahrscheinlichkeit von Überschwemmungen oder Tornados höher ist. Ein weiterer Cluster kann außerhalb des Standorts platziert werden, um bei einer möglichen Naturkatastrophe zu helfen.

Das neue Szenario kann zeigen, dass ein verteilter Cluster dazu beitragen kann, einen Dienst verfügbar zu halten.

Betrachten wir das Ganze einmal anders. Eine Website kann von Servern aus betrieben werden, die über einen großen physischen Standort verteilt sind. Nehmen wir an, ein Unternehmen stellt mehrere Webserver in den Vereinigten Staaten auf. Ein einzelner Server-Cluster kann als Hauptserver verwendet werden, der dann eine Kundenanfrage an einen anderen Server weiterleitet. Dieser Hauptcluster sorgt dann für den Lastausgleich der HTTP-Anfragen zwischen allen Servern in einem großen Gebiet.

Denken Sie an die Webserver, die die Suche im Internet unterstützen. Dies sind keine einzelnen Server, sondern der Lastausgleich leitet die Anfrage an das nächste verfügbare System weiter.

HINWEIS: Manche Lastverteilung erfolgt nach dem Round-Robin-Verfahren. Die Server werden in der Reihenfolge aufgelistet, und die erste Anfrage geht an Knoten-1, die zweite an Knoten-2 und so weiter. Eine andere Methode besteht darin, eine höhere Anzahl von Anfragen an ein leistungsstärkeres System zu senden als an ein weniger leistungsfähiges System.

Eine andere Möglichkeit, einen verteilten Cluster zu verwalten, besteht darin, den Standort einer Anfrage zu bestimmen und die Anfrage an einen Cluster weiterzuleiten, der dem anfragenden Standort am nächsten liegt.

Parallele Cluster (Beowulf)

Der Parallel Cluster unterscheidet sich ein wenig von den anderen. Anstelle von Clustern, die sich wie ein einziges, weit voneinander entferntes System verhalten, sorgt der Parallel Cluster dafür, dass sich mehrere Systeme eher wie ein großes System von Verarbeitungsressourcen verhalten. Ohne in die Programmierung einzusteigen, muss die Anwendung so geschrieben werden, dass sie Multiprocessing ermöglicht.

Versuchen wir, das Ganze noch einmal zu vereinfachen. Die meisten heutigen Prozessoren haben mehrere Kerne. Jeder Kern ist in der Lage, Daten zu verarbeiten. Der Code wird so geschrieben, dass mehrere Datensätze gleichzeitig auf mehreren Kernen verarbeitet werden können. Wenn dies richtig gemacht wird, können die Prozesse mit jedem zusätzlichen Kern schneller ausgeführt werden.

Stellen Sie sich vor, Sie haben ein System mit acht Kernen. Es kann den Code schneller verarbeiten als vier Kerne.

HINWEIS: Denken Sie daran, dass nicht alle Prozessoren gleich sind. Einige Prozessoren arbeiten schneller und zwei Kerne auf einem System können schneller sein als vier Kerne auf einem viel langsameren System.

Was wäre nun, wenn wir acht Systeme mit je vier Kernen hätten? Jetzt können wir einen Cluster mit 32 Kernen bilden. Der Cluster kann auf jede beliebige Größe anwachsen, die Sie sich wünschen. Es gab bereits Beowulf-Cluster mit über 128 Prozessoren.

Aufbau eines virtuellen Beowulf-Clusters

Unter Linux können wir Virtualbox verwenden, um einen Beowulf-Cluster zu erstellen. Der Prozess kann Ihnen helfen, den Prozess der Einrichtung eines parallelen Clusters zu verstehen.

Wenn Sie über die Systeme verfügen, um einen physischen Cluster zu erstellen, müssen Sie beachten, dass die Systeme alle gleich sein müssen.

Beginnen Sie unter Virtualbox 6.0.4 mit der Erstellung eines neuen Rechners. Geben Sie ihm einen Namen wie Cluster-Node-1 oder Node-1. Jeder gültige Name sollte funktionieren, aber behalten Sie die Namen im Auge. Halten Sie es einfach.

Ich habe Ubuntu (64-Bit) mit einer Speichergröße von 4.096 MB gewählt. Richten Sie eine virtuelle Festplatte mit maximal 25 GB Speicherplatz ein, die dynamisch zugewiesen wird. Deaktivieren Sie unter “System” die Option “Floppy”. Wenn Sie die nötigen Prozessoren zur Verfügung haben, können Sie die Anzahl der CPUs auf mehr als einen einstellen.

Stellen Sie bei ‘Anzeige’ den Videospeicher auf 128 MB. Bei “Storage” stellen Sie das optische Laufwerk auf das zu installierende Ubuntu-ISO ein.

Die nächste Option ist wichtig. Unter ‘Network’ sollte ‘Adapter 1’ auf NAT belassen werden. Aktivieren Sie ‘Adapter 2’ auf Internes Netzwerk.

Dies funktioniert so, dass Adapter 1 für die Kommunikation mit dem Internet für Updates und dem Rest des Netzwerks verwendet wird. Adapter 2 wird verwendet, um die Kommunikation zwischen den Nodes zu ermöglichen. In parallelen Clustern gibt es keinen Heartbeat, aber die Nodes müssen miteinander kommunizieren, um die Multiprocessing-Fähigkeiten zu verwalten.

In meinem Fall habe ich Ubuntu 18.04.5 für zwei Nodes verwendet. Ich habe jeden so eingestellt, dass er zwei Prozessoren verwendet. Führen Sie eine Grundinstallation von Ubuntu durch. Verwenden Sie die Standardeinstellungen, aber wenn Sie nach einer “normalen Installation” oder einer “minimalen Installation” gefragt werden, wählen Sie die “minimale Installation”. Der Rest ist normal. Vergewissern Sie sich, dass der Hostname für jeden Knoten auf Ihre Präferenz eingestellt ist.

Nach der Installation von Ubuntu können Sie auch ein Update mit den Befehlen durchführen:

sudo apt update 
sudo apt upgrade

Stellen Sie die zweite Netzwerkkarte auf Knoten-1 so ein, dass sie kein DHCP verwendet. Stellen Sie die Adresse manuell auf etwa 10.0.0.1 mit einer Subnetzmaske von 255.0.0.0 ein. Eine Gateway-Adresse ist nicht erforderlich. Nehmen Sie auf Knoten-2 die gleichen Änderungen vor, aber die Adresse sollte 10.0.0.2 lauten.

Öffnen Sie dann ein Terminal und bearbeiten Sie die Datei “hosts”:

sudo nano /etc/hosts

Fügen Sie nach der Loopback-Adresse “127.0.0.1” die Adresse und den Hostnamen des anderen Knotens hinzu. Wenn Sie möchten, können Sie sowohl die Adressen als auch die Knotennamen zu jeder “hosts”-Datei hinzufügen. Stellen Sie sicher, dass Sie diese Änderung an allen Knoten vornehmen.

Öffnen Sie nun von jedem Knoten aus ein Terminal und pingen Sie alle Knoten an:

ping Node-1 
ping Node-1 

Stellen Sie sicher, dass Sie den Knotennamen verwenden, den Sie während der Installation gewählt haben.

Die Knoten werden SSH verwenden, um über das zweite Netzwerk, das wir eingerichtet haben, miteinander zu kommunizieren. Sie müssen SSH installieren und einen Schlüssel einrichten sowie einen Port auf der Firewall unter Ubuntu öffnen.

sudo apt install openssh-server 
ssh-keygen -t rsa

Drücken Sie die Eingabetaste für alle Optionen.

ssh-copy-id 10.0.0.2

Geben Sie “Ja” ein, wenn Sie dazu aufgefordert werden, und geben Sie das Passwort ein.

Der openssh-server muss auf Node 2 installiert sein. Die letzten beiden Befehle müssen nicht auf Node-2 ausgeführt werden. Nun müssen wir die Software installieren, die für Parallel Clustering benötigt wird:

sudo apt install mpich python3-mpi4py

Alles sollte wie gewünscht funktionieren. Wir können einen einfachen Test durchführen, um sicherzustellen, dass alles richtig funktioniert.

mpiexec -n 2 --host 10.0.0.1,10.0.0.2 hostname

In diesem Fall verwenden wir zwei Systeme mit den IP-Adressen 10.0.0.1 und 10.0.0.2, die jeweils den Befehl “hostname” ausführen.

Wenn Sie mehr Knoten verwenden möchten, ändern Sie die Anzahl und die IP-Adressen entsprechend. Von beiden Nodes sollte eine Antwort erfolgen, die ihren Hostnamen auflistet. Wenn zwei Antworten nicht zurückgegeben werden, dann stellen Sie sicher, dass SSH funktioniert und dass die zweiten Adapter sich gegenseitig anpingen können.

Wenn ich die Anzahl der CPUs auf jedem Knoten überprüfen wollte, könnte ich den Befehl verwenden:

mpiexec -n 2 --host 10.0.0.1,10.0.0.2 lscpu | grep “CPU(s):”

Mein Ergebnis ist 2 von jedem Knoten. Ich erhalte auch eine Übereinstimmung in einer anderen Zeile ‘NUMA node0 CPU(s):’, aber dieses Ergebnis kann man ignorieren.

Die Befehle ‘hostname’ und ‘lscpu | grep “CPU(S):” wurden beide parallel ausgeführt. Jeder Befehl, den Sie eingeben, muss auf allen Nodes verfügbar sein und sich in derselben Ordnerstruktur befinden. Angenommen, Sie haben ein Programm namens “Test”, das sich auf Knoten-1 in “~/TestApp/” befindet. Sie müssen auf jedem Knoten den Ordner “~/TestApp/” erstellen und das Programm “Test” darin ablegen. Von Node-1 wechseln Sie in den Ordner ‘TestApp’ und führen das Programm wie folgt aus:

cd ~/TestApp/ 
mpiexec -n 2 --host 10.0.0.1,10.0.0.2 Test

Das Programm sollte auf allen angegebenen Knoten laufen.

Fazit

Ich hoffe, Sie fanden diesen Artikel hilfreich. Ich hoffe, dass ich in Zukunft physische Tutorials für jeden Typ erstellen kann und mehr über Parallel Clustering.

Da es sich um ein virtuelles Setup handelt, kann es sein, dass Sie beim Ausführen von Anwendungen nicht die richtigen Antwortzeiten sehen. Die virtuellen Systeme werden ohnehin auf einem einzigen System ausgeführt.

Zweiter Teil:

Share