Hochverfügbares Storage mit GlusterFS auf CentOS 7 – Spiegelung auf zwei Speicherservern

Dieses Tutorial zeigt, wie man einen hochverfügbaren Speicher mit zwei Speicherservern (CentOS 7.2) einrichtet, die GlusterFS verwenden. Jeder Speicherserver ist ein Spiegel des anderen Speicherservers, und Dateien werden automatisch auf beide Speicherserver repliziert. Das Client-System (auch CentOS 7.2) kann auf den Speicher zugreifen, als wäre es ein lokales Dateisystem. GlusterFS ist ein geclustertes Dateisystem, das bis zu mehreren Peta-Bytes skalierbar ist. Es aggregiert verschiedene Speicherbausteine über Infiniband RDMA oder TCP/IP-Verbindung zu einem großen parallelen Netzwerk-Dateisystem. Speicherbausteine können aus jeder gängigen Hardware wie x86_64-Servern mit SATA-II-RAID und Infiniband HBA hergestellt werden.

1 Vorbemerkung

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

  • server1.example.com: IP-Adresse 192.168.0.100 (Server)
  • server2.example.com: IP-Adresse 192.168.0.101 (Server)
  • client1.example.com: IP-Adresse 192.168.0.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 so bearbeiten, dass sie auf allen drei Systemen wie folgt aussieht:

nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100   server1.example.com     server1
192.168.0.101   server2.example.com     server2
192.168.0.102   client1.example.com     client1

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

(Es ist auch möglich, im folgenden Setup IP-Adressen anstelle von Hostnamen zu verwenden. Wenn Sie lieber IP-Adressen verwenden, müssen Sie sich nicht darum kümmern, ob die Hostnamen aufgelöst werden können oder nicht.)

2 Zusätzliche Repositories aktivieren

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

Zuerst importieren wir die GPG-Schlüssel für Softwarepakete:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Dann aktivieren wir das EPEL 7-Repository auf unseren CentOS-Systemen:

yum -y install epel-release
yum -y install yum-priorities

Bearbeiten Sie /etc/yum.repos.d/epel.repo…..

nano /etc/yum.repos.d/epel.repo

…. und fügen Sie die Zeilenpriorität=10 zum Abschnitt[epel] hinzu:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Dann aktualisieren wir unsere bestehenden Pakete auf dem System:

yum -y update

3 Einrichten der GlusterFS-Server

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

GlusterFS ist im Repository der CentOS Storage Special Interest Group verfügbar. Installieren Sie das Repository mit diesem Befehl:

yum -y install centos-release-gluster

Installieren Sie dann den GlusterFS-Server wie folgt:

yum -y install glusterfs-server

Erstellen Sie die Systemstartup-Links für den Gluster-Daemon und starten Sie ihn:

systemctl enable glusterd.service
systemctl start glusterd.service

Der Befehl

glusterfsd --version

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

[root@server1 ~]# glusterfsd --version
glusterfs 3.7.12 built on Jun 24 2016 14:11:19
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2013 Red Hat, Inc. <http://www.redhat.com/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.

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

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 aus ausführen, da die Konfiguration zwischen den GlusterFS-Knoten repliziert wird – stellen Sie einfach 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.

Der Status des vertrauenswürdigen Speicherpools sollte nun ähnlich sein:

gluster peer status
[root@server1 ~]# gluster peer status
Number of Peers: 1
Hostname: server2.example.com
Uuid: 582e10da-aa1b-40b8-908c-213f16f57fe5
State: Peer in Cluster (Connected)

Als nächstes erstellen wir die Freigabe namens testvol mit zwei Replikaten (bitte beachten Sie, dass die Anzahl der Replikate gleich der Anzahl der Server ist, da wir die Spiegelung einrichten wollen) auf server1.example.com und server2.example.com im Verzeichnis /data (diese werden erstellt, wenn sie nicht existieren):

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

Starten Sie die Lautstärke:

gluster volume start testvol

Das Ergebnis sollte sein:

[root@server1 ~]# gluster volume start testvol
volume start: testvol: success
[root@server1 ~]#

Es ist möglich, dass der obige Befehl Ihnen sagt, 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.

Wenn Sie so eine Ausgabe erhalten…..

[root@server1 ~]# netstat -tap | grep glusterfsd
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:49148 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:49148 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49150 server1.example.c:24007 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:49142 ESTABLISHED 22880/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:49149 ESTABLISHED 22880/glusterfsd
[root@server1 ~]#

….. alles ist in Ordnung, aber wenn du keine Ausgabe bekommst…..

[root@server2 ~]# netstat -tap | grep glusterfsd
[root@server2 ~]#

….. starten Sie den GlusterFS-Daemon auf dem entsprechenden Server (hier server2.example.com) neu:

server2.example.com:

systemctl restart glusterd.service

Überprüfen Sie dann die Ausgabe von…..

netstat -tap | grep glusterfsd

…. wieder auf diesem Server – so sollte es nun aussehen:

[root@server2 ~]# netstat -tap | grep glusterfsd
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:49140 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:49149 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:49143 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:49142 ESTABLISHED 10971/glusterfsd
tcp 0 0 server2.example.c:49150 server2.example.c:24007 ESTABLISHED 10971/glusterfsd
[root@server2 ~]#

Nun zurück zu server1.example.com:

server1.example.com:

Sie können den Status des Datenträgers mit dem Befehl

gluster volume info

[root@server1 ~]# gluster volume info

Volume Name: testvol
Type: Replicate
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
Options Reconfigured:
performance.readdir-ahead: on
[root@server1 ~]#

Standardmäßig können sich alle Clients mit dem Volume verbinden. Wenn Sie nur client1.example.com (= 192.168.1.102) Zugriff gewähren möchten, führen Sie run aus:

gluster volume set testvol auth.allow 192.168.1.102

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

Die Volumeninformation sollte nun den aktualisierten Status anzeigen:

gluster volume info
[root@server1 ~]# gluster volume info
Volume Name: testvol
Type: Replicate
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data
Brick2: server2.example.com:/data
Options Reconfigured:
auth.allow: 192.168.1.102
performance.readdir-ahead: on
[root@server1 ~]#

4 Einrichten des GlusterFS-Clients

client1.example.com:

Auf dem Client können wir den GlusterFS-Client wie folgt installieren:

yum -y install glusterfs-client

Dann erstellen wir das folgende Verzeichnis:

mkdir /mnt/glusterfs

Das ist es! Nun können wir das GlusterFS-Dateisystem mit dem folgenden Befehl auf /mnt/glusterfs mounten:

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

(Anstelle von server1.example.com kannst du auch server2.example.com im obigen Befehl verwenden!)

Sie sollten nun den neuen Anteil in den Ausgaben von….. sehen.

mount
[root@client1 ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930336k,nr_inodes=232584,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/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/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=188060k,mode=700)
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)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
[root@client1 ~]#

…. und…. und….

df -h
[root@client1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.3G 27G 5% /
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 910M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/sda1 497M 192M 306M 39% /boot
tmpfs 184M 0 184M 0% /run/user/0
server1.example.com:/testvol 28G 12G 17G 41% /mnt/glusterfs
[root@client1 ~]#

Anstatt die GlusterFS-Freigabe manuell auf dem Client zu mounten, fügen Sie den Mount-Befehl der Datei /etc/rc.local hinzu. Ich werde es nicht zu /etc/fstab hinzufügen, da rc.local immer ausgeführt wird, nachdem das Netzwerk hochgefahren ist, was für ein Netzwerk-Dateisystem erforderlich ist.

Öffnen Sie /etc/rc.local und fügen Sie die folgende Zeile hinzu:

nano /etc/rc.local
[...]
/usr/sbin/mount.glusterfs server1.example.com:/testvol /mnt/glusterfs

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

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

reboot

Nach dem Neustart sollten Sie die Freigabe in den Ausgaben von…..

df -h

…. und…. und….

mount

5 Prüfung

Lassen Sie uns nun einige Testdateien auf der GlusterFS-Freigabe erstellen:

client1.example.com:

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

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

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

ls -l /data
[root@server1 ~]# ls -l /data
total 0
-rw-r--r--. 2 root root 0 Jul 1 2016 test1
-rw-r--r--. 2 root root 0 Jul 1 2016 test2
[root@server1 ~]

Jetzt haben wir server1.example.com heruntergefahren und einige Dateien auf der GlusterFS-Freigabe auf client1.example.com hinzugefügt/gelöscht.

server1.example.com:

shutdown -h now

client1.example.com:

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

Die Ausführung der Befehle kann einige Zeit in Anspruch nehmen, da der Glusterfs auf Server2 wechselt, nachdem er Server1 nicht mehr erreichen kann. Wir können hier die Fehlertoleranz des Systems sehen, da wir noch an unserer Datenspeicherfreigabe arbeiten können, wenn Server1 offline ist. Die Änderungen sollten im Verzeichnis /data auf server2.example.com sichtbar sein:

server2.example.com:

ls -l /data
[root@server2 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4

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

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test2
[root@server1 ~]#

Wie du siehst, server1.example.comhat die Änderung automatisch synchronisiert. Falls die Änderung noch nicht synchronisiert wurde, dann ist dies einfach zu beheben, wir müssen nur einen Lesebefehl auf der GlusterFS-Freigabe aufrufen. client1.example.com, z.B:

client1.example.com:

ls -l /mnt/glusterfs/
[root@client1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4
[root@server1 ~]#

Werfen Sie nun noch einmal einen Blick in das Verzeichnis /data auf server1.example.com, und Sie sollten sehen, dass die Änderungen auf diesen Knoten repliziert wurden:

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data
total 8
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4
[root@server1 ~]#

6 Links

Das könnte Dich auch interessieren …