Verteilter Storage mit GlusterFS (Replikation mit 2 Nodes)

Datum

Ich suchte nach einer Möglichkeit, wie folgende Anforderungen am leichtesten erfüllt werden:

  1. ein Verzeichnis auf verschiedene Nodes replizieren, dass der Datenbestand immer aktuell ist (RAID1)
  2. das Verzeichnis muss permanent von allen Nodes beschreibbar sein, ohne das man, wie bei DRBD, einen anderen Node zum Master macht
  3. das Verzeichnis immer noch alle Daten besitzt, selbst wenn ein anderer Node inaktiv ist

Daher fiel meine Wahl auf GlusterFS und zwar in dem Modus Replicated Storage (mehrere Server, die die Daten untereinander gespiegelt speichern und diese den Clients bereitstellen)

Vorbereitungen

Ich habe auf den beiden Nodes jeweils eine extra Partition (/dev/sdb1) zur Verfügung gestellt, welche ext4 formatiert wurden.

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   18G  0 disk 
├─sda1   8:1    0  1.5G  0 part [SWAP]
└─sda2   8:2    0 16.6G  0 part /
sdb      8:16   0    8G  0 disk 
└─sdb1   8:17   0    8G  0 part 

Ich möchte, dass auf dem ersten Node der Ordner /data1 und auf dem zweiten Node der Ordner /data2 für die Replikation verwendet wird.
Deshalb mounte ich die extra Partition entsprechend:
erster Node:
# mount /dev/sdb1 /data1

zweiter Node:
# mount /dev/sdb1 /data2

Falls noch nicht vorhanden, installieren wir die glusterfs-Tools auf beiden Nodes:
unter OpenSUSE:
# zypper in glusterfs

die Pakete sollten bei so ziemlich jeder aktuellen Linux-Distro in den entsprechenden Paketquellen verfügbar sein.
Anschließend starten wir den entsprechenden Daemon per Systemd:
# systemctl start glusterd.service

noch ein prüfender Blick ob der Start erfolgreich war:

# systemctl status glusterd.service 
● glusterd.service - GlusterFS, a clustered file-system server
   Loaded: loaded (/usr/lib/systemd/system/glusterd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-02-06 18:51:37 CET; 13s ago
  Process: 1489 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid (code=exited, status=0/SUCCESS)
 Main PID: 1534 (glusterd)
    Tasks: 11 (limit: 512)
   CGroup: /system.slice/glusterd.service
           ├─1534 /usr/sbin/glusterd -p /var/run/glusterd.pid
           └─1968 /usr/sbin/glusterfs -s localhost --volfile-id gluster/glustershd -p /var/lib/glusterd/glustershd/run/glustershd.pid -l /var/log/glusterfs/glustershd.log -S /var/run/70c01c4ca127bd5a9dd6d047e...

Feb 06 18:51:33 opensuse_web01 systemd[1]: Starting GlusterFS, a clustered file-system server...
Feb 06 18:51:37 opensuse_web01 systemd[1]: Started GlusterFS, a clustered file-system server.

Des weiteren sollte GlusterFS automatisch starten, dass erledigt:
# systemctl enable glusterd.service

Wenn der Dienst auf allen entsprechenden Nodes läuft, können wir die ersten Verbindungstests starten:

# gluster peer probe web02
peer probe: success.

Erstellen des gespiegelten Volumes

Wenn die Verbindungstests erfolgreich waren, können wir nun mit der Initialisierung des gespiegelten Volumes starten, welches wir glustervol1 nennen.
Den folgenden Befehl führe ich auf dem ersten der beiden Nodes aus:

# gluster volume create glustervol1 replica 2 transport tcp web01:/data1 web02:/data2 force
Creation of volume glustervol1 has been successful. Please start the volume to access data.

Das force wird nur benötigt, wenn Ordner eingebunden werden soll, welche direkt unter / erstellt sind.
Sofern noch nicht vorhanden, erstellt dieses create die entsprechenden Ordner automatisch.
Wenn der create -Prozess erfolgreich durchgelaufen ist, starten wir das Volumen:

# gluster volume start glustervol1
Starting volume glustervol1 has been successful.

und prüfen den Status:

# gluster volume info
Volume Name: glustervol1
Type: Replicate
Volume ID: 98477714-0883-4bee-b580-82aa1d7658f2
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: web01:/data1
Brick2: web02:/data2

Einbinden des gespiegelten Volumes

Nun mounten wir das entstandene Volumen in das gewünschte Verzeichnis (es sollte existieren)…

auf dem ersten Node (web01):
# mount -t glusterfs web01:/glustervol1 /srv/www/htdocs

auf dem zweiten Node (web02):
# mount -t glusterfs web02:/glustervol1 /srv/www/htdocs

Wenn diese Schritt erfolgreich waren, sollten sich die Daten innerhalb der gemounteten Verzeichnisse spiegeln, d.h. wenn ich auf einem der Nodes etwas unter /srv/www/htdocs speichere sollte es auf dem anderen Node im entsprechenden Verzeichnis erscheinen.

Sollte folgende Warnung auftauchen: WARNING: getfattr not found, certain checks will be skipped.. hilft ein
apt install attr.

Ein Eintrag in der /etc/fstab sieht dann wie folgt aus:
web01:/glustervol1 /srv/www/htdocs glusterfs defaults,_netdev 0 0
bzw.
web02:/glustervol1 /srv/www/htdocs glusterfs defaults,_netdev 0 0

Autor
Kategorien Dateisysteme, Linux

PRTG Map