GlusterFS – Ein verteiltes Dateisystem

In diesem Blogpost möchte ich euch das verteilte Dateisystem „GlusterFS“ vorstellen. Ich nutze es um meine verschlüsselten Backups redundant auf zwei Servern zu verteilen, oder um kleine VPS mit mehr Speicher aufzuwerten.

Wie man GlusterFS installiert und konfiguriert zeige ich im Folgenden.

Die Voraussetzungen

Da ich euch zeigen möchte wie man einen redundanten verteilten Speicher aufbaut, müssen einige Voraussetzungen erfüllt werden.

  • Zwei Server A, B
  • „fuse“ Kernelmodul muss verfügbar/geladen sein – Bei OVZ-Containern den Provider darum bitten
  • GlusterFS in der aktuellsten Version (3.5.2)

Optimal wären noch folgende Eigenschaften

  • Die Server sollten ähnlich viel Speicherplatz haben
  • Nach Möglichkeit geringe Latenz zwischen den Servern

Installation von GlusterFS

GlusterFS teilt sich in zwei Teile auf: Den Server und den Client. Die Serverversion muss man logischerweise auf allen beteiligten Storageservern installieren.

$ sudo apt-get install glusterfs-server

Die Clientversion entsprechend nur auf Systemen die sich zum Storage verbinden sollen. In unserem Szenario reicht es aus, wenn ein Storageserver auf sich selbst zugreifen kann.

$ sudo apt-get install glusterfs-client

An dieser Stelle solltet ihr überprüfen, ob die installierte Version auf allen Servern identisch ist. Unter Debian ist im „stable“-Repository nur eine veraltete Version vorhanden. Man sollte sich kurz überlegen, ob man nicht aus dem „testing“-Repository die aktuellste (Test)Version bezieht.

$ gluster --version

Konfiguration der Storageserver

GlusterFS arbeitet nicht gerne mit IP-Adressen, sondern verlangt Hostnamen von uns. Wir müssen daher sicherstellen, dass alle Storageserver einen Namen bekommen und diese Zuweisung auch allen bekannt ist. In einem größeren Setup würde man dies über einen (internen) DNS Server lösen – bei uns soll es ausreichen, wenn wir die Einträge in die /etc/hosts packen.

10.0.0.1 ServerA 
10.0.0.2 ServerB

Die IP-Adressen sollten natürlich angepasst werden. Ich empfehle GlusterFS im VPN zwischen den Servern zu betreiben, da die übertragenden Daten nicht verschlüsselt werden.

Nutzt man eine Firewall, dann ist jetzt der Zeitpunkt gekommen um die ersten Ports freizuschalten. Der Port 24007 (tcp) sollte auf beiden Systemen freigeschaltet werden.

Bevor wir erste Dateisysteme anlegen, müssen sich die Server erstmal kennen lernen. Dazu führt man **nur** auf einem der Server (hier ServerA) folgendes Kommando aus:

$ sudo gluster peer probe ServerB

Die Antwort sollte euch mitteilen das die Server nun miteinander verbunden sind. Dies könnt ihr mit dem folgenden Kommando überprüfen:

$ sudo gluster peer status

Als nächstes müsst ihr euch entscheiden, wo ihr die „Bausteine“ (Bricks) ablegt. Ein oder mehrere Bausteine von verschiedenen Servern bilden dann später ein Dateisystem. Es wird empfohlen eine eigene Partition für Bricks anzulegen, jedoch kann man diese auch z.B. ins /home packen. Auf jeden Fall sollte genug Speicherplatz verfügbar sein. (Eine spätere Verschiebung führte bei mir zu vielen Kopfschmerzen)

$ sudo mkdir /home/glusterfs && sudo chmod 700 /home/glusterfs

Damit sollte die grundlegende Konfiguration abgeschlossen sein.

Anlegen eines verteilten Dateisystems

GlusterFS bringt eine eigene Konsole mit, welche man mit

$ sudo gluster

aufrufen kann.

Damit das verteilte Dateisystem sofort genutzt werden kann, öffnen wir zunächst den passenden Port. Pro Brick auf einem Server wird die Portnummer beginnend ab 49152 (tcp) hochgezählt. Da wir gleich auf jedem Server 1 Brick haben werden, solltet ihr den Port 49152 (tcp) auf beiden Servern öffnen.

Wir legen nun ein neues Dateisystem (Volume) an, welches redundant auf beide Server repliziert wird:

$ gluster> volume create mystorage replica 2 transport tcp ServerA:/home/glusterfs/mystorage ServerB:/home/glusterfs/mystorage

Sollte sich GlusterFS beschweren, dass die Bricks nicht auf einer eigenen Partition liegen, dann einfach noch „force“ an das obige Kommando anhängen.

Die Parameter sind die folgenden:

  • „mystorage“ : Name des neuen Volumes
  • „replica 2“ : Die Daten auf zwei Server replizieren
  • „transport tcp“ : TCP als Übertragungsprotokoll nutzen
  • „HOST:/path/to/brick“ : Die beteiligten Server und die entsprechenden Pfade zu den Bricks

Wenn man möchte, kann man noch die folgenden Optimierungen ausführen:

  • „volume set mystorage auth.allow IP/Range“ : Beschränken des Zugriffs auf die genannten IP-Adressen/bereiche
  • „volume quota mystorage enable“ && „volume quota mystorage limit-usage / 10G“ : Speicherplatz für das Volume auf 10GB begrenzen

Einbinden des Volumes

Nachdem wir nun erfolgreich ein Volume angelegt haben, kann es auf beliebig vielen Clients eingebunden werden.

$ sudo mkdir /media/storage
$ sudo mount -t glusterfs ServerA:/mystorage /media/storage

Zu beachten ist hier, dass nicht der Pfad zum Brick, sondern der Name des Volumes angegeben wird. Nach dem Mounten kann man den Mountpoint wie gewohnt nutzen.

Die Daten werden dabei immer auf die beiden ServerA/B repliziert und von dort auch wieder gelesen. Sollte einer der beiden Server ausfallen, so erkennen die Clients den Ausfall und schwenken automatisch auf den verbliebenen Server um.

~ Sebastian