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