GlusterFS en Ubuntu 10.04 LTS Lucid Lynx

GlusterFS es un sistema de archivos distribuido en red que nos permite aprovechar recursos en distintos equipos para crear un almacenamiento tolerante a fallos y de alto rendimiento.

Partimos de la base de que tenemos varios servidores ubuntu con conectividad, correctamente instalados y configurados.
En este tutorial usaremos las siguientes maquinas:
Servidores GlusterFS:
nodo1, nodo2, nodo3
Clientes GlusterFS:
nodo4

El primer paso sera instalar glusterfs-server:

sudo aptitude install glusterfs-server

Una vez hecho esto, en nuestro ejemplo particular dispondremos de 3 servidores, que añadiremos en el fichero de hosts:

/etc/hosts:
192.168.36.129 nodo1
192.168.36.130 nodo2
192.168.36.131 nodo3
192.168.36.132 nodo4

Creamos el directorio donde va a ir alojado el volumen, en nuestro ejemplo sera /opt/gluster

javi@nodo1:~$sudo mkdir /opt/gluster

Hacemos copia de seguridad del fichero de configuracion original del servidor gluster,

javi@nodo1:~$sudo mv /etc/glusterfs/glusterfsd.vol /etc/glusterfs/glusterfsd.vol.original

Creamos un nuevo fichero de configuracion adaptandolo a nuestra configuracion de red

javi@nodo1:~$ sudo vim /etc/glusterfs/glusterfsd.vol:
volume posix
type storage/posix
option directory /opt/gluster/export
end-volumevolume locks
type features/locks
subvolumes posix
end-volumevolume brick
type performance/io-threads
option thread-count 8
subvolumes locks
end-volumevolume server
type protocol/server
option transport-type tcp
option auth.addr.brick.allow 192.168.36.129,192.168.36.130,192.168.36.131,192.168.36.132
subvolumes brick
end-volume

Hacemos copia de seguridad del fichero de configuracion del CLIENTE (nodo4) gluster para poder montar los shares y tenerlos accesibles desde todas las maquinas

javi@nodo4:~$ sudo mv /etc/glusterfs/glusterfs.vol /etc/glusterfs/glusterfs.vol.original

Creamos un nuevo fichero de configuracion adaptandolo a nuestra configuracion de red

javi@nodo4:~$ sudo vim /etc/glusterfs/glusterfs.vol:
volume nodo1
type protocol/client
option transport-type tcp
option remote-host nodo1
option remote-subvolume brick
end-volumevolume nodo2
type protocol/client
option transport-type tcp
option remote-host nodo2
option remote-subvolume brick
end-volumevolume nodo3
type protocol/client
option transport-type tcp
option remote-host nodo3
option remote-subvolume brick
end-volumevolume replicate
type cluster/replicate
subvolumes nodo1 nodo2 nodo3

end-volume

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

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

Con esto conseguimos el equivalente a un RAID1 en 3 servidores de red distintos. Probemoslo!
1. Iniciar o reiniciar el glusterfs-server en todos los nodos (uno a uno) para recargar la configuracion

javi@nodo1:~$ sudo /etc/init.d/glusterfs-server restart

2. Crear el punto de montaje en los clientes y darles los permisos que necesitemos de acceso. Por ejemplo:

javi@nodo1:~$ sudo mkdir /mnt/gluster; sudo chown javi.root /mnt/gluster

3. Montar en los clientes el punto de montaje /mnt/glusterfs con

javi@nodo4:~$ sudo mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/gluster

4. Vamos a escribir algo en nuestro FS ya montado:

javi@nodo4:~$ cat /proc/cpuinfo > /mnt/gluster/info_cpu.txt

5. Comprobamos que se ha creado en el cliente:

javi@nodo4:/mnt/gluster$ cat /proc/cpuinfo > /mnt/gluster/info_cpu.txt
javi@nodo4:/mnt/gluster$ ls -la
total 20
drwxr-xr-x 2 javi root 4096 2010-04-26 10:20 .
drwxr-xr-x 4 root root 4096 2010-04-26 10:07 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt

6. Comprobamos en los nodos servidores que se ha creado el archivo:

javi@nodo1:/opt/gluster/export$ ls -la
total 20
drwxr-xr-x 2 javi root 4096 2010-04-26 10:20 .
drwxr-xr-x 4 root root 4096 2010-04-26 08:42 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt

Probando la tolerancia a fallos

Ahora supongo que el siguiente paso logico es ver que tolerancia a fallos tiene este sistema. Probemoslo también.

1. Apagamos uno de los nodos con

javi@nodo1:~$ sudo shutdown -h now

2. Creamos un archivo adicional en el cliente:

javi@nodo4:/mnt/gluster$ uname -a > /mnt/gluster/version.txt
javi@nodo4:/mnt/gluster$ ls -la
total 28
drwxr-xr-x 2 javi root 4096 2010-04-26 10:25 .
drwxr-xr-x 4 root root 4096 2010-04-26 10:07 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt
-rw-r--r-- 1 javi javi   92 2010-04-26 10:25 version.txt

3. Encendemos el servidor que teniamos apagado (crash simulado)…. pero que pasa????? El archivo no está!!!!!

Welcome to Ubuntu!
* Documentation:  https://help.ubuntu.com/
You have mail.
Last login: Mon Apr 26 10:27:08 2010
javi@nodo1:~$ ls -la /opt/gluster/export
total 20
drwxr-xr-x 2 javi root 4096 2010-04-26 10:20 .
drwxr-xr-x 4 root root 4096 2010-04-26 08:42 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt

4. No nos alarmemos, un simple acceso desde un cliente al archivo servira para que el gluster ejecute un auto heal y aparezca magicamente en nodo1, el que teniamos apagado:

javi@nodo4:/mnt/gluster$ ls -la
total 28
drwxr-xr-x 2 javi root 4096 2010-04-26 10:25 .
drwxr-xr-x 4 root root 4096 2010-04-26 10:07 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt
-rw-r--r-- 1 javi javi   92 2010-04-26 10:25 version.txt
javi@nodo1:~$ ls -la /opt/gluster/export
total 28
drwxr-xr-x 2 javi root 4096 2010-04-26 10:25 .
drwxr-xr-x 4 root root 4096 2010-04-26 08:42 ..
-rw-r--r-- 1 javi javi  605 2010-04-26 10:20 info_cpu.txt
-rw-r--r-- 1 javi javi   92 2010-04-26 10:25 version.txt

Añadir un nuevo cliente o servidor al Gluster

1. Editaremos el /etc/hosts añadiendo la ip y el hostname

2. En los servidores existentes (y haciendolo de uno en uno)
Añadimos en :

/etc/glusterfs/glusterfsd.vol:
option auth.addr.brick.allow 192.168.36.129,192.168.36.130,192.168.36.131,192.168.36.132,...,NUEVA IP (separadas por comas siempre)

Reiniciamos el glusterfs-server tras ir haciendo los cambios, nodo por nodo,  sudo /etc/init.d/glusterfs-server restart

3. En los servidores nuevos copiamos la config de uno de los nodos (tras su modificacion del paso 2)

4. En los clientes instalamos el soporte para glusterfs con sudo aptitude install glusterfs-client y copiamos el fichero de configuracion del otro cliente o creamos uno nuevo. Incluiremos el nuevo nodo de igual forma que estaban ya los anteriores añadiendo al

/etc/glusterfs/glusterfs.vol:
volume nodo4
type protocol/client
option transport-type tcp
option remote-host nodo4
option remote-subvolume brick
end-volumevolume replicate
type cluster/replicate
subvolumes nodo1 nodo2 nodo3 nodo4

5. Creamos el mountpoint y montamos en el cliente el gluster como se indico anteriormente con

javi@nodoclientenuevo:~$ sudo mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/gluster