Dieses Tutorial zeigt, wie Sie vier einzelne Speicherserver (auf denen Debian Lenny läuft) zu einem verteilten replizierten Speicher mit GlusterFS kombinieren. Die Knoten 1 und 2 (Replikation1) sowie 3 und 4 (Replikation2) werden sich gegenseitig spiegeln, und Replikation1 und Replikation2 werden zu einem größeren Speicherserver (Verteilung) zusammengefasst. Grundsätzlich ist dies RAID10 über das Netzwerk. Wenn Sie einen Server von Replikation1 und einen von Replikation2 verlieren, funktioniert das verteilte Volume weiterhin. Das Client-System (auch Debian Lenny) kann auf den Speicher zugreifen, als wäre es ein lokales Dateisystem. GlusterFS ist ein geclustertes Dateisystem, das auf mehrere Petabyte skaliert werden kann. Es aggregiert verschiedene Speicherbausteine über Infiniband-RDMA- oder TCP/IP-Verbindungen zu einem großen parallelen Netzwerkdateisystem. Storage Bricks können aus jeder handelsüblichen Hardware wie x86-64-Servern mit SATA-II-RAID und Infiniband-HBA hergestellt werden.
Ich gebe keine Garantie dafür, dass dies bei Ihnen funktioniert!
1 Vorbemerkung
In diesem Tutorial verwende ich fünf Systeme, vier Server und einen 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 dies nicht über DNS möglich ist, sollten Sie die Datei /etc/hosts so bearbeiten, dass sie auf allen fünf Systemen wie folgt aussieht:
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost 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 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts |
(Es ist auch möglich, IP-Adressen anstelle von Hostnamen im folgenden Setup 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 Einrichten der GlusterFS-Server
server1.example.com/server2.example.com/server3.example.com/server4.example.com:
GlusterFS ist nicht als Debian-Paket für Debian Lenny verfügbar, daher müssen wir es selbst bauen. Zuerst installieren wir die Voraussetzungen:
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev
Dann laden wir die neueste GlusterFS-Version von http://www.gluster.org/download.php herunter und erstellen sie wie folgt:
cd /tmp
wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.1.tar.gz
tar xvfz glusterfs-2.0.1.tar .gz
cd glusterfs-2.0.1
./configure --prefix=/usr> /dev/null
server1:/tmp/glusterfs-2.0.1# ./configure --prefix=/usr > /dev/null
Zusammenfassung der GlusterFS-Konfiguration
===========================
FUSE-Client : nein
Infiniband-Verben : nein
epoll IO multiplex : ja
Berkeley-DB :ja
libglusterfsclient : ja
mod_glusterfs : nein ()
argp-standalone : nein
server1:/tmp/glusterfs-2.0.1#
make &&make install
ldconfig
Der Befehl
glusterfs --version
sollte jetzt die GlusterFS-Version anzeigen, die Sie gerade kompiliert haben (in diesem Fall 2.0.1):
server1:/tmp/glusterfs-2.0.1# glusterfs --version
glusterfs 2.0.1 erstellt am 29. Mai 2009 17:23:10
Repository-Revision:5c1d9108c1529a1155963cb1911f8870a674ab5b
Copyright (c) 2006 -2009 Z RESEARCH Inc.
Für GlusterFS gilt ABSOLUT KEINE GEWÄHRLEISTUNG.
Sie dürfen Kopien von GlusterFS unter den Bedingungen der GNU General Public License weitergeben.
server1:/tmp/glusterfs-2.0.1#
Als nächstes erstellen wir ein paar Verzeichnisse:
mkdir /data/
mkdir /data/export
mkdir /data/export-ns
mkdir /etc/glusterfs
Jetzt erstellen wir die GlusterFS-Serverkonfigurationsdatei /etc/glusterfs/glusterfsd.vol, die definiert, welches Verzeichnis exportiert wird (/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 |
Bitte beachten Sie, dass für die IP-Adressen Wildcards verwendet werden können (z. B. 192.168.*) und mehrere IP-Adressen durch Komma getrennt angegeben werden können (z. B. 192.168.0.104,192.168.0.105).
Anschließend erstellen wir die Systemstartlinks für das glusterfsd-Init-Skript...
update-rc.d glusterfsd defaults
... und starte glusterfsd:
/etc/init.d/glusterfsd start
3 Einrichten des GlusterFS-Clients
client1.beispiel.com:
Auf dem Client müssen wir fuse und GlusterFS installieren. Anstatt das libfuse2-Paket aus dem Debian-Repository zu installieren, installieren wir eine gepatchte Version mit besserer Unterstützung für GlusterFS.
Zuerst installieren wir die Voraussetzungen erneut:
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev
Dann bauen wir Fuse wie folgt (Sie finden die neueste gepatchte Fuse-Version auf ftp://ftp.zresearch.com/pub/gluster/glusterfs/fuse/):
cd /tmp
wget ftp://ftp.zresearch.com/pub/gluster/glusterfs/fuse/fuse-2.7.4glfs11.tar.gz
tar -zxvf fuse-2.7.4glfs11.tar. gz
cd fuse-2.7.4glfs11
./configure
make &&make install
Danach bauen wir GlusterFS (genauso wie auf dem Server)...
cd /tmp
wget http://ftp.gluster.com/pub/gluster/glusterfs/2.0/LATEST/glusterfs-2.0.1.tar.gz
tar xvfz glusterfs-2.0.1.tar .gz
cd glusterfs-2.0.1
./configure --prefix=/usr> /dev/null
make &&make install
ldconfig
glusterfs --version
... und erstellen Sie die folgenden beiden 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 replicate1 type cluster/replicate subvolumes remote1 remote2 end-volume volume replicate2 type cluster/replicate subvolumes remote3 remote4 end-volume volume distribute type cluster/distribute subvolumes replicate1 replicate2 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 |
Stellen Sie sicher, dass Sie die richtigen Server-Hostnamen oder IP-Adressen in den Zeilen der Option remote-host verwenden!
Das ist es! Jetzt können wir das GlusterFS-Dateisystem mit einem der folgenden beiden Befehle in /mnt/glusterfs einhängen:
glusterfs -f /etc/glusterfs/glusterfs.vol /mnt/glusterfs
oder
mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs
Sie sollten nun die neue Freigabe in den Ausgaben von...
sehenmount
client1:/tmp/glusterfs-2.0.1# mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw, nosuid,mode=0755)
proc on /proc geben Sie proc (rw,noexec,nosuid,nodev) ein
sysfs on /sys geben Sie sysfs (rw,noexec,nosuid,nodev) ein
udev on /dev tippe tmpfs (rw,mode=0755)
tmpfs on /dev/shm tippe tmpfs (rw,nosuid,nodev)
devpts on /dev/pts tippe devpts (rw,noexec,nosuid,gid =5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/etc/glusterfs/glusterfs.vol on /mnt/glusterfs type fuse.glusterfs (rw, max_read=131072,allow_other,default_permissions)
client1:/tmp/glusterfs-2.0.1#
... und ...
df -h
client1:/tmp/glusterfs-2.0.1# df -h
Dateisystemgröße verwendet verfügbar. /lib/init/rw
udev 10m 80k 10m 1%/dev
tmpfs 126m 0 126m 0%/dev/shm
/etc/glusterfs/glusterfs.vol
48G 1.7 G 44G 4 % /mnt/glusterfs
client1:/tmp/glusterfs-2.0.1#
(Die Größe des verteilten Speichers wird durch Replikation1 + Replikation2 berechnet, wobei beide Replikationsvolumes so groß sind wie der kleinste Baustein.)
Anstatt die GlusterFS-Freigabe manuell auf dem Client zu mounten, könnten Sie /etc/fstab so ändern, dass die Freigabe automatisch gemountet wird, wenn der Client startet.
Öffnen Sie /etc/fstab und fügen Sie die folgende Zeile an:
vi /etc/fstab
[...] /etc/glusterfs/glusterfs.vol /mnt/glusterfs glusterfs defaults 0 0 |
Um zu testen, ob Ihre modifizierte /etc/fstab funktioniert, starten Sie den Client neu:
reboot
Nach dem Neustart sollten Sie die Freigabe in den Ausgaben von ...
findendf -h
... und ...
mount
4 Testen
Lassen Sie uns nun einige Testdateien auf der GlusterFS-Freigabe erstellen:
client1.beispiel.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
Sehen wir uns nun das Verzeichnis /data/export auf server1.example.com, server2.example.com, server3.example.com und server4.example.com an. Sie werden feststellen, dass sowohl replikation1 als auch replikation2 nur einen Teil der Dateien/Verzeichnisse enthalten, aus denen die GlusterFS-Freigabe auf dem Client besteht, aber die Knoten, aus denen replikation1 (server1 und server2) oder replikation2 (server3 und server4) bestehen, enthalten dieselben Dateien (Spiegelung):
server1.beispiel.com:
ls -l /data/export
server1:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test5
server1:/tmp/glusterfs-2.0.1#
server2.beispiel.com:
ls -l /data/export
server2:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test5
server2:/tmp/glusterfs-2.0.1#
server3.beispiel.com:
ls -l /data/export
server3:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test6
server3:/tmp/glusterfs-2.0.1#
server4.beispiel.com:
ls -l /data/export
server4:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test6
server4:/tmp/glusterfs-2.0.1#
Jetzt fahren wir server1.example.com und server4.example.com herunter und fügen einige Dateien auf der GlusterFS-Freigabe auf client1.example.com hinzu/löschen sie.
server1.beispiel.com/server4.beispiel.com:
shutdown -h now
client1.beispiel.com:
rm -f /mnt/glusterfs/test5
rm -f /mnt/glusterfs/test6
Die Änderungen sollten im Verzeichnis /data/export auf server2.example.com und server3.example.com sichtbar sein:
server2.beispiel.com:
ls -l /data/export
server2:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
server2:/tmp/glusterfs-2.0.1#
server3.beispiel.com:
ls -l /data/export
server3:/tmp/glusterfs-2.0.1# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
server3:/tmp/glusterfs-2.0.1#
Lassen Sie uns server1.example.com und server4.example.com erneut booten und einen Blick auf das Verzeichnis /data/export werfen:
server1.beispiel.com:
ls -l /data/export
server1:~# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw- r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
- rw-r--r-- 1 root root 0 2009-06-03 15:24 test5
server1:~#
server4.beispiel.com:
ls -l /data/export
server4:~# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
-rw- r--r-- 1 root root 0 2009-06-03 15:24 test6
server4:~#
Wie Sie sehen, haben server1.example.com und server4.example.com die Änderungen nicht bemerkt, die während des Ausfalls vorgenommen wurden. Dies ist einfach zu beheben, wir müssen lediglich einen Lesebefehl auf der GlusterFS-Freigabe auf client1.example.com aufrufen, z. B.:
client1.beispiel.com:
ls -l /mnt/glusterfs/
client1:~# ls -l /mnt/glusterfs/
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw -r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
client1:~#
Sehen Sie sich nun erneut das /data/export-Verzeichnis auf server1.example.com und server4.example.com an, und Sie sollten sehen, dass die Änderungen auf diese Knoten repliziert wurden:
server1.beispiel.com:
ls -l /data/export
server1:~# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test1
-rw- r--r-- 1 root root 0 2009-06-03 15:24 test2
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test4
server1 :~#
server4.beispiel.com:
ls -l /data/export
server4:~# ls -l /data/export
total 0
-rw-r--r-- 1 root root 0 2009-06-03 15:24 test3
server4:~ #
5 Links
- GlusterFS:http://www.gluster.org/
- Debian:http://www.debian.org/