Jan 13, 2009

Sistema de archivos en red con GlusterFS

Una vez establecidos los parámetros iniciales del cluster, vamos a continuar con la configuración del espacio compartido en disco por los dos nodos traseros (LB1 y LB2) a través de GlusterFS (sistema de archivos distribuido empleado habitualmente para implementar clusters de ficheros a través de varios discos interconectados mediante una arquitectura TCP/IP).

GlusterFS sólo se instalará en estos dos nodos, ya que éstas serán las máquinas que reciban la carga de trabajo por parte de los balanceadores (HA1 o HA2), y dicho directorio empleado por Apache deberá ser el mismo en los dos nodos traseros (un dato guardado por el Apache de uno de los nodos en un momento dado, puede ser requerido por el Apache del otro nodo en otro instante).

GlusterFS utiliza un sistema de ficheros en cluster denominado FUSE, similar a RAID1 (espejo), con el objetivo de poder establecer particiones en red. En el sistema de Alta Disponibilidad y Balanceo de Carga que estamos configurando, GlusterFS montará el directorio /etc/glusterfs/gfs/ en /var/www/html/ (ambas carpetas deberán ser creadas manualmente). De esta forma cuando se escriba sobre dicho directorio del nodo LB1, automáticamente también se escribirá en el mismo directorio pero del nodo LB2, y viceversa.

Si por ejemplo cayera el nodo LB1 y se empezara a utilizar exclusivamente el directorio /var/www/html/ del nodo LB2, cuando se levantase nuevamente el primer nodo, sincronizaría automáticamente su directorio /var/www/html/ con el del nodo LB2.

Todo el proceso de instalación así como los ficheros de configuración, serán idénticos en ambos nodos, por lo tanto sólo se expondrá la parte del nodo LB1.

GlusterFS emplea un cliente y un servidor. El servidor se encargará de gestionar el directorio que declararemos como compartido, y el cliente, se conectará al propio servidor GlusterFS local y remoto, formando con los dos volúmenes custodiados por los servidores un único espacio de almacenamiento final.


Vamos a empezar instalando Apache (versión 2.2.9), y el cliente y el servidor de GlusterFS (versión 1.3.10).

root@lb1:~# aptitude install apache2

root@lb1:~# aptitude install glusterfs-client glusterfs-server

En primer lugar configuraremos la parte del servidor, indicándole que utilice como directorio temporal /etc/glusterfs/gfs/ (lo denominaremos volumen brick), el cual tendremos que crear previamente. También le diremos al servidor que podrá conectarse a este volumen cualquier tipo de dirección IP (option auth.ip.brick.allow *).


root@lb1:~# cat /etc/glusterfs/glusterfs-server.vol
volume brick
type storage/posix
option directory /etc/glusterfs/gfs/
end-volume

volume server
type protocol/server
option transport-type tcp/server
subvolumes brick
option auth.ip.brick.allow *
end-volume

root@lb1:~# mkdir /etc/glusterfs/gfs/

root@lb1:~# mkdir /var/www/html/


Después le tocará el turno a la parte cliente. Para ello haremos que se conecte al propio volumen local (10.0.0.12) y al volumen remoto (10.0.0.13) - para el caso del nodo LB1 -. A continuación formará con esos dos volúmenes, un nuevo volumen llamado bricks-afr de tipo cluster/afr.

root@lb1:~# cat /etc/glusterfs/glusterfs-client.vol
volume brick1
type protocol/client
option transport-type tcp/client
option remote-host lb1
option remote-subvolume brick
end-volume

volume brick2
type protocol/client
option transport-type tcp/client
option remote-host lb2
option remote-subvolume brick
end-volume

volume bricks-afr
type cluster/afr
subvolumes brick1 brick2
end-volume

Modificando el script de arranque del servidor, haremos que una vez lanzado glusterfsd (demonio servidor), se monte el volumen de tipo cluster/afr en /var/www/html/.

root@lb1:~# cat /etc/init.d/glusterfs-server
...
do_start()
{
...
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS && sleep 2
for brick in `grep /etc/glusterfs/ /etc/fstab grep glusterfs awk '{print $2}'`; do mount $brick; done return 2
}
...
do_stop()
{
...
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
for brick in `grep /etc/glusterfs/ /etc/fstab grep glusterfs awk '{print $2}'`; do umount $brick; done
return "$RETVAL"
}
...

Al ejecutar el comando mount, éste acudirá al fichero /etc/fstab para comprobar cómo debe montar el directorio. Por lo tanto, tendremos que editar dentro de este fichero el sistema de archivos a ser montado (descrito en /etc/glusterfs/glusterfs-client.vol), el punto de montaje (/var/www/html/), el tipo de sistema de archivos (glusterfs) y las opciones de montaje (defaults,noauto 0 0).

root@lb1:~# cat /etc/fstab
...
/etc/glusterfs/glusterfs-client.vol /var/www/html/ glusterfs defaults,noauto 0 0

Una vez establecido el espacio compartido en red a través de GlusterFS, si hacemos la prueba de crear un fichero en el directorio /var/www/html/ de la máquina LB1, podremos ver que automáticamente se habrá replicado al mismo directorio pero del nodo LB2.

root@lb1:/var/www/html# touch fichero

root@lb1:/var/www/html# ls -l
total 0-rw-r--r-- 1 root root 0 2009-01-14 21:54 fichero

root@lb2:/var/www/html# ls -l
total 0-rw-r--r-- 1 root root 0 2009-01-14 21:54 fichero

2 comments:

  1. Muchas gracias por este articulo. Me ha aclarado bastante sobre GlusterFS.
    Estoy montandolo entre 4 maquinas que exportan cada una una misma carpeta.
    Luego cada una es cliente de si misma y de las otras cuatro.
    Entonces monto el directorio desde el cual se accedera al espacio compartido pero no puedo escribir, no tengo permisos.
    En cambio si escribo en alguno de los directorios que se estan exportando si se replica la informacion y se ve en las otras maquinas.

    ReplyDelete
  2. Hola, pues yo use la versión:
    glusterfs-server-3.0.2-1.x86_64
    glusterfs-client-3.0.2-1.x86_64
    glusterfs-common-3.0.2-1.x86_64

    Pero veo que la configuración cambio mucho, por lo que los archivos deben quedar así:

    Archivo server:

    cat /etc/glusterfs/glusterfsd.vol
    volume posix
    type storage/posix
    option directory /etc/glusterfs/gfs/
    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 *
    subvolumes brick
    end-volume

    Archivo cliente:

    cat /etc/glusterfs/glusterfs.vol

    volume brick1
    type protocol/client
    option transport-type tcp
    option remote-host lenny
    option remote-subvolume brick
    end-volume

    volume brick2
    type protocol/client
    option transport-type tcp/client
    option remote-host carl
    option remote-subvolume brick
    end-volume

    volume replicate1
    type cluster/replicate
    subvolumes brick1 brick2
    end-volume

    volume writebehind
    type performance/write-behind
    option window-size 1MB
    subvolumes replicate1
    end-volume

    volume cache
    type performance/io-cache
    option cache-size 512MB
    subvolumes writebehind
    end-volume

    Parece ser que la opcion afd ya no esta en uso.

    Cualquier sugerencia me escriben a:
    customvalem@yahoo.com

    ReplyDelete