Speicherlösungen · 9 min read · Jan 10, 2026

Hochverfügbare Speicherung mit GlusterFS auf Debian 8 - Spiegelung über zwei Speicherserver

Dieses Tutorial zeigt, wie man eine hochverfügbare Speicherung mit zwei Speicherservern (Debian Jessie) einrichtet, die GlusterFS verwendet. Jeder Speicherserver wird ein Spiegel des anderen Speicherservers sein, und Dateien werden automatisch über beide Speicherknoten repliziert. Das Client-System (ebenfalls Debian 8) kann auf den Speicher zugreifen, als wäre es ein lokales Dateisystem. GlusterFS ist ein clusterfähiges Dateisystem, das auf mehrere Petabyte skalierbar ist. Es aggregiert verschiedene Speicherbausteine über Infiniband RDMA oder TCP/IP-Verbindungen zu einem großen parallelen Netzwerkdateisystem. Speicherbausteine können aus beliebiger handelsüblicher Hardware bestehen, wie z.B. x86_64-Servern mit SATA-II-RAID und Infiniband HBA.

1 Vorbemerkung

In diesem Tutorial werde ich drei Systeme verwenden, zwei Server und einen Client:

  • server1.example.com: IP-Adresse 192.168.1.100 (Server)
  • server2.example.com: IP-Adresse 192.168.1.101 (Server)
  • client1.example.com: IP-Adresse 192.168.1.102 (Client)

Alle drei Systeme sollten in der Lage sein, die Hostnamen der anderen Systeme aufzulösen. Wenn dies nicht über DNS möglich ist, sollten Sie die Datei /etc/hosts bearbeiten, sodass sie auf allen drei Systemen wie folgt aussieht:

nano /etc/hosts
127.0.0.1 localhost  
192.168.1.100 server1.example.com server1  
192.168.1.101 server2.example.com server2  
192.168.1.102 client1.example.com client1  
  
  
# Die folgenden Zeilen sind wünschenswert für IPv6-fähige Hosts  
::1 localhost ip6-localhost ip6-loopback  
ff02::1 ip6-allnodes  
ff02::2 ip6-allrouters

(Es ist auch möglich, IP-Adressen anstelle von Hostnamen in der folgenden Einrichtung zu verwenden. Wenn Sie IP-Adressen verwenden möchten, müssen Sie sich keine Gedanken darüber machen, ob die Hostnamen aufgelöst werden können oder nicht.)

2 Einrichtung der GlusterFS-Server

server1.example.com/server2.example.com:

Die neueste GlusterFS-Version ist als Debian-Paket von gluster.org verfügbar. Wir können es wie folgt installieren:

Wir fügen den öffentlichen Schlüssel des gluster.org Debian-Repositorys auf beiden Servern hinzu.

wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/rsa.pub | apt-key add -

Dann fügen Sie das GlusterFS-Repository hinzu (der Befehl ist eine Zeile!)

echo deb http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/Debian/jessie/apt jessie main > /etc/apt/sources.list.d/gluster.list

und aktualisieren Sie die Repository-Liste.

apt-get update

Jetzt können wir die GlusterFS-Server-Software mit apt installieren.

apt-get -y install glusterfs-server

Der Befehl

glusterfsd --version

sollte jetzt die GlusterFS-Version anzeigen, die Sie gerade installiert haben (in diesem Fall 3.7.9):

root@server1:/# glusterfsd --version  
glusterfs 3.7.9 built on Mar 23 2016 05:24:49  
Repository revision: git://git.gluster.com/glusterfs.git  
Copyright (c) 2006-2013 Red Hat, Inc.   
GlusterFS kommt mit ABSOLUT NULL GARANTIE.  
Es wird Ihnen unter Ihrer Wahl der GNU Lesser  
General Public License, Version 3 oder einer späteren Version (LGPLv3  
oder später) oder der GNU General Public License, Version 2 (GPLv2),  
in allen Fällen, wie von der Free Software Foundation veröffentlicht, lizenziert.  
root@server1:/#

Wenn Sie eine Firewall verwenden, stellen Sie sicher, dass die TCP-Ports 111, 24007, 24008, 24009-(24009 + Anzahl der Bausteine über alle Volumes) auf server1.example.com und server2.example.com geöffnet sind.

Glusterfs soll seine Daten im Verzeichnis /data auf den Servern speichern. Dieser Speicherort kann ein normales Verzeichnis sein, wenn Sie eine kleinere Installation haben, oder Sie verwenden eine separate Festplattenpartition und mounten sie als /data.

Führen Sie auf beiden Servern aus:

mkdir /data

um das Datenverzeichnis zu erstellen.

Als nächstes müssen wir server2.example.com zum vertrauenswürdigen Speicherpool hinzufügen (bitte beachten Sie, dass ich alle GlusterFS-Konfigurationsbefehle von server1.example.com ausführe, aber Sie können sie auch von server2.example.com ausführen, da die Konfiguration zwischen den GlusterFS-Knoten repliziert wird - stellen Sie nur sicher, dass Sie die richtigen Hostnamen oder IP-Adressen verwenden):

server1.example.com:

Auf server1.example.com führen Sie aus

gluster peer probe server2.example.com
root@server1:/# gluster peer probe server2.example.com  
peer probe: success.  
root@server1:/#

Der Status des vertrauenswürdigen Speicherpools sollte jetzt ähnlich aussehen:

gluster peer status
root@server1:/# gluster peer status  
Number of Peers: 1
Hostname: server2.example.com  
Uuid: 0f7ee46c-6a71-4a31-91d9-6076707eff95  
State: Peer in Cluster (Connected)  
root@server1:/#

Als nächstes erstellen wir den Share mit dem Namen testvol mit zwei Replikaten (bitte beachten Sie, dass die Anzahl der Replikate der Anzahl der Server in diesem Fall entspricht, da wir eine Spiegelung einrichten möchten) auf server1.example.com und server2.example.com im Verzeichnis /data/testvol (dies wird erstellt, wenn es nicht existiert):

gluster volume create testvol replica 2 transport tcp server1.example.com:/data/testvol server2.example.com:/data/testvol force
root@server1:/# gluster volume create testvol replica 2 transport tcp server1.example.com:/data/testvol server2.example.com:/data/testvol force  
volume create: testvol: success: please start the volume to access data  
root@server1:/#

Starten Sie das Volume:

gluster volume start testvol
root@server1:/# gluster volume start testvol  
volume start: testvol: success  
root@server1:/#

Unser Testvolumen wurde erfolgreich gestartet.

Es ist möglich, dass der obige Befehl Ihnen mitteilt, dass die Aktion nicht erfolgreich war:

root@server1:~# gluster volume start testvol  
Starting volume testvol has been unsuccessful  
root@server1:~#

In diesem Fall sollten Sie die Ausgabe von…

server1.example.com/server2.example.com:

netstat -tap | grep glusterfsd

auf beiden Servern überprüfen.

Wenn Sie eine Ausgabe wie diese erhalten…

root@server1:/# netstat -tap | grep glusterfsd  
tcp 0 0 *:49152 *:* LISTEN 8007/glusterfsd  
tcp 0 0 server1.example.c:65533 server1.example.c:24007 ESTABLISHED 8007/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:65531 ESTABLISHED 8007/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:65532 ESTABLISHED 8007/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:65531 ESTABLISHED 8007/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:65526 ESTABLISHED 8007/glusterfsd  
root@server1:/#

… ist alles in Ordnung, aber wenn Sie keine Ausgabe erhalten…

root@server2:~# netstat -tap | grep glusterfsd  
root@server2:~#

… starten Sie den GlusterFS-Daemon auf dem entsprechenden Server (server1.example.com in diesem Fall):

server2.example.com:

service glusterfs-server restart

Überprüfen Sie dann erneut die Ausgabe von…

netstat -tap | grep glusterfsd

… auf diesem Server - es sollte jetzt so aussehen:

root@server2:/# netstat -tap | grep glusterfsd  
tcp 0 0 *:49152 *:* LISTEN 7852/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:65532 ESTABLISHED 7852/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:65526 ESTABLISHED 7852/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:65525 ESTABLISHED 7852/glusterfsd  
tcp 0 0 server2.example.c:65533 server2.example.c:24007 ESTABLISHED 7852/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:65524 ESTABLISHED 7852/glusterfsd  
root@server2:/#

Jetzt zurück zu server1.example.com:

server1.example.com:

Sie können den Status des Volumes mit dem Befehl

gluster volume info
root@server1:/# gluster volume info
Volume Name: testvol  
Type: Replicate  
Volume ID: 3fc9af57-ca56-4a72-ad54-3d2ea03e5883  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data/testvol  
Brick2: server2.example.com:/data/testvol  
Options Reconfigured:  
performance.readdir-ahead: on  
root@server1:/#

Standardmäßig können alle Clients eine Verbindung zum Volume herstellen. Wenn Sie nur client1.example.com (= 192.168.1.102) Zugriff gewähren möchten, führen Sie aus:

gluster volume set testvol auth.allow 192.168.1.102
root@server1:/# gluster volume set testvol auth.allow 192.168.1.102  
volume set: success  
root@server1:/#

Bitte beachten Sie, dass es möglich ist, Platzhalter für die IP-Adressen zu verwenden (wie 192.168.*) und dass Sie mehrere IP-Adressen durch Kommas getrennt angeben können (z.B. 192.168.1.102,192.168.1.103).

Die Volume-Info sollte jetzt den aktualisierten Status anzeigen:

gluster volume info

root@server1:/# gluster volume info

Volume Name: testvol  
Type: Replicate  
Volume ID: 3fc9af57-ca56-4a72-ad54-3d2ea03e5883  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data/testvol  
Brick2: server2.example.com:/data/testvol  
Options Reconfigured:  
auth.allow: 192.168.1.102  
performance.readdir-ahead: on  
root@server1:/#

3 Einrichtung des GlusterFS-Clients

client1.example.com:

Auf dem Client-System fügen wir zuerst den öffentlichen Schlüssel des gluster.org Debian-Repositorys hinzu.

wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/rsa.pub | apt-key add -

Dann fügen Sie das GlusterFS-Repository hinzu (der Befehl ist eine Zeile!)

echo deb http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/Debian/jessie/apt jessie main > /etc/apt/sources.list.d/gluster.list

und aktualisieren Sie die Repository-Liste.

apt-get update

Jetzt können wir den GlusterFS-Client wie folgt installieren.

apt-get -y install glusterfs-client

Dann erstellen wir das folgende Verzeichnis:

mkdir /mnt/glusterfs

Das war’s! Jetzt können wir das GlusterFS-Dateisystem mit dem folgenden Befehl in /mnt/glusterfs einhängen:

mount.glusterfs server1.example.com:/testvol /mnt/glusterfs

(Statt server1.example.com können Sie auch server2.example.com im obigen Befehl verwenden!)

Sie sollten jetzt den neuen Share in den Ausgaben von…

mount
root@client1:/# mount  
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)  
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)  
odev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=125556,mode=755)  
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)  
tmpfs on /run type tmpfs (rw,nosuid,relatime,size=204220k,mode=755)  
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)  
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)  
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)  
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)  
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)  
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)  
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)  
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)  
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)  
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)  
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)  
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)  
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)  
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)  
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=23,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)  
mqueue on /dev/mqueue type mqueue (rw,relatime)  
debugfs on /sys/kernel/debug type debugfs (rw,relatime)  
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)  
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw,relatime)  
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)  
server1.example.com:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)  
root@client1:/#

… und…

df -h
root@client1:/# df -h  
Filesystem Size Used Avail Use% Mounted on  
/dev/sda1 57G 1.1G 53G 2% /  
udev 10M 0 10M 0% /dev  
tmpfs 200M 4.6M 195M 3% /run  
tmpfs 499M 0 499M 0% /dev/shm  
tmpfs 5.0M 0 5.0M 0% /run/lock  
tmpfs 499M 0 499M 0% /sys/fs/cgroup  
server1.example.com:/testvol 57G 21G 34G 39% /mnt/glusterfs  
root@client1:/#

Anstatt den GlusterFS-Share manuell auf dem Client zu mounten, könnten Sie /etc/fstab ändern, sodass der Share automatisch beim Booten des Clients gemountet wird.

Öffnen Sie /etc/fstab und fügen Sie die folgende Zeile hinzu:

nano /etc/fstab
[...]  
server1.example.com:/testvol /mnt/glusterfs glusterfs defaults,_netdev 0 0

(Nochmals, anstelle von server1.example.com können Sie auch server2.example.com verwenden!)

Um zu testen, ob Ihre modifizierte /etc/fstab funktioniert, starten Sie den Client neu:

reboot

Nach dem Neustart sollten Sie den Share in den Ausgaben von…

df -h

… und…

mount

4 Testen der GlusterFS-Replikation

Jetzt erstellen wir einige Testdateien im GlusterFS-Share:

client1.example.com:

touch /mnt/glusterfs/test1  
touch /mnt/glusterfs/test2

Jetzt überprüfen wir das Verzeichnis /data auf server1.example.com und server2.example.com. Die Dateien test1 und test2 sollten auf jedem Knoten vorhanden sein:

server1.example.com/server2.example.com:

ls -l /data/testvol
root@server1:/# ls -l /data/testvol/  
total 0  
-rw-r--r-- 2 root root 0 Mar 23 2016 test1  
-rw-r--r-- 2 root root 0 Mar 23 2016 test2

Jetzt fahren wir server1.example.com herunter und fügen/löschen einige Dateien im GlusterFS-Share auf client1.example.com hinzu.

server1.example.com:

shutdown -h now

client1.example.com:

touch /mnt/glusterfs/test3  
touch /mnt/glusterfs/test4  
rm -f /mnt/glusterfs/test2

Die Änderungen sollten im Verzeichnis /data/testvol auf server2.example.com sichtbar sein:

server2.example.com:

ls -l /data/testvol
root@server2:/# ls -l /data/testvol  
total 8  
-rw-r--r-- 2 root root 0 Mar 23 08:06 test1  
-rw-r--r-- 2 root root 0 Mar 23 08:09 test3  
-rw-r--r-- 2 root root 0 Mar 23 08:09 test4  
root@server2:/#

Lassen Sie uns server1.example.com wieder starten und einen Blick auf das Verzeichnis /data werfen:

server1.example.com:

ls -l /data/testvol
root@server1:/# ls -l /data/testvol  
total 0  
-rw-r--r-- 2 root root 0 Mar 23 08:06 test1  
-rw-r--r-- 2 root root 0 Mar 23 08:09 test3  
-rw-r--r-- 2 root root 0 Mar 23 08:09 test4  
root@server1:/#

Wie Sie sehen, hat server1.example.com die Änderungen automatisch synchronisiert. Falls die Änderung noch nicht synchronisiert wurde, ist es einfach zu beheben, alles was wir tun müssen, ist, einen Lese-Befehl auf dem GlusterFS-Share auf client1.example.com auszuführen, z.B.:

client1.example.com:

ls -l /mnt/glusterfs/
root@client1:/# ls -l /mnt/glusterfs/  
total 0  
-rw-r--r-- 1 root root 0 Mar 23 08:06 test1  
-rw-r--r-- 1 root root 0 Mar 23 08:09 test3  
-rw-r--r-- 1 root root 0 Mar 23 08:09 test4  
root@client1:/#

5 Links

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.