Dezentrale Archivierung über vier Nodes mit GlusterFS auf CentOS 5.4

Version 1.0

Autor: Falko Timme

Folge mir auf Twitter!


Diese Anleitung zeigt wie man vier einzelne Archivserver auf denen CentOS läuft, kombiniert um einen großen Server für die Archivierung zu erhalten, die mittels GlusterFS dezentrale Archivierung erlaubt. Dem Client System (ebenfalls CentOS 5.4) wird es ermöglicht auf das Archiv zuzugreifen, als ob es ein lokales Dateisystem wäre.

GlusterFS ist ein gebündeltes Dateisystem, das auf mehrere Petabytes vergrößert werden kann. Es verbindet diverse Archivierungsbausteine über  Infiniband RDMA oder TCP/IP Zusammenschlatung in ein großes, paralleles Netzwerk-Dateisystem. Die Archivierungsbausteine können aus jeglicher Hardware bestehen wie x86 Servers mit SATA-II RAID und Infiniband HBA.

Es sei zu vermerken, dass diese Art der Archivierung (dezentrale Archivierung) keine  Zusätze für eine hohe Verfügbarkeit beinhaltet, wie es der Fall bei einer replizierten Archivierung ist.

Diese Anleitung kommt ohne Gewähr.

1 Vorbemerkung

In dieser Anleitung verwende ich fünf Systeme, vier Server  und ein Client:
  • server1.example.com: IP Adresse 192.168.0.100 (Server)
  • server2.example.com: IP Adresse 192.168.0.101 (Server)
  • server3.example.com: IP Adresse 192.168.0.102 (Server)
  • server4.example.com: IP Adresse 192.168.0.103 (Server)
  • client1.example.com: IP Adresse 192.168.0.104 (Client)
Alle fünf Systeme sollten in der Lage sein, die Hostnamen der anderen Systeme aufzulösen. Wenn das nicht durch DNS geschehen kann, solltest Du die  /etc/hosts Datei editieren, so dass es folgende Zeilen auf allen fünf Systemen enthält:

vi /etc/hosts

[...]
192.168.0.100 server1.example.com server1 192.168.0.101 server2.example.com server2 192.168.0.102 server3.example.com server3 192.168.0.103 server4.example.com server4 192.168.0.104 client1.example.com client1 [...]
(Es ist auch möglich, IP Adressen anstatt Hostnamen zu verwenden. Wenn Du IP Adressen bevorzugst, kannst Du das Problem vernachlässigen ob die Hostnamen aufgelöst werden können oder nicht.)

2 Die GlusterFS Server einrichten

server1.example.com/server2.example.com/server3.example.com/server4.example.com:

GlusterFS ist nicht als Paket für CentOS verfügbar, daher müssen wir selbst eins erstellen. Zuerst installieren die Grundaustattung:

yum groupinstall 'Development Tools'

yum groupinstall 'Development Libraries'

yum install libibverbs-devel fuse-devel

Dann laden wir die aktuellste GlusterFS Version hier herunter: http://www.gluster.org/download.php und erstellen das Paket wie folgt:

cd /tmp

wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.9.tar.gz

tar xvfz glusterfs-2.0.9.tar.gz

cd glusterfs-2.0.9

./configure

Am Ende des ./configure Befehls sollte man in etwa Folgendes sehen:

[...]

GlusterFS configure summary

===========================

FUSE client        : yes

Infiniband verbs   : yes

epoll IO multiplex : yes

Berkeley-DB        : yes

libglusterfsclient : yes

argp-standalone    : no

[root@server1 glusterfs-2.0.9]#

make &&
make install ldconfig

Überprüfe die GlusterFS Version hiernach, es sollte 2.0.9 sein:

glusterfs --version

[root@server1 glusterfs-2.0.9]# glusterfs --version

glusterfs 2.0.9 built on Mar 1 2010 15:34:50

Repository revision: v2.0.9

Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>

GlusterFS comes with ABSOLUTELY NO WARRANTY.

You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

[root@server1 glusterfs-2.0.9]#

Als Nächstes erstellen wir einige Verzeichnisse:

mkdir /data/
mkdir /data/export
mkdir /data/export-ns
mkdir /etc/glusterfs

Nun erstellen wir die GlusterFS Konfigurationsdatei für den Server /etc/glusterfs/glusterfsd.vol , welche das Verzeichnis definiert, das exportiert werden soll (/data/export) und welcher Client sich verbinden darf (192.168.0.104 = client1.example.com):

vi /etc/glusterfs/glusterfsd.vol

volume posix
type storage/posix option directory /data/export end-volume volume locks type features/locks subvolumes posix end-volume volume brick type performance/io-threads option thread-count 8 subvolumes locks end-volume volume server type protocol/server option transport-type tcp option auth.addr.brick.allow 192.168.0.104 subvolumes brick end-volume
Es ist übrigens möglich, Platzhalter für die IP Adressen zu verwenden, z.B. 192.168.* und dass man mehrere IP Adressen spezifizieren kann, indem man sie mit einem Komma, z.B. 192.168.0.104,192.168.0.105 trennt.

Hiernach erstellen wir folgenden Symlink...

ln -s /usr/local/sbin/glusterfsd /sbin/glusterfsd

... und dann die System-Startuplinks für den GlusterFS Server, um ihn hiernach zu starten:

chkconfig --levels 35 glusterfsd on
/etc/init.d/glusterfsd start

Dezentrale Archivierung über vier Nodes mit GlusterFS auf CentOS 5.4  Seite 2

3 Den GlusterFS Client einrichten

client1.example.com:

GlusterFS ist leider nicht als Paket für CentOS 5.4 erhältlich, daher erstellen wir es selbst. Zunächst installieren wir die Grundvoraussetzungen:

yum groupinstall 'Development Tools'

yum groupinstall 'Development Libraries'

yum install libibverbs-devel fuse-devel

Dann laden wir das fuse Kernelmodul...

modprobe fuse

... und erstellen die Datei  /etc/rc.modules mit den folgenden Inhalten, sodass das fuse Kernelmodul automatisch geladen wird sobald das System bootet:

vi /etc/rc.modules

modprobe fuse
Wir machen die Datei ausführbar:

chmod +x /etc/rc.modules

Dann laden wir die HGlusterFS 2.0.9 Quellen herunter (bitte beachte dass es sich dabei um die gleiche Version handelt wie die auf dem Server! ) und erstellen GlusterFS wie folgt:

cd /tmp
wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.9.tar.gz
tar xvfz glusterfs-2.0.9.tar.gz
cd glusterfs-2.0.9
./configure

Am Ende des ./configure Befehles, solltest Du in etwa Folgendes sehen:

[...]

GlusterFS configure summary

===========================

FUSE client        : yes

Infiniband verbs   : yes

epoll IO multiplex : yes

Berkeley-DB        : yes

libglusterfsclient : yes

argp-standalone    : no

make && make install
ldconfig

Überprüfe die GlusterFS Version hiernach, es sollte 2.0.9 sein:

glusterfs --version

[root@client1 glusterfs-2.0.9]# glusterfs --version
glusterfs 2.0.9 built on Mar 1 2010 15:58:06

Repository revision: v2.0.9

Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>

GlusterFS comes with ABSOLUTELY NO WARRANTY.

You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

[root@client1 glusterfs-2.0.9]#

Dann erstellen wir folgende zwei Verzeichnisse:

mkdir /mnt/glusterfs
mkdir /etc/glusterfs

Als Nächstes erstellen wir die Datei /etc/glusterfs/glusterfs.vol:

vi /etc/glusterfs/glusterfs.vol

volume remote1
type protocol/client option transport-type tcp option remote-host server1.example.com option remote-subvolume brick end-volume volume remote2 type protocol/client option transport-type tcp option remote-host server2.example.com option remote-subvolume brick end-volume volume remote3 type protocol/client option transport-type tcp option remote-host server3.example.com option remote-subvolume brick end-volume volume remote4 type protocol/client option transport-type tcp option remote-host server4.example.com option remote-subvolume brick end-volume volume distribute type cluster/distribute subvolumes remote1 remote2 remote3 remote4 end-volume volume writebehind type performance/write-behind option window-size 1MB subvolumes distribute end-volume volume cache type performance/io-cache option cache-size 512MB subvolumes writebehind end-volume
Bitte versichere Dich daß Du in den option remote-host Zeilen die richtigen Hostnamen oder IP Adressen verwendest!

Das war's! Nun können wir das GlusterFS Dateisystem zu /mnt/glusterfs mounten mit einem der folgenden Befehlen:

glusterfs -f /etc/glusterfs/glusterfs.vol /mnt/glusterfs

oder

mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs

Nun solltest Du die neue Einteilung in folgende Ausgabe sehen:

mount

[root@client1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/sda1 on /boot type ext3 (rw)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

glusterfs#/etc/glusterfs/glusterfs.vol on /mnt/glusterfs type fuse (rw,allow_other,default_permissions,max_read=131072)

[root@client1 ~]#

... und...

df -h

[root@client1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

29G  2.2G   25G   9% /

/dev/sda1              99M   13M   82M  14% /boot

tmpfs                 187M     0  187M   0% /dev/shm

glusterfs#/etc/glusterfs/glusterfs.vol

112G  2.3G  110G   2% /mnt/glusterfs

[root@client1 ~]#

server1.example.com, server2.example.com, server3.example.com, und server4.example.com haben jeweils etwa 28GB des Platzes des GlusterFS Dateisystems, so dass der erzeugte Anteil (share) in etwa die Grösse 4 x 28GB (112GB) hat.

Anstatt den GlusterFS Anteil manuell auf den Client zu mounten, kannst Du die /etc/fstab modifizieren, so dass der Anteil (share) automatisch gemountet wird sobald der Client bootet.

Öffne /etc/fstab und füge folgende Zeile hinzu:

vi /etc/fstab

[...]
/etc/glusterfs/glusterfs.vol /mnt/glusterfs glusterfs defaults 0 0
Um zu überprüfen ob der /etc/fstab funktioniert, starte den Client neu:

reboot

Nach dem Neustart, solltest Du den Anteil (share) in der Ausgabe finden:

df -h

... und...

mount


4 System testen

Erstellen wir nun zu Testzwecken enige Dateien auf den GlusterFS Anteil (share):

client1.example.com:

touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
touch /mnt/glusterfs/test5
touch /mnt/glusterfs/test6

Nun überprüfen wir das /data/export Verzeichnis auf server1.example.com, server2.example.com, server3.example.com, und server4.example.com. Du wirst feststellen, das jeder Archivierungsnode nur einen Teil der Dateien/Verzeichnisse des GlusterFS Anteils (share) auf diesem Client enthält:

server1.example.com:

ls -l /data/export

[root@server1 ~]# ls -l /data/export
total 0

-rw-r--r-- 1 root root 0 2010-02-22 20:15 test1

-rw-r--r-- 1 root root 0 2010-02-22 20:15 test2

-rw-r--r-- 1 root root 0 2010-02-22 20:15 test5

[root@server1 ~]#

server2.example.com:

ls -l /data/export

[root@server2 ~]# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2010-02-22 20:15 test4

[root@server2 ~]#

server3.example.com:

ls -l /data/export

[root@server3 ~]# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2010-02-22 20:15 test6

[root@server3 ~]#

server4.example.com:

ls -l /data/export

[root@server4 ~]# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2010-02-22 20:15 test3

[root@server4 ~]#


5 Links