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 :-P 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

Tags: ,

I commenti sono bloccati.