Este tutorial muestra cómo configurar un almacenamiento de alta disponibilidad con dos servidores de almacenamiento (Debian Jessie) que usa GlusterFS. Cada servidor de almacenamiento será un espejo del otro servidor de almacenamiento y los archivos se replicarán automáticamente en ambos nodos de almacenamiento. El sistema cliente (también Debian 8) podrá acceder al almacenamiento como si fuera un sistema de archivos local. GlusterFS es un sistema de archivos en clúster capaz de escalar a varios peta-bytes. Agrega varios bloques de almacenamiento sobre la interconexión Infiniband RDMA o TCP/IP en un gran sistema de archivos de red paralelo. Los bloques de almacenamiento se pueden fabricar con cualquier hardware básico, como servidores x86_64 con SATA-II RAID e Infiniband HBA.
1 nota preliminar
En este tutorial, usaré tres sistemas, dos servidores y un cliente:
- servidor1.ejemplo.com:dirección IP 192.168.1.100 (servidor)
- servidor2.ejemplo.com:dirección IP 192.168.1.101 (servidor)
- cliente1.ejemplo.com:dirección IP 192.168.1.102 (cliente)
Los tres sistemas deberían poder resolver los nombres de host de los otros sistemas. Si esto no se puede hacer a través de DNS, debe editar el archivo /etc/hosts para que tenga el siguiente aspecto en los tres sistemas:
nano /etc/hosts
127.0.0.1 localhost
192.168.1.100 server1.example.com server1
192.168.1.101 server2.example.com server2
192.168.1.102 client1.example.com client1
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
(También es posible usar direcciones IP en lugar de nombres de host en la siguiente configuración. Si prefiere usar direcciones IP, no tiene que preocuparse si los nombres de host se pueden resolver o no).
2 Configuración de los servidores GlusterFS
servidor1.ejemplo.com/servidor2.ejemplo.com:
La última versión de GlusterFS está disponible como paquete Debian en gluster.org. Podemos instalarlo de la siguiente manera:
Añadimos la clave pública del repositorio gluster.org Debian en ambos servidores.
wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/rsa.pub | apt-key add -
Luego agregue el repositorio GlusterFS (¡el comando es una línea!)
echo deb http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/Debian/jessie/apt jessie main > /etc/apt/sources.list.d/gluster.list
y actualice la lista de repositorios.
apt-get update
Ahora podemos instalar el software del servidor GlusterFS con apt.
apt-get -y install glusterfs-server
El comando
glusterfsd --version
ahora debería mostrar la versión de GlusterFS que acaba de instalar (3.7.9 en este caso):
[email protected]:/# glusterfsd --version
glusterfs 3.7.9 built on Mar 23 2016 05:24:49
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2013 Red Hat, Inc. <http://www.redhat.com/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.
[email protected]:/#
Si usa un firewall, asegúrese de que los puertos TCP 111, 24007, 24008, 24009-(24009 + cantidad de ladrillos en todos los volúmenes) estén abiertos en server1.example.com y server2.example.com.
Glusterfs almacenará sus datos en el directorio /data de los servidores. Esta ubicación puede ser un directorio normal si tiene una instalación más pequeña o si usa una partición de disco duro separada y la monta como /datos.
Ejecutar en ambos servidores:
mkdir /data
para crear el directorio de datos.
A continuación, debemos agregar server2.example.com al grupo de almacenamiento de confianza (tenga en cuenta que estoy ejecutando todos los comandos de configuración de GlusterFS desde server1.example.com, pero también puede ejecutarlos desde server2.example.com porque la configuración se replica entre los nodos GlusterFS; solo asegúrese de usar los nombres de host o las direcciones IP correctos):
servidor1.ejemplo.com:
En server1.example.com, ejecute
gluster peer probe server2.example.com
[email protected]:/# gluster peer probe server2.example.com
peer probe: success.
[email protected]:/#
El estado del grupo de almacenamiento de confianza ahora debería ser similar a este:
gluster peer status
[email protected]:/# gluster peer status
Number of Peers: 1
Hostname: server2.example.com
Uuid: 0f7ee46c-6a71-4a31-91d9-6076707eff95
State: Peer in Cluster (Connected)
[email protected]:/#
A continuación, creamos el recurso compartido llamado testvol con dos réplicas (tenga en cuenta que la cantidad de réplicas es igual a la cantidad de servidores en este caso porque queremos configurar la duplicación) en server1.example.com y server2.example.com en el directorio /data/testvol (se creará si no existe):
gluster volume create testvol replica 2 transport tcp server1.example.com:/data/testvol server2.example.com:/data/testvol force
[email protected]:/# gluster volume create testvol replica 2 transport tcp server1.example.com:/data/testvol server2.example.com:/data/testvol force
volume create: testvol: success: please start the volume to access data
[email protected]:/#
Iniciar el volumen:
gluster volume start testvol
[email protected]:/# gluster volume start testvol
volume start: testvol: success
[email protected]:/#
Nuestro volumen de prueba se ha iniciado con éxito.
Es posible que el comando anterior le indique que la acción no tuvo éxito:
[email protected]:~# gluster volume start testvol
Starting volume testvol has been unsuccessful
[email protected]:~#
En este caso, debe verificar la salida de...
servidor1.ejemplo.com/servidor2.ejemplo.com:
netstat -tap | grep glusterfsd
en ambos servidores.
Si obtiene un resultado como este...
[email protected]:/# netstat -tap | grep glusterfsd
tcp 0 0 *:49152 *:* LISTEN 8007/glusterfsd
tcp 0 0 server1.example.c:65533 server1.example.c:24007 ESTABLISHED 8007/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:65531 ESTABLISHED 8007/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:65532 ESTABLISHED 8007/glusterfsd
tcp 0 0 server1.example.c:49152 server1.example.c:65531 ESTABLISHED 8007/glusterfsd
tcp 0 0 server1.example.c:49152 server2.example.c:65526 ESTABLISHED 8007/glusterfsd
[email protected]:/#
... todo está bien, pero si no obtiene ningún resultado...
[email protected]:~# netstat -tap | grep glusterfsd
[email protected]:~#
... reinicie el demonio GlusterFS en el servidor correspondiente (server1.example.com en este caso):
servidor2.ejemplo.com:
service glusterfs-server restart
Luego verifique la salida de...
netstat -tap | grep glusterfsd
... de nuevo en ese servidor - ahora debería verse así:
[email protected]:/# netstat -tap | grep glusterfsd
tcp 0 0 *:49152 *:* LISTEN 7852/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:65532 ESTABLISHED 7852/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:65526 ESTABLISHED 7852/glusterfsd
tcp 0 0 server2.example.c:49152 server2.example.c:65525 ESTABLISHED 7852/glusterfsd
tcp 0 0 server2.example.c:65533 server2.example.c:24007 ESTABLISHED 7852/glusterfsd
tcp 0 0 server2.example.c:49152 server1.example.c:65524 ESTABLISHED 7852/glusterfsd
[email protected]:/#
Ahora regrese a server1.example.com:
servidor1.ejemplo.com:
Puede verificar el estado del volumen con el comando
gluster volume info
[email protected]:/# gluster volume info
Volume Name: testvol
Type: Replicate
Volume ID: 3fc9af57-ca56-4a72-ad54-3d2ea03e5883
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data/testvol
Brick2: server2.example.com:/data/testvol
Options Reconfigured:
performance.readdir-ahead: on
[email protected]:/#
De forma predeterminada, todos los clientes pueden conectarse al volumen. Si desea otorgar acceso únicamente a client1.example.com (=192.168.1.102), ejecute:
gluster volume set testvol auth.allow 192.168.1.102
[email protected]:/# gluster volume set testvol auth.allow 192.168.1.102
volume set: success
[email protected]:/#
Tenga en cuenta que es posible utilizar comodines para las direcciones IP (como 192.168.*) y que puede especificar varias direcciones IP separadas por comas (por ejemplo, 192.168.1.102, 192.168.1.103).
La información del volumen ahora debería mostrar el estado actualizado:
gluster volume info
[email protected]:/# información de volumen de gluster
Volume Name: testvol
Type: Replicate
Volume ID: 3fc9af57-ca56-4a72-ad54-3d2ea03e5883
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.example.com:/data/testvol
Brick2: server2.example.com:/data/testvol
Options Reconfigured:
auth.allow: 192.168.1.102
performance.readdir-ahead: on
[email protected]:/#
3 Configuración del cliente GlusterFS
cliente1.ejemplo.com:
En el sistema cliente, primero agregamos la clave pública del repositorio gluster.org Debian.
wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/rsa.pub | apt-key add -
Luego agregue el repositorio GlusterFS (¡el comando es una línea!)
echo deb http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.9/Debian/jessie/apt jessie main > /etc/apt/sources.list.d/gluster.list
y actualice la lista de repositorios.
apt-get update
Ahora podemos instalar el cliente GlusterFS de la siguiente manera.
apt-get -y install glusterfs-client
Luego creamos el siguiente directorio:
mkdir /mnt/glusterfs
¡Eso es todo! Ahora podemos montar el sistema de archivos GlusterFS en /mnt/glusterfs con el siguiente comando:
mount.glusterfs server1.example.com:/testvol /mnt/glusterfs
(¡En lugar de server1.example.com, también puede usar server2.example.com en el comando anterior!)
Ahora debería ver el nuevo recurso compartido en los resultados de...
mount
[email protected]:/# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=125556,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,relatime,size=204220k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=23,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
server1.example.com:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)
[email protected]:/#
... y...
df -h
[email protected]:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 57G 1.1G 53G 2% /
udev 10M 0 10M 0% /dev
tmpfs 200M 4.6M 195M 3% /run
tmpfs 499M 0 499M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 499M 0 499M 0% /sys/fs/cgroup
server1.example.com:/testvol 57G 21G 34G 39% /mnt/glusterfs
[email protected]:/#
En lugar de montar el recurso compartido GlusterFS manualmente en el cliente, puede modificar /etc/fstab para que el recurso compartido se monte automáticamente cuando se inicie el cliente.
Abra /etc/fstab y agregue la siguiente línea:
nano /etc/fstab
[...] server1.example.com:/testvol /mnt/glusterfs glusterfs defaults,_netdev 0 0
(De nuevo, en lugar de server1.example.com, ¡también puede usar server2.example.com!)
Para probar si su /etc/fstab modificado está funcionando, reinicie el cliente:
reboot
Después del reinicio, debería encontrar el recurso compartido en las salidas de...
df -h
... y...
mount
4 Probando la replicación de GlusterFS
Ahora vamos a crear algunos archivos de prueba en el recurso compartido GlusterFS:
cliente1.ejemplo.com:
touch /mnt/glusterfs/test1
touch /mnt/glusterfs/test2
Ahora revisemos el directorio /data en server1.example.com y server2.example.com. Los archivos test1 y test2 deben estar presentes en cada nodo:
servidor1.ejemplo.com/servidor2.ejemplo.com:
ls -l /data/testvol
[email protected]:/# ls -l /data/testvol/
total 0
-rw-r--r-- 2 root root 0 Mar 23 2016 test1
-rw-r--r-- 2 root root 0 Mar 23 2016 test2
Ahora cerramos server1.example.com y agregamos/eliminamos algunos archivos en el recurso compartido GlusterFS en client1.example.com.
servidor1.ejemplo.com:
shutdown -h now
cliente1.ejemplo.com:
touch /mnt/glusterfs/test3
touch /mnt/glusterfs/test4
rm -f /mnt/glusterfs/test2
Los cambios deberían estar visibles en el directorio /data/testvol en server2.example.com:
servidor2.ejemplo.com:
ls -l /data/testvol
[email protected]:/# ls -l /data/testvol
total 8
-rw-r--r-- 2 root root 0 Mar 23 08:06 test1
-rw-r--r-- 2 root root 0 Mar 23 08:09 test3
-rw-r--r-- 2 root root 0 Mar 23 08:09 test4
[email protected]:/#
Iniciemos server1.example.com nuevamente y echemos un vistazo al directorio /data:
servidor1.ejemplo.com:
ls -l /data/testvol
[email protected]:/# ls -l /data/testvol
total 0
-rw-r--r-- 2 root root 0 Mar 23 08:06 test1
-rw-r--r-- 2 root root 0 Mar 23 08:09 test3
-rw-r--r-- 2 root root 0 Mar 23 08:09 test4
[email protected]:/#
Como puede ver, server1.example.com sincronizó automáticamente el cambio. En caso de que el cambio aún no se haya sincronizado, esto es fácil de arreglar, todo lo que tenemos que hacer es invocar un comando de lectura en el recurso compartido GlusterFS en client1.example.com, por ejemplo:
cliente1.ejemplo.com:
ls -l /mnt/glusterfs/
[email protected]:/# ls -l /mnt/glusterfs/
total 0
-rw-r--r-- 1 root root 0 Mar 23 08:06 test1
-rw-r--r-- 1 root root 0 Mar 23 08:09 test3
-rw-r--r-- 1 root root 0 Mar 23 08:09 test4
[email protected]:/#
5 Enlaces
- GlusterFS:http://www.gluster.org/
- Documentación de GlusterFS: http://gluster.readthedocs.org/en/latest/
- Debian:http://www.debian.org/