Questo tutorial mostra come combinare quattro server di archiviazione singoli (che eseguono Debian Lenny) in uno storage replicato distribuito con GlusterFS. I nodi 1 e 2 (replica1) e 3 e 4 (replica2) si rispecchieranno a vicenda e la replica1 e la replica2 verranno combinate in un server di archiviazione più grande (distribuzione). Fondamentalmente, questo è RAID10 su rete. Se si perde un server dalla replica1 e uno dalla replica2, il volume distribuito continua a funzionare. Il sistema client (anche Debian Lenny) sarà in grado di accedere allo storage come se fosse un filesystem locale.GlusterFS è un filesystem in cluster in grado di scalare a diversi peta-byte. Aggrega vari blocchi di archiviazione su Infiniband RDMA o interconnessione TCP/IP in un unico file system di rete parallelo di grandi dimensioni. I mattoni di archiviazione possono essere realizzati con qualsiasi hardware di consumo come server x86-64 con RAID SATA-II e HBA Infiniband.
Non garantisco che questo funzionerà per te!
1 Nota preliminare
In questo tutorial utilizzo cinque sistemi, quattro server e un client:
- server1.example.com:indirizzo IP 192.168.0.100 (server)
- server2.example.com:indirizzo IP 192.168.0.101 (server)
- server3.example.com:indirizzo IP 192.168.0.102 (server)
- server4.example.com:indirizzo IP 192.168.0.103 (server)
- client1.example.com:indirizzo IP 192.168.0.104 (client)
Tutti e cinque i sistemi dovrebbero essere in grado di risolvere i nomi host degli altri sistemi. Se ciò non può essere fatto tramite DNS, dovresti modificare il file /etc/hosts in modo che appaia come segue su tutti e cinque i sistemi:
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 |
(È anche possibile utilizzare indirizzi IP invece di nomi host nella configurazione seguente. Se preferisci utilizzare indirizzi IP, non devi preoccuparti se i nomi host possono essere risolti o meno.)
2 Configurazione dei server GlusterFS
server1.example.com/server2.example.com/server3.example.com/server4.example.com:
GlusterFS non è disponibile come pacchetto Debian per Debian Lenny, quindi dobbiamo costruirlo noi stessi. Per prima cosa installiamo i prerequisiti:
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev
Quindi scarichiamo l'ultima versione di GlusterFS da http://www.gluster.org/download.php e la costruiamo come segue:
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
GlusterFS configure summary
============================
FUSE client : no
Verbi infinita : no
epoll IO multiplex : sì
Berkeley-DB :sì
libglusterfsclient : sì
mod_glusterfs : no ()
argp-standalone : no
server1:/tmp/glusterfs-2.0.1#
make &&make install
ldconfig
Il comando
glusterfs --version
ora dovrebbe mostrare la versione GlusterFS che hai appena compilato (2.0.1 in questo caso):
server1:/tmp/glusterfs-2.0.1# glusterfs --version
glusterfs 2.0.1 costruito il 29 maggio 2009 17:23:10
Revisione repository:5c1d9108c1529a1155963cb1911f8870a674ab5b
Copyright (c) 2006 -2009 Z RESEARCH Inc.
GlusterFS viene fornito con ASSOLUTAMENTE NESSUNA GARANZIA.
È possibile ridistribuire copie di GlusterFS secondo i termini della GNU General Public License.
/>server1:/tmp/glusterfs-2.0.1#
Quindi creiamo alcune directory:
mkdir /data/
mkdir /data/export
mkdir /data/export-ns
mkdir /etc/glusterfs
Ora creiamo il file di configurazione del server GlusterFS /etc/glusterfs/glusterfsd.vol che definisce quale directory verrà esportata (/data/export) e quale client può connettersi (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 |
Si noti che è possibile utilizzare caratteri jolly per gli indirizzi IP (come 192.168.*) e che è possibile specificare più indirizzi IP separati da virgole (es. 192.168.0.104,192.168.0.105).
Successivamente creiamo i collegamenti di avvio del sistema per lo script di inizializzazione glusterfsd...
update-rc.d glusterfsd defaults
... e avvia glusterfsd:
/etc/init.d/glusterfsd start
3 Configurazione del client GlusterFS
client1.example.com:
Sul client, dobbiamo installare fuse e GlusterFS. Invece di installare il pacchetto libfuse2 dal repository Debian, installiamo una versione con patch con un supporto migliore per GlusterFS.
Per prima cosa installiamo di nuovo i prerequisiti:
aptitude install sshfs build-essential flex bison byacc libdb4.6 libdb4.6-dev
Quindi costruiamo il fusibile come segue (puoi trovare l'ultima versione del fusibile con patch su 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
Successivamente costruiamo GlusterFS (proprio come sul 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
... e crea le seguenti due directory:
mkdir /mnt/glusterfs
mkdir /etc/glusterfs
Quindi creiamo il file /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 |
Assicurati di utilizzare i nomi host del server o gli indirizzi IP corretti nelle righe dell'host remoto dell'opzione!
Questo è tutto! Ora possiamo montare il filesystem GlusterFS su /mnt/glusterfs con uno dei seguenti due comandi:
glusterfs -f /etc/glusterfs/glusterfs.vol /mnt/glusterfs
o
mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs
Ora dovresti vedere la nuova condivisione negli output di...
mount
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 su /proc tipo proc (rw,noexec,nosuid,nodev)
sysfs su /sys tipo sysfs (rw,noexec,nosuid,nodev)
udev su /dev tipo tmpfs (rw,mode=0755)
tmpfs su /dev/shm tipo tmpfs (rw,nosuid,nodev)
devpts su /dev/pts tipo devpts (rw,noexec,nosuid,gid =5,mode=620)
fusectl su /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#
... e...
df -h
Client1:/tmp/glusfs-2.0.1# df -h
Dimensione del filesystem utilizzata Disponibile%Uso montato su
/dev/sda1 29g 935m 27g 4%/
tmpfs 126m 0 126m 0%0% /lib/init/rw
udev 10m 80k 10m 1%/dev
tmpfs 126m 0 126m 0%/dev/shm
/etc/glusfs/glusfs.vol
48g 1.7 G 44G 4% /mnt/glusterfs
client1:/tmp/glusterfs-2.0.1#
(La dimensione dello storage distribuito viene calcolata da replica1 + replica2, dove entrambi i volumi di replica sono grandi quanto il mattone più piccolo.)
Invece di montare manualmente la condivisione GlusterFS sul client, è possibile modificare /etc/fstab in modo che la condivisione venga montata automaticamente all'avvio del client.
Apri /etc/fstab e aggiungi la seguente riga:
vi /etc/fstab
[...] /etc/glusterfs/glusterfs.vol /mnt/glusterfs glusterfs defaults 0 0 |
Per verificare se il tuo /etc/fstab modificato funziona, riavvia il client:
reboot
Dopo il riavvio, dovresti trovare la condivisione negli output di...
df -h
... e...
mount
4 Test
Ora creiamo alcuni file di prova sulla condivisione GlusterFS:
client1.example.com:
touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
touch /mnt/glusterfs/ test5
tocca /mnt/glusterfs/test6
Ora controlliamo la directory /data/export su server1.example.com, server2.example.com, server3.example.com e server4.example.com. Noterai che replica1 e replica2 contengono solo una parte dei file/directory che compongono la condivisione GlusterFS sul client, ma i nodi che compongono replica1 (server1 e server2) o replica2 (server3 e server4) contengono lo stesso file (mirroring):
server1.example.com:
ls -l /data/export
server1:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test1
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 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.example.com:
ls -l /data/export
server2:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test1
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 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.example.com:
ls -l /data/export
server3:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test3
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test6
server3:/tmp/glusterfs-2.0.1#
server4.example.com:
ls -l /data/export
server4:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test3
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test6
server4:/tmp/glusterfs-2.0.1#
Ora chiudiamo server1.example.com e server4.example.com e aggiungiamo/eliminiamo alcuni file nella condivisione GlusterFS su client1.example.com.
server1.example.com/server4.example.com:
shutdown -h now
client1.example.com:
rm -f /mnt/glusterfs/test5
rm -f /mnt/glusterfs/test6
Le modifiche dovrebbero essere visibili nella directory /data/export su server2.example.com e server3.example.com:
server2.example.com:
ls -l /data/export
server2:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test1
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test4
server2:/tmp/glusterfs-2.0.1#
server3.example.com:
ls -l /data/export
server3:/tmp/glusterfs-2.0.1# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test3
server3:/tmp/glusterfs-2.0.1#
Avviamo nuovamente server1.example.com e server4.example.com e diamo un'occhiata alla directory /data/export:
server1.example.com:
ls -l /data/export
server1:~# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test1
-rw- r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test4
- rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test5
server1:~#
server4.example.com:
ls -l /data/export
server4:~# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test3
-rw- r--r-- 1 radice radice 0 03-06-2009 15:24 test6
server4:~#
Come puoi vedere, server1.example.com e server4.example.com non hanno notato i cambiamenti avvenuti mentre erano inattivi. Questo è facile da risolvere, tutto ciò che dobbiamo fare è invocare un comando di lettura sulla condivisione GlusterFS su client1.example.com, ad esempio:
client1.example.com:
ls -l /mnt/glusterfs/
client1:~# ls -l /mnt/glusterfs/
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test1
-rw -r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test3
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test4
client1:~#
Ora dai un'occhiata alla directory /data/export su server1.example.com e server4.example.com di nuovo e dovresti vedere che le modifiche sono state replicate su questi nodi:
server1.example.com:
ls -l /data/export
server1:~# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test1
-rw- r--r-- 1 radice radice 0 2009-06-03 15:24 test2
-rw-r--r-- 1 radice radice 0 2009-06-03 15:24 test4
server1 :~#
server4.example.com:
ls -l /data/export
server4:~# ls -l /data/export
totale 0
-rw-r--r-- 1 radice radice 0 03-06-2009 15:24 test3
server4:~ #
5 link
- GlusterFS:http://www.gluster.org/
- Debian:http://www.debian.org/