File System Condiviso fra due web servers
Il mio amico Luigi, ha un problema, possiede un web server ad altissima volumetria.
Dovendo gestire enormi quantità d’immagini e molto pesanti, il web server, talvolta rimane intasato.
Per ovviare a questo spiacevole inconveniente è necessario utilizzare più web servers, l’ostacolo, a questo punto è il disco che deve contenere esattamente gli stessi dati su tutti i web servers.
La soluzione che ho pensato è la seguente, i web servers gestiti con un load balance che istrada il traffico ora su uno, ora sull’altro.
Un unico file system condiviso fra tutti i web server, la soluzione NFS non risulta ottimale perché, in caso di guasto, venendo a mancare l’unica macchina che ospita il file system condiviso si fermerebbe l’intera rete.
Quello di cui abbiamo bisogno, invece, è di un file system locale che sia aggiornato in tempo reale, qualora una delle macchine venisse a mancare, il resto della rete continuerebbe a funzionare come se nulla fosse accaduto, al rientro in produzione della macchina mancante, questa si riallinea con gli altri dischi.
Nell’esempio che sto per descrivere vedremo due web servers che condividono la directory /work/web
Per prima cosa dobbiamo installare i nostri web servers,
nella directory /work/image creiamo l’immagine dei dischi che andranno formattati e montati in due directory di comodo.
Le directory di comodo, non dovranno essere toccate, ne in lettura ne in scrittura, per evitare che s’interrompa il sinallagma della directory condivisa.
Creiamo le directory su tutti e due i servers
mkdir -p /work/image
Creiamo l’immagine del disco su tutti e due i servers
dd if=/dev/zero of=/work/image/webserver.img bs=102400k count=0 seek=1024 2>&1
Questo creerà un file vuoto da 100Gb
A questo punto dobbiamo formattare il file immagine per crearci dentro un file system e montarlo in loop, anche questa operazione va eseguita su tutti e due i servers.
Io preferisco usare reiserFS, quindi istalliamo prima il software necessario.
apt-get install reiserfsprogs
Carichiamo il modulo nel kernel
modprobe reiserfs
e procediamo con la creazione del filesystem
mkfs -t reiserfs /work/image/webserver.img
mkdir /work/comodo
chmod 0000 /work/comodo
mount -o loop -t reiserfs work/image/webserver.img /work/comodo
chmod 0000 /work/comodo
Adesso abbiamo 2 file system distinti e separati su due web servers distinti e separati.
Avendo impartito il chmod 0000 nessuno potrà leggere e scrivere sulla directory di comodo, in ogni caso è meglio non verificare, quindi non bisognerà entrare in queste directory che saranno poi montate su un file system condiviso in remoto.
Aggiungiamo 1 scheda di rete su tutti e due i servers, meglio se 1000 base FX, questa dovrà essere il più veloce possibile perché dovrà mantenere allineati i dati fra i web serverer, se i server sono soltanto 2 non servirà lo switch, diversamente dovremo usare uno switch in fibra ottica.
Configuriamo la scheda in fibra del primo server con indirizzo 192.168.1.1 255.255.255.252 e nel file /etc/hosts nomencliamo i due nomi
vi /etc/hosts
192.168.1.1 server1
192.168.1.2 server2
configuriamo la scheda in fibra del secondo server con indirizzo 192.168.1.2 255.255.255.252 e nel file /etc/hosts nomencliamo i due nomi
vi /etc/hosts
192.168.1.1 server1
192.168.1.2 server2
colleghiamo i cavi e facciamo un test di raggiungibilità
sul primo server ping -c 3 192.168.1.2
sul secondo server ping -c 3 192.168.1.1
se i due server si parlano possiamo procedere
Installiamo il software necessario a condividere il file system remoto su tutti e due i server web
apt-get install glusterfs-server
Adesso ci spostiamo sul server1 ed impartiamo il comando
gluster peer probe server2
poi
gluster peer status
il risultato dovrebbe essere più o meno questo:
Number of Peers: 1
Hostname: server2
Uuid: abc-defgh-ijklmn-opqrs
State: Peer in Cluster (Connected)
La dicitura connected significa che il server1 ha stabilito una connessione IP con il server2
Adesso dobbiamo creare il cluster (file system condiviso) vero e proprio.
Quindi, sempre dal server1 impartiamo il comando:
gluster volume create filesystem_condiviso replica 2 server1:/work/comodo server2:/work/comodo
e poi
gluster volume info
il risultato dovrebbe essere più o meno questo:
Volume Name: filesystem_condiviso
Type: Replicate
Volume ID: abc-defgh-ijklmn-opqrs
Status: Created
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1:/work/comodo
Brick2: server2:/work/comodo
A questo punto vediamo lo status in CREATED, quindi possiamo aprire il nostro file system condiviso
impartendo il comando:
gluster volume start filesystem_condiviso
Adesso dobbiamo montare il file system condiviso nella directory /work/web di tutti e due i server
quindi impartiamo il comando:
mount -t glusterfs localhost:filesystem_condiviso /work/web su tutti e due i server.
Adesso facciamo una prova per vedere se tutto funziona per il meglio
andiamo in uno dei due serve e scriviamo touch /work/web/prova
andiamo sull’altro server e verifichiamo che il file sia stato creato
ls -la –si /work/web
Se toviamo il file prova di grandezza 0 tutto è andato per il meglio.
Sistemiamo il file /etc/fstab per assicurarci che i dischi vengano rimontati in automatico al riavvio e diamo un onesto reboot.
Adesso abbiamo 2 web server che condividono lo tesso file system.
La velocità di scrittura dipende dalla velocità delle due schede di rete + la somma della velocità degli hard disk / 2.
La velocità di lettura dei dati dipende dal singolo server.
Per concludere, i due server condividono lo stesso file system che risiede in locale su ogni singola macchina.
In caso di incidente su uno dei due dischi, l’altro server continuerà a funzionare, il backup può essere effettuato sia leggendo i dati contenuti in /work/web sia copiando l’unico file da 100Gb presente nel percorso /work/image/webserver.img di uno dei due servers.
Volendo è possibile aggiungere una terza sheda di rete destinata al traffico di back end ed al traffico di backup, per evitare di appesantire il front end.
Il backup si effettua su uno solo dei due server, in questo caso, prima di procedere è necessario spegnere la scheda di rete del front end e quella del cluster per evitare che durante il backup vengano modificati i file da salvare.
La continuità del servizio è garantita dall’altro server.
Per ulteriori info, rimando al sito del produttore del software GlusterFS