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 virtuellen 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 dieses 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 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

oracle_logo

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

27 Antworten

  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

    • Andi sagt:

      Hallo Namesvetter,

      ich kann den Pfad /var/lib/rcconf/services leider nicht finden. Ich nutzte auch Lenny.

      Gruss
      Andi

  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ß

  4. Juan sagt:

    Hi I found another good tutoiral on this site:

    http://docs.homelinux.org

    Your articel and the howto in the posted site help’s me a lot! Thank You!

  5. Mark stephan sagt:

    Hallo zusammen!

    Das klingt ja mal richtig klasse – genau das, was ich suche. Eine Frage habe ich allerdings noch: Verfügt dieser Cluster auch über „Load Balancing“; sprich, teilt er sich die auf der virtuellen IP ankommende Last automatisch auf die beiden Nodes auf?

    Ich hoffe, das ist keine Newbie-Frage; ich bin gerade dabei, mich in das Thema einzuarbeiten.

    Grüße und vielen Dank,
    Mark

    /edit: Bei diesem Howto müsste es sich doch um einen aktiv/aktiv-Cluster ohne Load Balancer handeln, oder?

    • lpic 1 sagt:

      wenn 2 Rechner mit einer Adresse arbeiten, kann diese aktiv nur ein Server nutzen.
      Der andere steht im Hot-Standby und wartet auf den Ausfall.
      Wenn die Last auf mehrere Nodes verteilt werden soll, brauchst du einen Loadbalancer, dieser hat eine IP und erhält die Anfragen, welcher dann die Anfragen auf die dahinter liegenden Server verteilt.
      wan—–Loadbalancer——switch——-node1
      ——-node2
      dabei wird der LB aber ggf. zum Flaschenhals.

    • Mark Stephan sagt:

      Hi!

      Mensch danke, das ging ja schnell 🙂 So etwas mit dem Load Balancer hatte ich schon befürchtet; ich versuche gerade, eine Lösung zu finden, in der ich ein Clustersystem habe, welches komplett redundant (also gespiegelt) ausgelegt ist und sich selber die Last verteilt (ohne Load Balancer). Aber von dem was ich bisher gehört/gelesen habe, wird das nicht so ohne weiteres (wenn überhaupt) möglich sein.

      Trotzdem vielen Dank! 🙂
      Grüße
      Mark

  6. lpic 1 sagt:

    nein, dafür brauchst du 2 loadbalancer, falls einer ausfällt.
    jede ip Adresse bildet eine Netzwerkkarte ab (ARP-Mac Adress)
    deswegen wirst du nicht um einen Loadbalancer herumkommen um die Last zu verteilen.
    das andere wäre du schaut mal ob du per ARP einen „hack“ hin bekommst, jedoch würde auch dann noch ein Computer als „loadbalancer“ (ARP- verteilrechner) arbeiten, was aber nicht schlau ist.
    Dafür sind LB´s ja entwickelt worden *g* 🙂

  7. rix sagt:

    hallo an alle,
    echt interessanter beitrag! ich hätte da eine frage, hab ähnliche konfiguraition probiert mit nur 2 nodes, drbd, heartbeat auf ext3 fs als reine failover lösung für VMware server 2 doch nach dem umschalten zwischen den nodes konnte VMware nicht mehr auf den datastore zugreifen. Da sonst alles wunderbar funktionierte ist meine überlegung ob ich mit einem anderen fs mehr erfolg hätte. Frage: hat von euch jemand VMware server 2 erfolgreich auf ocfs eingesetzt und ist ocfs überhaupt geeignet für meine zwecke?
    vielen dank im voraus!

    • lpic1 sagt:

      kommst du auch auf den Datastore manuell drauf?
      wenn die Pfade passen sollte es kein Problem darstellen.

    • rix sagt:

      danke für die antwort, ja ich kann den ordner aufmachen und die files sehen aber, eigenartiger weise kann wmware nur vor dem failover test drauf zugreifen, nach dem ersten umschalten zwischen primary und secondary geht gar nichts mehr. auch nicht wenn der ursprüngliche node wieder die primäre role übernimmt. es scheint das das rdbd device für den wm server nicht mehr lesbar ist. wenn ich ein neues datastore ausserhalb des drbd erstelle und die vmx hinein kopiere kann ich de vm wieder registrieren und starten…

  8. lpic1 sagt:

    PS Nochwas ganz vergessen:
    DRBD arbeitet mit : GFS or OCFS2 anstelle von ext2,3,4,reiserfs
    wegen den gleichzeitigen Dateizugriffen.
    (mkfs.ocfs2 /dev/drbd0)

  9. Alexia sagt:

    Hallo,

    ich habe leider auch das Problem.
    Bei einem boot/reboot wird das Dateisystem nicht gemountet.

    In welcher Reihenfolge habt ihr das Runlevel sortiert?

    Beste Grüße
    und Danke.

  10. Webspace sagt:

    DRBD Autostart:
    Lieblings Editor öffnen.
    #/etc/init.d/mountdrbd.sh
    :::::::::::::::::::::::::::::::::::::::::::
    #!/bin/bash
    drbdadm primary r0
    mount /dev/drbd0 /dein/lieblings/mountpoint
    :::::::::::::::::::::::::::::::::::::::::::
    muss ausführbar und verlinkt werden:

    sudo chmod +x /etc/init.d/mountdrbd.sh
    sudo ln -s /etc/init.d/mountdrbd.sh /etc/rc2.d/S80mountdrbd.sh

    reboot -> Spaß haben.

    Grüße

  11. Simon sagt:

    Funktioniert das auch mit ubuntu?

    • Tobi sagt:

      Ja sollte auch unter Ubuntu möglich sein. Eventuell unterscheiden sich ein paar Befehle aber die Grundlagen sind identisch.

  12. LPIC 2 sagt:

    Hallo Simon,

    das ganze funktioniert so genau unter Ubuntu.
    Bitte beachte, dass es bei Ubuntu 12.04 zu Problemen mit den von Ubuntu bereitgestellten DRBD Tools kommen kann.
    Du merkst es daran, dass DRBD sehr sehr lange brauch um eine Aktion auszuführen.
    Das sicherste (leider hab ich noch keine Zeit fürs Howto gefunden) ist, dass du DRBD aus dem Source code compilierst.

    Das ist recht einfach!
    1) apt-get install gcc make flex
    2) cd /tmp
    3) wget <url zum DRBD 8.4 source package.tar.gz)
    4) tar xfz
    5) cd
    6) ./configure –prefix=/usr –localstatedir=/var –sysconfdir=/etc
    7) make
    8) make install

    dann ist DRBD auch schon installiert. Vorteil du hast die aktuellste Version.
    Die Path Angaben bei configure entsprechen dem Ubuntu FHS System, also sollte alles da liegen wie du es gewohnt bist.

    Beachte bitte (oder gib mir einfach Feedback), dass bei Verwendung von OCFS2 in Verbindung mit PHP Shop / CMS Systemen, die Performance um den Faktor 8-10 schlechter ist. Das ist daraus begründet, dass der DLM Locking Mode, die Dateien für den Lesevorgänge zum schreiben sperrt.
    (Was wäre wenn jemand genau die Dateiverändert, wärend diese von einem anderen eingelesen wird, um somit konsitenz herzustellen wird diese gesperrt)

    Solltest du also solch ein Shopsystem rennen haben wollen, bleibt der nur ein Aktive/Passiv Standby System zu nehmen und z.B. ext4 zu verwenden.

    Relevante Befehle hierfür sind:
    drdbadm primary
    drdbadm secondary

    Bedenke auch, dass nur der primary das Filesystem einghängen darf, sofern ext4 oder ein nicht cluster Filesystem eingesetzt wird.

    Viele Grüße

  13. Java Webhosting - JCloudhosting sagt:

    Simon denk aber dran, dass 13.10 nicht LTS ist und der Support in nicht als zu langer Zeit ausläuft. Verwende, sofern du es auf Servern einsetzen möchtest 12.04 oder warte noch rund einen Monat auf 14.04.

    • Simon sagt:

      Ok ich werde jetzt doch Linux Mint benutzen, da Ubuntu nicht läuft… Mint funktioniert, werde gleich anfangen

  14. Java Webhosting - JCloudhosting sagt:

    Hallo Simon, worauf läuft Ubuntu nicht? auf ner VM oder direkt auf der Hardware?
    Teste mal 14.04 ist jetzt erschienen, andernfalls kannst du 12.04 installieren und mit 3-4 APT Befehlszeilen auf 14.04 upgraden

    Wenn das Problem bezüglich DRBD ist (glaub das hättest du aber dann erwähnt)
    folge bitte meiner installationsanweisung von oben für das manuelle installieren von DRBD

    grüße

  15. Simon sagt:

    Erstmal danke für deine schnelle Hilfe!

    Die Installation von Ubuntu läuft leider aus irgendeinem Grund nicht. Hab die PCs auch schon komplett mit Dariks Boot ans Nuke Formatiert…

    Naja, Mint klappt hab grade den Apache Server installiert.

    Simon

  16. Java Webhosting - JCloudhosting sagt:

    kann manchmal vorkommen, dass die an einem Punkt für ca 15 Minuten hängen bleibt.
    zwei-dreimal die Leertaste drücken, kurz warten und dann gehts weiter
    aber okay du hast es ja
    nettes we

    • Simon sagt:

      Ne, häng leider knapp 6 stunden an einer Stelle…
      Auch nach mehrfachem Leertaste Drücken tat sich nichts.

      Naja Mint ist jetzt drauf also…

  17. Simon sagt:

    Hallo wollte nur noch mal fragen ob man besondere schritte machen muss um es bei Linux Mint zumachen? Hab noch nicht angefangen da ich auf Mint 17 gewartet hab.

  1. 4. Januar 2011

    […] Linux Cluster HowTo (Nummer 1) […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.