bw11.ch
 

Hochverfügbarer Fileserver (Linux-Cluster)

Ein Hochverfügbarkeits-Cluster unter Linux ist auch mit einfachen Mitteln zu realisieren. Der Einstieg in die Oberliga für Server benötigt nur Standardkomponenten und die beiden freien Programme Heartbeat und DRBD - und schon steht beim Absturz des Servers ein Ersatz bereit. Diese Art Cluster stellt ein Backup-System (Hot Standby) für Dienste zur Verfügung.

Im Gegensatz zu Computing- oder Load-Balancing-Clustern ist einer der Server in diesem Fall passiv und wird erst tätig, wenn der Arbeitsserver ausfällt. Die von der Anwendung benötigten Daten werden dabei über das Netz gespiegelt, ein gemeinsamer Datenspeicher (Shared Storage) ist nicht nötig: Der Linux HA-Cluster ist ein Share Nothing Cluster. Da beide Rechner komplett ausgestattet sind und sich keine gemeinsamen Ressourcen teilen, fällt ein Single Point of Failure weg. Das sieht zunächst nach höheren Investitionen aus, aber die speziellen Komponenten für Shared Storage Cluster sind teuer, die Share Nothing Cluster kommen mit Standardkomponenten aus. Zwei einfache PCs mit jeweils zwei Netzwerkkarten, auf denen eine übliche Linux-Distribution läuft, im beschriebenen Beispiel Ubuntu 8.04 Server reichen. 

Systeme vorbereiten

Beide Systeme bekommen die übliche Partitionsaufteilung, am besten möglichst gleichartig, also zum Beispiel »/swap« und, »/«. Für die Daten, die der Cluster zur Verfügung stellen soll, ist jeweils noch eine separate Partition notwendig. Sie sollte auf beiden Rechnern etwa gleich groß sein und darf keinen Mountpoint erhalten und nicht beim Systemstart angebunden werden. Im Beispiel ist das jeweils die primäre Partition der zweiten Festplatte /dev/sdb1.

Als Dateisystem ist ein Journaling Filesystem wie Ext 3, ReiserFS oder XFS zu empfehlen. Die beiden Netzwerkkarten bekommen feste IP-Adressen. Im Beispiel für Karte 1 (»eth0«) die 192.168.1.10 auf dem primären Knoten, auf dem anderen Server bekommt die Karte 1 (»eth0«) die Adresse 192.168.1.11 als sekundärer Knoten.

Die zweite Netzwerkkarte (»eth1«) ist für die Heartbeat-Leitung zuständig. Im vorliegenden Beispiel hat Knoten 1 als IP-Adresse 192.168.245.129 und Knoten 2 die 192.168.245.130. Die Ports beider Netzwerkkarten verbindet man mit einem Netzwerk-Crossover-Kabel oder einem separaten Hub.

Trivial, aber wichtig sind eindeutige Namen für beide Rechner. Es ist eine gute Idee, die Namen in die »/etc/hosts« einzutragen.

# more /etc/hosts
127.0.0.1    localhost
127.0.1.1    knoten2
192.168.245.129 knoten1
192.168.245.130 knoten2
....

DRBD Netzwerk Raid1

Um dynamische Daten im Cluster auf beiden Servern redundant zu halten, ist eine Art Raid-System erforderlich, das alle Schreibzugriffe der Festplatte des aktiven Knotens über das Netzwerk auch auf dem sekundären Knoten spiegelt. Dies erledigt das Programm DRBD (Distributed Replicated Block Device), das von dem Österreicher Philipp Reisner als Diplomarbeit entwickelt wurde.

Der Kern von DRBD ist ein Daemon, der beim Booten startet, während das Mounten der Clusterpartition normalerweise später ein Heartbeat-Skript übernimmt. DRBD benötigt jeweils eine eigene Partition auf jedem Clusterknoten. Die Partition wird mit eigenen Devices z.B. /dev/drbd0 angesprochen.

Für DRBD muss nur die Datei »/etc/drbd.conf« bearbeitet werden. Der Start erfolgt wie bei Heartbeat über den Runlevel-Editor oder über »/etc/init.d/drbd start«. DRBD ist ein Programm, das unabhängig von Heartbeat arbeitet, aber als Clusterdienst von ihm verwaltet werden kann. Die Konfiguration von »/etc/drbd.conf« erfordert etwas mehr Aufwand als Heartbeat.

$ sudo -s
# apt-get install drbd8-utils
# fdisk /dev/sdb
# drbdadm create-md daten
# nano -w /etc/drbd.conf

/etc/drbd.conf

# more /etc/drbd.conf
resource daten {
  protocol    C;

  startup { wfc-timeout    0; degr-wfc-timeout    120; }
  disk { on-io-error detach; }
  syncer {
    rate 680M;
  }
  on knoten1 {
    device    /dev/drbd0;
    disk    /dev/sdb1;
    address    192.168.245.129:7791;
    meta-disk    internal;
  }
  on knoten2 {
    device    /dev/drbd0;
    disk    /dev/sdb1;
    address    192.168.245.130:7791;
    meta-disk    internal;
  }
}

Nach der Konfiguration starte man DRBD und erstellt auf der neuen Partition ein Dateisystem.

# /etc/init.d/drbd start
# drbdadm primary daten
# mkfs.ext3 /dev/drbd0
# drbdadm secondary all

Befehl zum Überwachen von DRBD:
# watch cat /proc/drbd
version: 8.0.11 (api:86/proto:86)
GIT-hash: b3fe2bdfd3b9f7c2f923186883eb9e2a0d3a5b1b build by phil@mescal, 2008-02
-12 11:56:43
 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
....

Wenn beide Nodes "Secondary" und "UpToDate" ist alles in Ordnung und man kann mit der Installation von Heartbeat beginnen.

Heartbeat

Das Programm Heartbeat ist ein Dienst, der seinen Clusterpartner überwacht und im Ernstfall (Failover) die für die Anwender notwendigen Dienste startet sowie die Cluster-IP-Adresse im Netz übernimmt. Welche die notwendigen Dienste sind, hängt natürlich vom Verwendungszweck des Clusters ab. Für die gebräuchlichsten Anwendungen genügen die Start-Skripte aus »/etc/init.d« oder es werden entsprechende Skripte mit Heartbeat geliefert.

# apt-get install heartbeat-2

Für die Konfiguration von Heartbeat ist noch eine gemeinsame IP-Adresse notwendig. Unter dieser virtuellen Adresse ist später der jeweils aktive Knoten im Netz erreichbar. Im Beispiel ist 192.168.1.100 die IP-Adresse. Für diese Adresse sollte auch ein DNS-Eintrag erfolgen, der den Namen des Clusters im Netz bekannt gibt.

Heartbeat wird mit drei Dateien konfiguriert: »/etc/ha.d/ha.cf«, »/etc/ha.d/resources« und »/etc/ha.d/authkeys«. Sie sind intern ausführlich dokumentiert. Heartbeat kommt mit wenigen Einträgen in der Konfigurationsdatei »/etc/ha.d/ha.cf« aus. Die ausführlichen Kommentare im mitgelieferten Original wurden zugunsten der besseren Übersicht entfernt. Die Datei hält die grundlegenden Eigenschaften von Heartbeat fest, etwa welche Knoten wie am Cluster beteiligt sind.

/etc/ha.d/ha.cf

# cp /usr/share/doc/heartbeat/ha.cf.gz /etc/ha.d/
# gunzip /etc/ha.d/ha.cf.gz
# nano -w /etc/ha.d/ha.cf

debugfile /var/log/ha-debug
logfile    /var/log/ha-log
logfacility    local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport    694
bcast    eth1
ucast eth1 192.168.245.129
ucast eth1 192.168.245.130
auto_failback off
node    knoten1
node    knoten2
crm yes

/etc/ha.d/haresources

# nano -w /etc/ha.d/haresources

knoten1 192.168.1.100 drbddisk::daten Filesystem::/dev/drbd0::/daten::ext3

Die Ressourcendatei »/etc/haresources« legt fest, welche Dienste mit welcher IP-Adresse immer im Netz erscheinen sollen.

Die in dieser Datei stehenden Anwendungen dürfen natürlich nicht beim Systemboot geladen werden - ab jetzt ist Heartbeat für den korrekten Start der benötigten Programme zuständig. Erst wenn Heartbeat festgestellt hat, dass es selbst auf dem aktiven Knoten läuft, startet es die benötigten Programme. Die Datei »/etc/ha.d/haresources« muss unbedingt auf beiden Knoten den gleichen Inhalt haben.

/etc/ha.d/authkeys

Um den Cluster in Gang zu setzen, fehlt noch die »/etc/ha.d/authkeys«-Datei. Sie enthält in Klartext das Passwort für die Heartbeat-Verbindung und muss auf beiden Knoten gleich sein.

# nano -w /etc/ha.d/authkeys

auth 3
# 1 crc
3 md5 Passwort
# 2 sha1

Da ein im Klartext lesbares Passwort sicherheitskritisch ist, muss die Datei zwingend die Zugriffsrechte 600 haben.

# chown root:root /etc/ha.d/authkeys
# chmod 600 /etc/ha.d/authkeys

Die Authentifizierung nach »sha1« ist wohl die sicherste Methode unter den drei gezeigten. Bei einer sicheren Netzverbindung wie einem Crossover-Kabel ist überhaupt keine Schlüsselsignatur nötig; dann reicht »crc« völlig aus.

Verteilung und Konfigurationsdatei erstellen

Verteilung der Konfigurationsdateien:
# passwd (auf den übrigen Knoten)
# /usr/share/heartbeat/ha_propagate
# scp /etc/ha.d/haresources knoten2:/etc/ha.d/

Erstellen der Konfigurationsdatei für Heartbeat V2:
# rm -f /var/lib/heartbeat/crm/*
# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources

Heartbeat starten und überwachen:
# /etc/init.d/heartbeat start
# crm_mon -i 2

Datenwiederherstellung mittels drbd bei einem asynchronen System

Ein inkonsistentes DRBD, besser bekannt als "Split Brain" bedeutet, dass beide Nodes primär sind und beide auf die Ressource "Daten" schreiben. Das Ergebnis ist eine inkonsistente Ressource eben ein sogenanntes "Split Brain". Um das System wieder in einen konsistenten Zustand zu bringen, muss man sich der Daten auf einem der Nodes entledigen und mittels DRBD wieder synchronisieren.

# /etc/init.d/heartbeat stop
# /etc/init.d/drbd stop
# modprobe drbd
# drbdadm -- --discard-my-data connect <resource> (auf dem Node mit den "schlechten" Daten)
# drbdadm connect <resource> (Auf dem Node mit den "guten" Daten)
# /etc/init.d/drbd start
# /etc/init.d/heartbeat start

Ein inkonsistentes DRBD gibt es meistens, wenn der Linuxcluster resp. heartbeat falsch konfiguriert ist. Nach der Wiederherstellung der Resource sollte man also den Grund eruieren und den Fehler beheben.

DRBD mit vorhandenen Daten erstellen

ACHTUNG unbedingt Backup erstellen.


Um ein DRBD-Device mit Partitionen zu erstellen, die bereits Daten beinhalten, muss man die Metadaten auf einer andere Partition erstellen. Diese Partition darf kein Dateisystem oder swap enthalten. Die Grösse der Metadaten-Partition richtet sich nach der Grösse des künftigen DRBD-Devices.

Block device size

DRBD meta data

1 GB

2 MB

100 GB

5 MB

1 TB

33 MB

4 TB

128 MB

Hat man die Partition einmal erstellt, muss man in der drbd.conf den entsprechenden  Eintrag  machen. Hier auf die Partition /dev/sda5. Die Null in Klammer ist eine fortlaufende Zahl, da auf einer Partition mehrere "DRBD meta data" erstellt werden können.

Ausschnitt aus der drbd.conf

----schnipp

  on knoten1 {
    device    /dev/drbd0;
    disk    /dev/sdb1;
    address    192.168.245.129:7791;
    meta-disk /dev/sda5[0];
  }

----schnapp

Nachdem die drbd.conf angepasst/erstellt wurde, erstellt man wie folgt die Meta-Daten resp. den DRBD-Device.

# /etc/init.d/drbd stop
# drbdadm create-md daten
# /etc/init.d/drbd start

Falls drbd nur auf einem Knoten gestartet wird, findet drbd den zweiten Knoten nicht und wartet auf denselben. Die Frage "To abort waiting enter 'yes' []:" kann mit "yes" beantworetet werden.

Anschliessend setzen wir die Partition mit den Daten auf "primary" mit der Option -o (--overwrite-data-of-peer). Damit bleiben die Daten auf der Partition /dev/sdb1 erhalten.

# drbdsetup /dev/drbd0 primary -o

So das wars, wenn die Ausgabe von /proc/drbd UpToDate ist, kann die Partition gemountet werden.

# more /proc/drbd
version: 8.0.11 (api:86/proto:86)
GIT-hash: b3fe2bdfd3b9f7c2f923186883eb9e2a0d3a5b1b build by phil@mescal, 2008-02-12 11:56:43
 0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r---
    ns:0 nr:0 dw:256 dr:40 al:2 bm:0 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/127 hits:24 misses:2 starving:0 dirty:0 changed:

# mount -t ext3 /dev/drbd0 /daten/


|  bw11.ch  |