Configurazione GlusterFS
Cosa è glusterfs
GlusterFS è un file system distribuito in grado di scalare fino a molti petabytes ed è in grado di gestire migliaia di client. Ma si comporta benissimo anche in situazioni più… normali
Vedremo due situazioni tipiche: una configurazione sulla falsa riga di un singolo server NFS, ed un’altra in cui i nostri dati saranno automaticamente replicati su due server GlusterFS, similarmente a quanto accade ad un sistema RAID1 per gli harddisk.
Vantaggi
Nel nostro caso i vantaggi principali di GlusterFS sono derivano essenzialmente dalla sua modularità e dal fatto che lavora interamente in userspace.
Vedremo come GlusterFS sia composto da più moduli che possono essere combinati per ottenere la configurazione ideale, anche modificandola nel tempo passando, ad esempio, da una configurazione a singolo server ad una con più nodi. Un esempio di cosa si possa fare è riportato in questo blog.
Un dubbio che può essere sollevato è che essendo un prodotto in user space, GlusterFS non abbia le adeguate performance. Sfatiamo subito il dubbio dicendo che GlusterFS ha delle ottime performace con il non trascurabile vantaggio che un problema ad un suo modulo non compromette la stabilità del server su cui sta girando, contrariamente ad altri FS clustered.
Installazione
Come sistema di riferimento si utilizzerà la solita Debian/Lenny con l’unico accorgimento di abilitare il repository backports. Per installare il server:
apt-get install -t lenny-backports glusterfs-server
Per il client
apt-get install -t lenny-backports glusterfs-client
Al momento l’ultima versione è la 3.0.5 che, a differenza delle versioni precedenti alle 2.0.8, mette a disposizione un pratico comando per la configurazione dei server: glusterfs-volgen
Configurazione
Come struttura di rete di esempio utilizzeremo le seguenti macchine
server1 192.168.0.11 server2 192.168.0.12 client1 192.168.0.101 client2 192.168.0.102
Contrariamente ad altro FS distribuiti, GlusterFS non richiede nessuna configurazione particolare del server, ma, come NFS, solo il path che sarà esportato verso i client. I nomi dei server devono essere risolti via /etc/hosts o DNS, non importa.
Configurazione NFS like
Il primo esempio è la configurazione di un semplice sistema a nodo singolo, server1 nel nostro caso.
Configurazione server
Come accennato prima, utilizziamo il comando glusterfs-volgen per generare la configurazione del nodo. I file di vanno creati in //etc/glusterfs/
cd /etc/glusterfs glusterfs-volgen --name nfslike server1:/var/local/export/
Il parametro –name assegna un nome alla nostra “condivisione” mentre il parametro sucessivo indica il percorso da esportare.
Dopo aver lanciato glusterfs-volgen come indicato, nella directory corrente otteniamo 3 file, di cui solo 2 sono di nostro interesse: server1-nfslike-export.vol e nfslike-tcp.vol, il primo per la configurazione del server e il secondo per quella dei client.
## file auto generated by /usr/bin/glusterfs-volgen (export.vol)
# Cmd line:
# $ /usr/bin/glusterfs-volgen --name nfslike server1:/var/local/export/
volume posix1
type storage/posix
option directory /var/local/export/
end-volume
volume locks1
type features/locks
subvolumes posix1
end-volume
volume brick1
type performance/io-threads
option thread-count 8
subvolumes locks1
end-volume
volume server-tcp
type protocol/server
option transport-type tcp
option auth.addr.brick1.allow *
option transport.socket.listen-port 6996
option transport.socket.nodelay on
subvolumes brick1
end-volume
## file auto generated by /usr/bin/glusterfs-volgen (mount.vol)
# Cmd line:
# $ /usr/bin/glusterfs-volgen --name nfslike server1:/var/local/export/
# TRANSPORT-TYPE tcp
volume server1-1
type protocol/client
option transport-type tcp
option remote-host server1
option transport.socket.nodelay on
option transport.remote-port 6996
option remote-subvolume brick1
end-volume
volume readahead
type performance/read-ahead
option page-count 4
subvolumes server1-1
end-volume
volume iocache
type performance/io-cache
option cache-size `echo $(( $(grep 'MemTotal' /proc/meminfo | sed 's/[^0-9]//g') / 5120 ))`MB
option cache-timeout 1
subvolumes readahead
end-volume
volume quickread
type performance/quick-read
option cache-timeout 1
option max-file-size 64kB
subvolumes iocache
end-volume
volume writebehind
type performance/write-behind
option cache-size 4MB
subvolumes quickread
end-volume
volume statprefetch
type performance/stat-prefetch
subvolumes writebehind
end-volume
Come si può vedere la configurazione è suddivisa in moduli (translators nel linguaggio di GlusterFS), ciascuno dei quali si occupa di una specifica funzione. Per una descrizione dettagliata vi rimando alla pagina della documentazione che trovate sul sito di GlusterFS.
L’unica modifica che apporteremo alla configurazione del server sarà relativa al controllo degli accessi, modificando la linea
option auth.addr.brick1.allow *
In
option auth.addr.brick1.allow 192.168.0.*
In modo da permettere l’accesso solo ai client della nostra sottorete.
Stoppiamo glusterfsd.
Come ultima cosa rinominiamo i file nel seguente modo (oppure creiamo dei link):
mv server1-nfslike-export.vo glusterfsd.vol mv nfslike-tcp.vol glusterfs.vol
In questo modo lo script di avvio (/etc/init.d/glusterfs-server) avvierà automaticamente l’esportazione.
Configurazione client
Contrariamente a quello che possiamo pensare, file il file glusterfs.vol non va copiato sul client, ma sarà il server stesso a comunicarlo ai client sul quale non resta altro che lanciare il comando
mount -t glusterfs server1 /mnt/gluster/
per avere a disposizione l’accesso allo storage sul server.
Configurazione in replica su 2 nodi
E ora qualcosa di completamente diverso
Configureremo 2 nodi gluster replicati tra loro e con più “condivisioni”
/var/local/export/posta /var/local/export/www /var/local/export/python /var/local/export/depot
E’ buona norma che le esportazioni GlusterFS, ma anche NFS/CIFS, stiano su una partizione separata da quella di root e che sia dedicata solo a GlusterFS. Non è un obbligo, ma aiuta ad evitare potenziali problemi.
Configurazione server
Dopo aver installato glusterfs-server sui 2 nodi (se non è stato già fatto), usiamo anche qui glusterfs-volgen per generare le configurazioni.
cd /etc/glusterfs glusterfs-volgen --name depot --raid 1 server1:/var/local/export/depot server2:/var/local/export/depot -p6996 glusterfs-volgen --name posta --raid 1 server1:/var/local/export/posta server2:/var/local/export/posta -p6997 glusterfs-volgen --name web --raid 1 server1:/var/local/export/web server2:/var/local/export/web -p6998 glusterfs-volgen --name python --raid 1 server1:/var/local/export/python server2:/var/local/export/python -p6999
Quello che otteniamo sono 2 serie di 4 file, una per server1 e una per server2, più 4 file per i client
depot-tcp.vol posta-tcp.vol python-tcp.vol web-tcp.vol server1-depot-export.vol server1-posta-export.vol server1-python-export.vol server1-web-export.vol server2-depot-export.vol server2-posta-export.vol server2-python-export.vol server2-web-export.vol
Contrariamente alla configurazione precedente abbiamo usato alcuni parametri in più:
--raid 1: indica che di dati devono essere replicati tra i server -p 6996: imposta la porta tcp sulla quale il server GlusterFS è in ascolto
Quello che volgiamo fare è avere 4 istanze di GlusterFS in ascolto su porte diverse e che esportino storage diversi. E’ anche possibile utilizzare una sola istanza e un solo file di configurazione, ma poi si perdono alcuni comodi automatismi. Insomma, lo si fa solo per pigrizia
NB: è fondamentale che almeno un’istanza di gluster sia in ascolto sulla porta predefinita, la 6996, altrimenti i client non possono ottenere automaticamente i file di configurazione. Visto che i due nodi del nostro sistema sono identici, identici sono anche i file di configurazione, ne possiamo tenere una copia sola.
rm server2* mv server1-depot-export.vol glusterfsd-depot.vol mv server1-posta-export.vol glusterfsd-posta.vol mv server1-python-export.vol glusterfsd-python.vol mv server1-web-export.vol glusterfsd-web.vol
Impostiamo come condivisione predefinita quella su “depot” in modo che venga avviata attraverso gli script di debian; le altre andranno avviate tramite uno script apposito.
mv glusterfsd-depot.vol glusterfd.vol
Creiamo in usr/local/sbin uno script che avvii anche le altre istanze di glusterfs: start-glusterfsd.sh
#!/bin/sh
GLUSTERFSD=$(which glusterfsd)
GLUSTERCONF=/etc/glusterfs
for f in $(ls $GLUSTERCONF/glusterfsd-*.vol); do
nome=$(echo $f | sed -r 's/(.*)-(\w+).vol/\2/');
$GLUSTERFSD -p /var/run/glusterfsd-$nome.pid -f $f --log-file /var/log/glusterfs/glusterfsd-$nome.vol.log
done
Copiamo le configurazioni, client e server, e lo script da server1 anche su server2, avviamo glusterfs e lanciamo lo script appena creato.
Configurazione client
Come nella configurazione precedente, sui client non è necessaria alcuna configurazione. Per montare le condivisioni esportare dai due server basta dare i seguenti comandi:
mount -t glusterfs server1:posta-tcp /srv/glusterfs/posta mount -t glusterfs server1:python-tcp /srv/glusterfs/python mount -t glusterfs server1:web-tcp /srv/glusterfs/web mount -t glusterfs server1:depot-tcp /srv/glusterfs/depot
Per utilizzare fstab basta inserire una riga del tipo:
server1:posta-tcp /srv/glusterfs/posta glusterfs defaults,_netdev, 0 0
Se le macchine client fossero dei container OpenVZ, utilizziamo questo script per impostare correttamente i permessi sul device fuse
cd /etc/vz/conf/
for vz in $(ls *.conf | sed -r 's/(\w+).(conf)/\1/'); do
vzctl set $vz --devices c:10:229:rw --save;
done
