Almacenamiento distribuido con cuatro nodos usando GlusterFS 3.2.x en Ubuntu 12.04


Este tutorial va a enseñarnos cómo combinar cuatro servidores de almacenamiento individuales (ejecutando Ubuntu 12.04) en un solo «gran» servidor de almacenamiento (almacenamiento distribuido) con GlusterFS. La máquina cliente (un Ubuntu 12.04 como no podía ser de otra forma) será capaz de acceder al espacio de almacenamiento de la misma forma que lo haría con un sistema de ficheros local. GlusterFS es un sistema de ficheros en cluster que es capaz de escalas hasta varios petabytes. GlusterFS combina varios nodos de almacenamiento sobre Infiniband RDMA(Remote direct memory access)  o TCP/IP interconectándolos en un gran sistema de ficheros de red. Una de las ventajas principales que presenta GlusterFS es que los nodos de almacenamiento pueden ser máquinas de uso común como servidores x86_64  con SATA-II RAID o fibra (Infiniband HBA).

Importante es hacer notar al lector que este tipo de almacenamiento (almacenamiento distribuido) no proporciona ninguna característica de alta disponibilidad, como pudiera ser el caso de almacenamiento replicado.

1 Nota preliminar

En este tutorial voy a usar 5 máquinas virtuales, cuatro servidores y un cliente:

  • server1.casamier: IP 192.168.2.100 (servidor)
  • server2.casamier: IP 192.168.2.101 (servidor)
  • server3.casamier: IP 192.168.2.102 (servidor)
  • server4.casamier: IP 192.168.2.103 (servidor)
  • client1.casamier: IP 192.168.2.104 (cliente)

Todos los comandos que voy a ejecutar en el tutorial los voy a lanzar con privilegios de root, por lo tanto el lector puede o anteponer sudo a todos ellos o bien pasar a ser root con el siguiente:

sudo su


Los cinco sistemas intervinientes en este tutorial deben ser capaces de resolver los nombres de máquina, tanto el suyo como el resto. En mi caso tengo una máquina en casa que hace de cache DNS y va a ser ella quien resuelva. En el caso de que el lector no pueda resolver nombres con DNS, tendrá que editar el fichero /etc/hosts  de todas las máquinas para que contenga dicha información:

vi /etc/hosts

127.0.0.1       localhost.localdomain   localhost
192.168.2.100   server1.casamier     server1
192.168.2.101   server2.casamier     server2
192.168.2.102   server3.casamier     server3
192.168.2.103   server4.casamier     server4
192.168.2.104   client1.casamier     client1

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

(También seria posible usar las direcciones IP en lugar de los nombres de máquina en el tutorial. En el caso de que el lector prefiera usar direcciones IP no seria necesario preocuparnos por las resoluciones de los nombres de las mismas)

2 Configurando los servidores GlusterFS

server1.casamier/server2.casamier/server3.casamier/server4.casamier:

GlusterFS esta disponible como un paquete para Ubuntu 12.04, por lo tanto podemos instalarlo así:

apt-get install glusterfs-server

El comando

glusterfsd --version

debe mostrarnos la versión de GlusterFS que acabamos de instalar (3.2.5 en este caso):

root@server1:~# glusterfsd --version
 glusterfs 3.2.5 built on Jan 31 2012 07:39:58
 Repository revision: git://git.gluster.com/glusterfs.git
 Copyright (c) 2006-2011 Gluster Inc. <http://www.gluster.com>
 GlusterFS comes with ABSOLUTELY NO WARRANTY.
 You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
 root@server1:~#

Si estas usando un firewall, asegúrate que los puertos TCP 111, 24007, 24008, 24009-(24009 + numero de nodos) están abiertos para server1.casamier,server2.casamier, server3.casamier, and server4.casamier.

El siguiente paso es añadir server2.casamier, server3.casamier, and server4.casamier al pool de almacenamiento de confianza (note el lector que en mi caso, todos los comandos de configuración de GlusterFS son ejecutados desde server1.casamier, pero el lector podría ejecutarlos desde cualquiera de los servidores puesto que la configuración es replicada al resto de los nodos GlusterFS – sólo debes asegurarte de usar los nombres o las direcciones IP correctas):

server1.casamier:

En server1.casamier, ejecutamos:

gluster peer probe server2.casamier
gluster peer probe server3.casamier
gluster peer probe server4.casamier

La salida debe ser la siguiente:

root@server1:~# gluster peer probe server2.casamier
Probe successful
root@server1:~#

El estado del pool de almacenamiento de confianza debería ser similar al siguiente:

gluster peer status

root@server1:~# gluster peer status
 Number of Peers: 3

Hostname: server2.casamier
 Uuid: da79c994-eaf1-4c1c-a136-f8b273fb0c98
 State: Peer in Cluster (Connected)

Hostname: server3.casamier
 Uuid: 3e79bd9f-a4d5-4373-88e1-40f12861dcdd
 State: Peer in Cluster (Connected)

Hostname: server4.casamier
 Uuid: c6215943-00f3-492f-9b69-3aa534c1d8f3
 State: Peer in Cluster (Connected)
 root@server1:~#

Bien, el siguiente paso va a ser crear el recurso distribuido y compartido con nombre testvol en server1.casamier, server2.casamier, server3.casamier, and server4.casamier en el directorio /data (si no existen en tus sistemas créalos):

gluster volume create testvol transport tcp server1.casamier:/data server2.casamier:/data server3.casamier:/data server4.casamier:/data
root@server1:~# gluster volume create testvol transport tcp server1.casamier:/data server2.casamier:/data server3.casamier:/data server4.casamier:/data
Creation of volume testvol has been successful. Please start the volume to access data.
root@server1:~#

Vamos a levantar el volumen creado:

gluster volume start testvol

Es posible que el comando anterior te indique que no ha sido posible levantar el volumen:

root@server1:~# gluster volume start testvol
Starting volume testvol has been unsuccessful
root@server1:~#

En este caso verificad la salida de…

server1.casamier/server2.casamier/server3.casamier/server4.casamier:

netstat -tap | grep glusterfsd

en todos los servidores.

Si obtienes una salida como esta…

root@server1:~# netstat -tap | grep glusterfsd
tcp        0      0 *:24009                 *:*                     LISTEN      1110/glusterfsd
tcp        0      0 localhost.localdom:1019 localhost.localdo:24007 ESTABLISHED 1110/glusterfsd
root@server1:~#

… todo ha ido ok, pero si no obtienes ninguna…

root@server2:~# netstat -tap | grep glusterfsd
root@server2:~#

<code>root@server3:~# netstat -tap | grep glusterfsd
root@server3:~#

<code>root@server4:~# netstat -tap | grep glusterfsd
root@server4:~#

… reinicia el demonio de GlusterFS en el servidor que corresponda (server2.casamier, server3.casamier, and server4.casamier en este caso):

server2.casamier/server3.casamier/server4.casamier:

/etc/init.d/glusterfs-server restart

Verificad la salida de…

netstat -tap | grep glusterfsd

… de nuevo en esos servidores – debería tener una pinta como la siguiente:

root@server2:~# netstat -tap | grep glusterfsd
tcp        0      0 *:24009                 *:*                     LISTEN      1152/glusterfsd
tcp        0      0 localhost.localdom:1018 localhost.localdo:24007 ESTABLISHED 1152/glusterfsd
root@server2:~#</code>

<code>root@server3:~# netstat -tap | grep glusterfsd
tcp        0      0 *:24009                 *:*                     LISTEN      1311/glusterfsd
tcp        0      0 localhost.localdom:1018 localhost.localdo:24007 ESTABLISHED 1311/glusterfsd
root@server3:~#</code>

<code>root@server4:~# netstat -tap | grep glusterfsd
tcp        0      0 *:24009                 *:*                     LISTEN      1297/glusterfsd
tcp        0      0 localhost.localdom:1019 localhost.localdo:24007 ESTABLISHED 1297/glusterfsd
root@server4:~#

Ahora de nuevo en server1.casamier podemos verificar el estado del volumen con el siguiente comando:

gluster volume info
root@server1:~# gluster volume info

Volume Name: testvol
Type: Distribute
Status: Started
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1.casamier:/data
Brick2: server2.casamier:/data
Brick3: server3.casamier:/data
Brick4: server4.casamier:/data
root@server1:~#

Por defecto, todos los clientes pueden conectar con el volumen. En el caso de que solo quisiéramos permitir el acceso a client1.casamier (= 192.168.2.104), ejecutaremos:

gluster volume set testvol auth.allow 192.168.2.104

Indicar sobre el comando anterior que se pueden usar comodines para las direcciones IP (ej 192.168.*) y que se pueden especificar múltiples direcciones IP separadas por comas (ej.192.168.2.104,192.168.2.105).

La información de volumen debiera mostrar ahora su estado actualizado:

gluster volume info
root@server1:~# gluster volume info

Volume Name: testvol
Type: Distribute
Status: Started
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1.casamier:/data
Brick2: server2.casamier:/data
Brick3: server3.casamier:/data
Brick4: server4.casamier:/data
Options Reconfigured:
auth.allow: 192.168.2.104
root@server1:~#

3 Configuracion del cliente GlusterFS

client1.casamier:

Del lado del cliente, podemos instalar el cliente GlusterFS con el siguiente comando:

apt-get install glusterfs-client

Crearemos (ej) el siguiente directorio para el montaje:

mkdir /mnt/glusterfs

Pues esto es todo amigos! Ahora podemos montar el sistema de ficheros GlusterFS en /mnt/glusterfs con el siguiente comando:

mount.glusterfs server1.casamier:/testvol /mnt/glusterfs

(En el comando anterior, en lugar de server1.casamier puedes usar también server2.casamier o server3.casamier o server4.casamier!)

En esta situación debieras estar viendo el almacenamiento compartido en la salida de mount:

root@client1:~# mount
/dev/mapper/server5-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
server1.casamier:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,allow_other,default_permissions,max_read=131072)
root@client1:~#

… y df -h:

root@client1:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/server5-root 9G 1.1G 27G 4%
/udev 238M 4.0K 238M 1%
/devtmpfs 99M 212K 99M 1%
/runnone 5.0M 0 5.0M 0%
/run/locknone 247M 0 247M 0%
/run/shm/dev/sda1 228M 24M 193M 11%
/bootserver1.casamier:/testvol 116G 4.2G 106G 4% /mnt/glusterfs
root@client1:~#

Siguiente paso, en lugar de montar el compartido GlusterFS manualmente en el cliente, modifiquemos el fichero /etc/fstab para que dicho montaje se realice de forma automática en el arranque.

Abrimos /etc/fstab y añadimos la siguiente linea:

vi /etc/fstab

server1.casamier:/testvol /mnt/glusterfs glusterfs defaults,_netdev 0 0

(De nuevo, en el comando anterior, en lugar de server1.casamier puedes usar también server2.casamier o server3.casamier o server4.casamier!)

La mejor forma de verificar que la modificación de /etc/fstab esta funcionando es reiniciar el cliente:

reboot

Después del reinicio deberías ver el sistema de ficheros compartido en las salidas tanto de df -h como en mount.

4 Verificación del sistema de ficheros compartido

Creemos algunos ficheros de prueba en el compartido GlusterFS:

client1.casamier:

touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
touch /mnt/glusterfs/test5
touch /mnt/glusterfs/test6

Verifiquemos ahora el directorio /data en server1.casamier, server2.casamier, server3.casamier, and server4.casamier. Te darás cuenta que cada uno de los nodos de almacenamiento contiene solo una parte de los ficheros/directorios que el sistema de ficheros GlusterFS comparte con el cliente:

server1.casamier:

ls -l /data

root@server1:~# ls -l /data
total 0
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test1
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test2
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test5
root@server1:~#

server2.casamier:

ls -l /data

root@server2:~# ls -l /data
total 0
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test4
root@server2:~#

server3.casamier:

ls -l /data

<code>root@server3:~# ls -l /data
total 0
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test6
root@server3:~#

server4.casamier:

ls -l /data

root@server4:~# ls -l /data
total 0
-rw-r--r-- 1 root root 0 2012-05-29 14:26 test3
root@server4:~#

5 Enlaces de interés

You must be logged in to post a comment.