20 maggio 2010

Linux - Lustre - Clustering e Failover

Nel precendete articolo abbiamo implementato una soluzione con un singolo server Lustre, chiaramente questa è una soluzione puramente didattica, poiche' nella realtà dobbiamo prevedere un alta affidabilità del sistema in modo tale da garantire ai Client la continua accessibilità.

Lustre non ha alcun sistema di alta affidabilità, ma si affida a software di clusterware per implementarla, come ad esempio Heartbeat o meglio PaceMaker. Molti clienti però adottando il sistema operativo Red Hat preferiscono utilizzare Red Hat Cluster Suite per l'alta affidabilità, quindi adotteremo quest'ultimo come infrastruttura di clusterware.

Dobbiamo dividere l'implementazione in due parti, la prima riguarda la configurazione da fare al cluster Lustre per dichiarare dei volumi in Failover, la seconda riguarda la configurazione di RHCS.



Dallo schema in figura possiamo desumere che la configurazione sarà effettuata fra due server (192.168.2.20 e 192.168.2.22) sui cui avremo installato preventivamente i pacchetti lustre lato server. La configurazione finale sarà attiva/attiva cioè sul primo nodo denominato cln01 saranno presenti i servizi MGS, MDS e OST0, mentre nel secondo nodo deominato cln02 sarà presente l'OST1. Questo permetterà al client non solo di accedere al filesystem "prova" da due canali iSCSI paralleli, ma anche da due server paralleli aumentando ancora di più il trhoughput.

Configuriamo il nostro filesystem con i seguenti comandi, l'opzione reformat permette di sovrascrivere eventuali precedenti configurazioni:


  • dal nodo1: mkfs.lustre --mgs --failnode=192.168.2.22 --reformat /dev/sdb1
  • dal nodo1: mkfs.lustre  --reformat --mdt --mgsnode=192.168.2.20 --fsname=prova --failover=192.168.2.22 /dev/sdb4
  • dal nodo1: mkfs.lustre  --reformat --ost --mgsnode=192.168.2.20 --failover=192.168.2.22 --fsname=prova /dev/sdb2
  • dal nodo2: mkfs.lustre  --reformat --ost --mgsnode=192.168.2.20 --failover=192.168.2.20 --fsname=prova /dev/sdb3


Per avviare i servizi di lustre sarà sufficiente montare i relativi filesystem, prima ci creiamo l'alberatura di mount su entrambi i nodi:

  • mkdir -p /lustre/mgs_prova
  • mkdir -p /lustre/mdt_prova
  • mkdir -p /lustre/ost0_prova
  • mkdir -p /lustre/ost1_prova

e quindi montiamo:

  • dal nodo1: mount -t lustre /dev/sdb1 /lustre/mgs_prova
  • dal nodo1: mount -t lustre /dev/sdb4 /lustre/mdt_prova
  • dal nodo1: mount -t lustre /dev/sdb2 /lustre/ost0_prova
  • dal nodo2: mount -t lustre /dev/sdb3 /lustre/ost1_prova


dal client la nuova stringa di connessione sarà:

modprobe lustre
mount -t lustre 192.168.2.20@tcp:192.168.2.22@tcp:/prova /prova

Facciamo una prova di switch ad esempio del'ost0 dal nodo1 al nodo2, tenendo sempre il client montato:

dal nodo1: umount -fl /lustre/ost0_prova

attendiamo qualche secondo

dal nodo2: mount -t lustre /dev/sdb2 /lustre/ost0_prova

attendiamo qualche secondo e dal client potremo continuare tranquillamente ad accedere ai nostri file. Nella prossima parte potremo automattizare il processo di failover utilizzando RHCS.


Devo ringraziare per la collaborazione Roberto.

13 maggio 2010

Linux - Lustre - Installazione del Filesystem Lustre

Lustre è un filesystem parallelo distribuito, è in grado di gestire filesystem fino a 10PByte con un thrghtoup aggregato di 100 Gbyte/sec. Supporta nativamente reti Ethernet, 10 GbE, Infiniband, Elan, Myrinet. E' il filesystem più utilizzato fra i Top500 cluster più potenti al mondo. Lustre è un progetto Open Source basato su licenza GPL che gira su sistema operativo Linux.

Le componenti principali di una soluzione Lustre sono:
  • MGS - E' il servizio che tiene conto di tutte le configurazioni di un cluster Lustre
  • MDS - E' il servizio che gestisce i metadati di un singolo filesystem distribuito
  • OSS - E' il servizio che gestisce gli storage server dove vengono salvati i dati
  • Client - E' la componente che permette l'accesso al cluster
  • LNET - E' il sottosistema di rete nativo di Lustre

Tutte le componenti sono state sviluppate come moduli del kernel, le configurazioni vengono scritte durante la fase di formattazione del filesystem e passate al MGS, non esistono a livello del filesystem alcun file da configurare o configurazione da gestire.

Lustre necessita per le componenti MGS, MDS e OSS il patching del kernel partendo dai sorgenti, per il client è possibile scegliere tra un client patched o patchless, la differenza è in qualche punto percentuale di degrado delle performance. Se non si desidera ricompilare il kernel, vengono resi disponibili gli RPM pre-compilati e già  pronti per le distribuzioni Oracle Linux, Red Hat Enterprise Linux e Suse Linux.


A titolo didattico partiamo con una soluzione, rappresentata in figura, con un unico server Lustre contenente le componenti MGS, MDS e OSS. Tale server dotato di una distribuzione Red Hat Enterprise Linux con kernel 2.6.18-164.11.1.el5 è agganciata a uno storage esterno iSCSI dove verranno ricavate 4 partizioni secondo il seguente schema:
  • Target del MGS: partizione /dev/sdb1 da 1 GB
  • Target del MDS: partizione /dev/sdb4 da 1 GB
  • Due target per la componente di Storage: OST0 /dev/sdb2 da 10GB e OST1 /dev/sdb3 da 10GB
La configurazione appena proposta permetterà  al client di accedere ad un unico filesystem di 20GB composto da due Storage Target in Striping che quindi aggregheranno la banda dei due canali iSCSI e permetteranno migliori performance al client.

La versione di Lustre utilizzata è la 1.8.3, sul client utilizzeremo la configurazione patchless.

Lato server installeremo i seguenti pacchetti con il comando:
rpm -ivh e2fsprogs-1.41.10.sun2-0redhat.rhel5.i386.rpm 
kernel-2.6.18-164.11.1.el5_lustre.1.8.3.i686.rpm  
lustre-1.8.3-2.6.18_164.11.1.el5_lustre.1.8.3.i686.rpm  
lustre-ldiskfs 3.0.9-2.6.18_164.11.1.el5_lustre.1.8.3.i686.rpm 
lustre-modules-1.8.3-2.6.18_164.11.1.el5_lustre.1.8.3.i686.rpm  --force

e aggiungeremo al file /etc/modprobe.conf la seguente riga per abilitare il sistema LNET su ethernet:
options lnet networks=tcp

riavviamo il server con il kernel appena installato e iniziamo a formattare / configurare Lustre con i seguenti comandi:
  • MGS:  mkfs.lustre --mgs /dev/sdb1 
  • MDS:  mkfs.lustre --mdt --mgsnode=192.168.2.20 --fsname=prova /dev/sdb4
  • OSS0: mkfs.lustre --ost --mgsnode=192.168.2.20 --fsname=prova /dev/sdb2
  • OSS1: mkfs.lustre --ost --mgsnode=192.168.2.20 --fsname=prova /dev/sdb3
Per avviare i servizi di lustre sarà  sufficiente montare i relativi filesystem, prima ci creiamo l'alberatura di mount:

mkdir -p /lustre/mgs_prova
mkdir -p /lustre/mdt_prova
mkdir -p /lustre/ost0_prova
mkdir -p /lustre/ost1_prova


e quindi montiamo:

mount -t lustre /dev/sdb1 /lustre/mgs_prova
mount -t lustre /dev/sdb4 /lustre/mdt_prova
mount -t lustre /dev/sdb2 /lustre/ost0_prova
mount -t lustre /dev/sdb3 /lustre/ost1_prova


ATTENZIONE: I filesystem appena montati NON devono essere acceduti, questa operazione serve solamente per avviare i moduli dei servizi server di Lustre.

Lato client installeremo i seguenti pacchetti:
rpm -ivh lustre-client-1.8.3-2.6.18_164.11.1.el5_lustre.1.8.3.i686.rpm lustre-client-modules-1.8.3-2.6.18_164.11.1.el5_lustre.1.8.3.i686.rpm

e aggiungeremo al file /etc/modprobe.conf la seguente riga per abilitare il sistema LNET su ethernet:
options lnet networks=tcp

per maggiore sicurezza facciamo un bel reboot del client e proviamo ad accedere al nostro filesystem "prova":
mkdir /prova
modprobe lustre
mount -t lustre 192.168.2.20@tcp:/prova /prova


dovreste vedere il vostro filesystem /prova montato e delle dimensioni di 20GB.

La procedure corretta di stop del cluster Lustre sarà :
  1. dal client: umount /prova
  2. dal server: umount /lustre/ost1_prova
  3. dal server: umount /lustre/ost0_prova
  4. dal server: umount /lustre/mdt_prova
  5. dal server: umount /lustre/mgs_prova


Devo ringraziare per la collaborazione Roberto.