Linux Cluster MiniHowTo

Das folgende HowTo beschreibt den Aufbau eines Linux Clusters, auf dem ein Webserver läuft. Es kann aber auch auf Cluster mit anderen Einsatzzwecken und mehr Nodes angewendet werden.
Das HowTo wird nur auf eine Minimalkonfiguration eingehen, ist aber voll funktionsfähig.

Anforderungen:

  • zwei PC’s
  • jeweils eine leere Partition oder Festplatte
  • eine frische Minimalinstallation von Debian Lenny auf jedem Node
  • Webserver auf jedem Node installiert
  • jeder der zwei Nodes sollte bereits mit einer IP Adresse und einem Hostnamen vorkonfiguriert sein
  • eine zusätzliche, nicht belegte, IP-Adresse
  • beide Nodes müssen sich über den Hostnamen ansprechen können (z.B. über Einträge in der /etc/hosts)

Umgesetzt wird der Cluster mit heartbeat, drbd und ocfs2.

heartbeat

Heartbeat ist die eigentliche Clustermanagement-Software. Die beiden anderen Applikationen sind nur Beiwerk und je nach Einsatzgebiet auch optional.
Wir nutzen Heartbeat zum Umschalten einer Virutellen IP-Adresse im Fehlerfall, oder bei einem manuellen Clusterschwenk. Heartbeat kann aber deutlich mehr. Einen kleinen Überblick dazu gibt es auf der englischen Wikipedia.

Zunächst muss Heartbeat natürlich installiert werden. Unter Debian geschieht dies einfach mit dem Befehl apt-get install heartbeat

Die Konfiguration geschieht vornehmlich in drei Dateien:

  • /etc/ha.d/ha.cf
node node1 node2 #alle Nodes des Clusters werden hier aufgeführt

# Bekanntgabe der IP-Adressen aller Nodes und wie diese über welche Schnittstelle
# zu erreichen sind:
ucast eth0 192.168.178.185 # wird automatisch von node1 ignoriert
ucast eth0 192.168.178.186 # wird automatisch von node2 ignoriert

# Anhand von Pings auf die folgende IP-Adresse wird ermittelt ob der aktive Node
# erreichbar ist
ping 192.168.178.184 # gemeinsame virtuelle IP der Nodes

# Debug/Logfiles:
debugfile /var/log/ha-debug
logfile /var/log/ha-log

deadtime 10 # Sekunden bis ein Node für tot erklärt wird
  • /etc/ha.d/authkeys
auth 3
#1 crc # keine Sicherheit
#2 sha1 HI! # oder ein gemeinsamer sha1-hash
3 md5 supergeheimerstring # oder md5-hash
  • /etc/ha.d/haresources

node1 192.168.178.184 # der bevorzugte Node und die umzuschaltenden Ressourcen
Die obige Installation ist auf beiden Nodes durchzuführen. Die Konfiguration kann dann von einem auf den anderen Node kopiert werden, sodass dises auf beiden Nodes exakt gleich ist.

Nun kann Heartbeat mit /etc/init.d/heartbeat restart aktiviert werden.
Jetzt sollte der Webserver über die virtuelle IP-Adresse erreichbar sein.

Ein manueller Failover kann mit folgenden Befehlen erreicht werden:
/usr/lib/heartbeat/hb_standby

/usr/lib/heartbeat/hb_takeover

Weitere Informationen zur Konfiguration gibt es auf der offiziellen Homepage des Tools.

drbd

Drbd (Distributed Replicated Block Device) ist eine Netzwerkspeicherlösungs-Software. Damit ist es möglich gleichzeitig auf die lokale Festplatte und eine entfernte Festplatte zu speichern.  Eine genauere Beschreibung findet sich auf Wikipedia.

Installiert wird die Software über das Debian Paketmanagementsystem:
aptitude install drbd8-utils drbd8-modules-`uname -r`

Das letztere Paket enthält ein Kernelmodul das für den Betrieb von drbd erforderlich ist.
Damit das Kernelmodul beim Systemstart geladen wird, muss es zur /etc/modules hinzugefügt werden.
echo drbd >>/etc/modules

Um das Modul sofort (vor dem nächsten Systemneustart) zu laden muss es mit modprobe geladen werden:modporbe drbd

Konfiguriert wird drbd über das File drbd.conf:

# erlaubt das Erfassen von Statistikdaten seitens Linbit (siehe http://usage.drbd.org)
global { usage-count yes; }

# Bestimmt die Replikationsmethode
resource r0 { protocol C;
    # Gibt die Netzwerkgeschwindigkeit an
    syncer { rate 100M; }
    # gibt an, dass zwei Nodes primär sein dürfen (per Default darf das nur einer)
    net { allow-two-primaries; }
    # gibt an, dass sich beide Nodes beim Starten als Primär registrieren
    startup { become-primary-on both; }
    on node1 {
        device     /dev/drbd0;
    	disk       /dev/hdb;
    	address    192.168.178.185:7788;
    	meta-disk  internal;
    	}
    on node2 {
	device    /dev/drbd0;
	disk      /dev/hdb;
	address   192.168.178.186:7788;
	meta-disk internal;
	}
}

Nach dem Erstellen des Konfigurationsfiles muss es natürlich auf den anderen Node kopiert werden.

Nach dem Kopieren muss das Drbd-Device auf beiden Nodes initialisiert werden:
drbdadm create-md r0

Nun müssen Beide Nodes synchronisiert werden. Dies geschieht in dem der eine die Daten des anderen Nodes überschreibt. Die folgende Zeile sollte deshalb auch nur auf einem Node ausgeführt werden.
drbdsetup /dev/drbd0 primary --overwrite-data-of-peer
Ob die Synchronisation beendet ist kann mit /etc/init.d/drbd status in der Spalte “ds” begutachtet werden. Dort müssen beide Nodes als “UpToDate” ausgewiesen sein.

Die beiden Nodes können nun mit dem Befehl drbdadm primary r0 zu primären Nodes gemacht werden. D.h. beide Nodes dürfen gleichzeitig auf das Device schreiben.

Zur Veranschaulichung:
Wir haben jetzt auf beiden Nodes ein Device Namens “/dev/drbd0“. Sobald einer der beiden Nodes auf dieses Device schreibt, wird der Schreibvorgang auf der lokalen Festplatte und auf der Festplatte des anderen Nodes durchgeführt.

ocfs2

Was nun noch fehlt um Dateien auf dem Device ablegen zu können, ist ein Dateisystem. “Normale” Dateisysteme, wie z.B. ext2/3/4, reiserfs, FAT oder  NTFS, verbieten sich von selbst da sie nicht für diesen Zweck ausgelegt sind. Würde man von mehr als einem Node schreibend darauf Zugriff nehmen, würde das Dateisystem sofort inkonsistent. Deshalb gibt es sog. Clusterdateisysteme, die das Schreiben mehrerer Nodes gleichzeitig auf ein einziges Dateisystem beherrschen. Eines Davon ist das Oracle Cluster Filesystem 2, kurz ocfs2.

Installiert wird es ebenfalls über die Debian Paketverwaltung:
aptitude install ocfs2-tools
Wer dazu lieber noch ein grafisches Tool installieren will, kann noch das Paket “ocfs2console” installieren.

Konfiguriert wird das Dateisystem über die Datei “/etc/ocfs2/cluster.conf“:

cluster:
        node_count = 2
        name = ocfs2
node:
        ip_port = 7777
        ip_address = 192.168.178.185
        number = 0
        name = node1
        cluster = ocfs2
node:
        ip_port = 7777
        ip_address = 192.168.178.186
        number = 1
        name = node2
        cluster = ocfs2

Achtung! Hier ist das Einrücken zwingend erforderlich.

Die Konfiguration muss natürlich wieder auf beiden Nodes erstellt werden, damit die Konfiguration mit /etc/init.d/ocfs2 restart aktiviert werden kann.

Die Konfiguration alleine bewirkt natürlich noch nichts, denn das Dateisystem muss, bevor man es verwenden kann, zunächst einmal auf das Device aufgebracht werden:
mkfs.ocfs2 /dev/drbd0
Diese Prozedur sollte nur an einem Node durchgeführt werden.

Damit man das Dateisystem nutzen kann muss man es online nehmen:
/etc/init.d/o2cb online ocfs2

Dies kann auch automatisiert geschehen. Dazu muss das Init-Script mit dem “configure” aufgerufen werden.
/etc/init.d/o2cb configure

Nun kann das Dateisystem gemounted und genutzt werden. Sämtliche Änderungen werden live auf dem anderen Node sichtbar.
mount /dev/drbd0 /dein/lieblings/mountpoint

Montag, 18. Mai 2009, 22:30 Uhrthomas_
Linux, Tutorials

3 Kommentare zu „Linux Cluster MiniHowTo“

  1. Andreas sagt:

    Hallo,

    vielen Dank für das Tutorial.

    Ich hatte heute Probleme, dass das OCFS2-Filesystem nicht automatisch gemoutet wird.

    In der /etc/fstab habe ich folgendes eingetragen:
    /dev/drbd0 /vmware ocfs2 _netdev,noatime 0 0

    Das Problem bei Debian Lenny scheint aber, dass DRBD erst nach o2cb und ocfs2 gestaret wird.

    Ich habe nun in /var/lib/rcconf/services den Eintrag für DRBD (“70 08 drbd”) durch “59:S,05:0:5 x drbd” ersetzt. Nun wird das Dateisystem beim Systemstart automatisch eingebunden.

    Viele Grüße
    Andreas

  2. marco sagt:

    Hallo,

    Seid Ihr euch sicher, dass bei heartbeat der ping auf die gemeinsame IP Stehen soll, soweit ich weiß muss der Ping auf den Router zeigen, damit die Nodes wissen, falls der Primary absturzt ob ihr eigenes netz funktioniert, oder ob es ein gesamt ausfall ist ?

    greetz

  3. SirHenry sagt:

    Hi,

    also ich habe das ganze grad mal durchgespielt aber ohne brdb sondern mit einer geteilten virtuellen Disk auf einen ESX 3i.

    Funktioniert wunderbar jedoch hatte ich einige Probleme beim booten wenn ich die Platte dort einhängen wollte.Ich habe in fstab das selbe eingetragen wie Andreas jedoch war das Problem das ocfs2 und o2cb nach mountnfs ausgeführt wird und somit die Platte bei mountnfs noch nicht bereit ist.

    Ich habe dann die Scripte in /etc/rcS.d/ so umsortiert das die beiden Scripte nach networking und vor mountnfs gestartet werden.

    Ein weiteres problem bescherten mir dann die vmware-tools die beim shutdown leider vor den beiden Scripten das Netzwerk runterfuhren. Auch hier habe ich die beiden Scripte einfach vor die vmware-tools gelegt natürlich in /etc/rc6.d/.

    Nun läuft alles reibungslos beim boot oder shutdown! Vielen dank für das Tutorial!

    Gruß


Schreibe einen Kommentar

(erforderlich)

(erforderlich)