Cluster-Dateisystem OCFS2 einfach gemacht

faberfoto, 123RF

Teile und herrsche

Zwei Cluster-Dateisysteme liefert der gewöhnliche Linux-Kernel mit aus – OCFS2 ist seit 2.6.16 dabei und damit sogar dienstälter als GFS2. Obwohl hinter den Kulissen nicht trivial, ist es doch recht einfach aufzusetzen. Wie Sie das machen, zeigt der folgende Workshop.

Sollen zwei oder mehr Recher auf ein und denselben Datenbestand zugreifen, gibt es bei Linux- und Unix-Systemen mehrere konkurrierende Ansätze. Einen Überblick über verschiedene Technologien gibt der Kasten "Shared Filesystems". Dieser Artikel nimmt das Oracle Cluster File System 2 (OCFS2, [1]) unter die Lupe, das – wie der Name schon andeutet – vor allem für Cluster-Setups mehrerer Server geeignet ist.

Shared Filesystems

Die Familie der Shared-Dateisysteme ist recht bunt gemischt. Per Definition ist allen gemeinsam, dass sie mehreren Rechnern gleichzeitig Zugriff auf bestimmte Daten erlauben. Die Unterschiede liegen in der Art und Weise, wie diese Anforderung umgesetzt ist. Da sind auf der einen Seite die so genannten Netzwerk-Dateisysteme, deren populärster Vertreter im Unix/Linux-Umfeld das Network Filesystem (NFS) ist [2]. Es ist für nahezu alle Betriebssysteme verfügbar und erfordert praktisch nur einen TCP/IP-Stack im Betriebssystem. Dazu kommt ein recht einfaches Setup. Ein anderer Vertreter der Netzwerk-Dateisysteme ist das Andrew Filesystem (AFS), das es mit Open AFS auch als freie Implementierung gibt [3].

Auf der anderen Seite stehen die so genannten Cluster-Dateisysteme. Bevor Rechner auf die geteilten Daten zugreifen können, müssen sie erst dem Cluster beitreten. Das Setup des Clusters erfordert zusätzliche Infrastruktur, beispielsweise zusätzliche I/O-Karten, Cluster-Software und natürlich die Konfiguration. Die Cluster-Dateisysteme unterteilen sich nochmals je nach der Art und Weise, wie sie die Daten ablegen. Bei den Cluster-Dateisystemen mit Shared-Disks lesen und schreiben mehrere Rechner auf denselben Datenträger. Die I/O erfolgt über Fibre Channel (klassisches SAN) oder TCP/IP (iSCSI). Die bekanntesten Vertreter im Linux-Umfeld sind das Oracle Cluster Filesystem (OCFS2) und das Global Filesystem (GFS2). Neueren Datums sind die parallelen Cluster-Dateisysteme. Hier sind die Daten über die beteiligten Rechner verteilt. Lustre [4] und Ceph [5] sind bekannte Vertreter dieser Technologie.

Wer ein auf Shared Disks basierendes Cluster-Dateisystem aufsetzen will, muss zunächst ein paar Dinge beachten. Als Erstes muss der Administrator das Grundgerüst eines Clusters aufbauen. Dazu gehören die Informationen, welche Rechner zum Cluster gehören, ihre Erreichbarkeit per TCP/IP und der Name des Clusters. Im Falle von OCFS2 leistet dies eine einzelne Ascii-Datei, die in Listing 1 zu sehen ist.

Listing 1

/etc/ocfs2/cluster.conf

01 node:
02         ip_port = 7777
03         ip_address = 192.168.0.1
04         number = 0
05         name = node0
06         cluster = ocfs2
07 node:
08         ip_port = 7777
09         ip_address = 192.168.0.2
10         number = 1
11         name = node1
12         cluster = ocfs2
13 cluster:
14         node_count = 2
15         name = ocfs2

Die zweite zu lösende Aufgabe bei Cluster-Dateisystemen ist der kontrollierte und geordnete Zugriff auf die Daten, zum Beispiel mit File Locking, das Konflikte vermeiden soll. Der Distributed Lock Manager (DLM) sorgt bei OCFS2 dafür, dass keine Inkonsistenzen im Dateisystem auftreten. Eine extra Konfiguration ist nicht nötig – das Initialisieren des OCFS2-Clusters startet auch den DLM. Aber das beste File Locking nützt nichts, wenn der schreibende Rechner außer Kontrolle gerät. Dann hilft nur, dem Rechner das Schreiben zu verwehren, also das so genannte Fencing. OCFS2 ist hier recht einfach gestrickt und beherrscht nur Self-Fencing: Stellt ein Knoten fest, dass er nicht mehr sauber in den Cluster integriert ist, schließt er sich selbst durch eine Kernel-Panic aus. Wie das DLM setzt auch Self-Fencing bei OCFS2 keine besondere Konfiguration voraus. Steht die Cluster-Konfiguration und ist auf alle beteiligten Knoten verteilt, ist die Hauptarbeit für ein funktionierendes OCFS2 also bereits getan. Dann ist alles ganz einfach: Cluster starten, gegebenenfalls OCFS2 anlegen, das Dateisystem mounten und fertig.

Abbildung 2: Unspektakulär: Der OCFS2-Mountvorgang

Erste Schritte

Wie erwähnt ist OCFS2 ein auf Shared Disks basierendes Cluster-Dateisystem. Die Bandbreite von Techniken, die eine "geteilte" Platte bereitstellen, reicht vom teuren SAN via Fibre Channel über iSCSI bis zum kostengünstigen DRBD [6]. In diesem Artikel kommen iSCSI und NDAS (Network Direct Attached Storage) zum Einsatz. Die zweite Zutat zum OCFS2-Setup sind Rechner mit OCFS2-fähigem Betriebssystem. Am besten eignen sich Oracles Enterprise Linux, Suse Linux Enterprise Server, Open Suse, Red Hat Enterprise Linux und Fedora.

Die Softwaresuite für OCFS2 besteht aus den Paketen »ocfs2-tools« , »ocfs2console« (Abbildung 1) und den Kernelmodulen »ocfs2-`uname -r`« . Mit »ocfs2console« erhält der Admin eine grafische Oberfläche, um die Cluster-Konfiguration anzulegen und auf die beteiligten Knoten zu verteilen. Dies ist aber auch ebenso gut mit »vi« und »scp« möglich. Tabelle 1 listet auf, welche Aktionen das grafische Frontend zulässt und welchen Kommandozeilen-Tools dies entspricht. Ist die Cluster-Konfiguration angelegt, startet »/etc/init.d/o2cb online« das Subsystem (Listing 2). Das Init-Skript lädt die Kernelmodule und stellt ein paar Defaultwerte für Heartbeat und Fencing ein.

Abbildung 1: Cluster-Konfiguration mit dem GUI-Tool ocfs2console.

Tabelle 1

<C>ocfs2console<C> und <C>ocfs2-tools<C>

Dateisystem-Funktion

GUI-Menü

CLI-Tool

Einhängen

Mount

mount.ocfs2

Abhängen

Unmount

umount

Anlegen

Format

mkfs.ocfs2

Prüfen

Check

fsck.ocfs2

Reparieren

Repair

fsck.ocfs2

Name ändern

Change Label

tunefs.ocfs2

Maximale Anzahl Knoten

Edit Node Slot Count

tunefs.ocfs2

Listing 2

Starten des OCFS2-Subsystems

01 # /etc/init.d/o2cb online
02 Loading filesystem "configfs": OK
03 Mounting configfs filesystem at /sys/kernel/config: OK
04 Loading filesystem "ocfs2_dlmfs": OK
05 Mounting ocfs2_dlmfs filesystem at /dlm: OK
06 Starting O2CB cluster ocfs2: OK
07 #
08 # /etc/init.d/o2cb status
09 Driver for "configfs": Loaded
10 Filesystem "configfs": Mounted
11 Driver for "ocfs2_dlmfs": Loaded
12 Filesystem "ocfs2_dlmfs": Mounted
13 Checking O2CB cluster ocfs2: Online
14 Heartbeat dead threshold = 31
15   Network idle timeout: 30000
16   Network keepalive delay: 2000
17   Network reconnect delay: 2000
18 Checking O2CB heartbeat: Not active
19 #

Läuft das OCFS2-Grundgerüst, kann der Administrator das Cluster-Dateisystem anlegen. Im einfachsten Fall erledigt dies »mkfs.ocfs2 Gerätedatei« (Listing 3). Die Manpage zu »mkfs.ocfs« listet mögliche Optionen auf, die wichtigsten von ihnen sind in Tabelle 2 zu finden.

Tabelle 2

Wichtige Optionen von <C>mkfs.ocfs2<C>

Option

Zweck

b

Blockgröße

C

Clustergröße

L

Label

N

Maximale Anzahl von Rechnern mit gleichzeitigem Zugriff

J

Journal-Optionen

T

Dateisystemtyp (Optimierung auf viele kleine oder wenige große Dateien)

Listing 3

OCFS2 optimiert für Mailserver

01 # mkfs.ocfs2 -T mail -L data /dev/sda1
02 mkfs.ocfs2 1.4.2
03 Cluster stack: classic o2cb
04 Filesystem Type of mail
05 Filesystem label=data
06 Block size=2048 (bits=11)
07 Cluster size=4096 (bits=12)
08 Volume size=1011675136 (246991 clusters) (493982 blocks)
09 16 cluster groups (tail covers 8911 clusters, rest cover 15872 clusters)
10 Journal size=67108864
11 Initial number of node slots: 2
12 Creating bitmaps: done
13 Initializing superblock: done
14 Writing system files: done
15 Writing superblock: done
16 Writing backup superblock: 0 block(s)
17 Formatting Journals: done
18 Formatting slot map: done
19 Writing lost+found: done
20 mkfs.ocfs2 successful

Ist das Dateisystem angelegt, muss der Administrator es mounten. Das Mount-Kommando funktioniert analog zu ungeclusterten Dateisystemen. Beim Ein- wie auch beim Aushängen von OCFS2-Volumes ist mit einer kurzen Verzögerung zu rechnen: Beim Einhängen muss sich der ausführende Rechner beim Distributed Lock-Manager (DLM) anmelden. Analog löst der DLM beim Umount gehaltene Locks auf oder verwaltet sie über die verbliebenen Rechner.

Keine Panik

Die Dokumentation verweist auf verschiedene Optionen, die der Admin beim Mounten verwenden kann. Stellt OCFS2 einen Fehler in der Datenstruktur fest, schaltet es per Default auf Nur-Lesen um. In bestimmten Situationen kann aber ein Reboot zur Bereinigung der Situation besser sein. Das übernimmt die Mountoption »errors=panic« . Ebenfalls interessant ist die Option »commit=Sekunden« . Der Standardwert ist 5 und er bedeutet, dass OCFS2 alle 5 Sekunden die Daten auf die Platte schreibt. Im Falle eines Crash hat man – dank Journaling – ein konsistentes Dateisystem und höchstens die Arbeit der letzten 5 Sekunden verloren. In die gleiche Richtung geht die Mountoption, die den Umgang mit den Daten beim Journaling festgelegt. Mit der neusten Version schreibt OCFS2 erst alle Daten auf die Platte, bevor es das Journal aktualisiert. Mit »date=writeback« erzwingt der Admin den von früheren Versionen bekannten Modus.

Der frisch gebackene OCFS2-Admin wundert sich vielleicht, dass trotz Eintrags in der »/etc/fstab« das OCFS2-Volume nach einem Reboot des Rechners nicht verfügbar ist. Für die Reboot-Resistenz des OCFS2-Mounts sorgt das mitgelieferte Init-Skript »/etc/init.d/ocfs2« . Einmal aktiviert scannt dieses Skript die Datei »/etc/fstab« nach OCFS2-Einträgen und bindet die entsprechenden Dateisysteme ein.

Ähnlich wie bei Ext 3/4 hat der Administrator auch nach dem Anlegen des Dateisystems die Möglichkeit, einige Eigenschaften zu verändern – ohne dabei Daten zu zerstören. Dafür steht das Werkzeug »tunefs.ocfs2« zur Verfügung. Wächst der Cluster unerwartet, sollen also mehr Rechner gleichzeitig auf das OCFS2 zugreifen können, wird eine zu klein gewählte Option »N« beim »mkfs.ocfs2« schnell zum Problem. Mit »tunefs.ocfs2« verändert der Admin dies im Handumdrehen. Gleiches trifft für die Größe des Journals zu (Listing 4).

Listing 4

Einstellung mit tunefs.ocfs2

01 # tunefs.ocfs2 -Q "NumSlots = %N\n" /dev/sda1
02 NumSlots = 2
03 # tunefs.ocfs2 -N 4 /dev/sda1
04 # tunefs.ocfs2 -Q "NumSlots = %N\n" /dev/sda1
05 NumSlots = 4
06 #
07 # tunefs.ocfs2 -Q "Label = %V\n" /dev/sda1
08 Label = data
09 # tunefs.ocfs2 -L oldata /dev/sda1
10 # tunefs.ocfs2 -Q "Label = %V\n" /dev/sda1
11 Label = oldata
12 #

Ähnliche Artikel

comments powered by Disqus