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
- GlusterFS: http://www.gluster.org/
- GlusterFS 3.2 Dokumentation: http://download.gluster.com/pub/gluster/glusterfs/3.2/Documentation/AG/html/index.html
- CentOS: http://www.centos.org/