Almacenamiento · 10 min read · Nov 29, 2025

Almacenamiento de Alta Disponibilidad con GlusterFS en CentOS 7 - Espejo entre dos servidores de almacenamiento

Este tutorial muestra cómo configurar un almacenamiento de alta disponibilidad con dos servidores de almacenamiento (CentOS 7.2) que utilizan GlusterFS. Cada servidor de almacenamiento será un espejo del otro servidor de almacenamiento, y los archivos se replicarán automáticamente entre ambos servidores de almacenamiento. El sistema cliente (CentOS 7.2 también) 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 petabytes. Agrega varios bloques de almacenamiento a través de Infiniband RDMA o TCP/IP en un gran sistema de archivos de red paralelo. Los bloques de almacenamiento pueden estar hechos de cualquier hardware común, como servidores x86_64 con RAID SATA-II y HBA Infiniband.

1 Nota Preliminar

En este tutorial utilizo tres sistemas, dos servidores y un cliente:

  • server1.example.com: dirección IP 192.168.0.100 (servidor)
  • server2.example.com: dirección IP 192.168.0.101 (servidor)
  • client1.example.com: dirección IP 192.168.0.102 (cliente)

Los tres sistemas deben poder resolver los nombres de host de los otros sistemas. Si esto no se puede hacer a través de DNS, debes editar el archivo /etc/hosts para que se vea como sigue en los tres sistemas:

nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100   server1.example.com     server1
192.168.0.101   server2.example.com     server2
192.168.0.102   client1.example.com     client1

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

(También es posible usar direcciones IP en lugar de nombres de host en la configuración siguiente. Si prefieres usar direcciones IP, no tienes que preocuparte por si los nombres de host se pueden resolver o no.)

2 Habilitar Repositorios Adicionales

server1.example.com/server2.example.com/client1.example.com:

Primero, importamos las claves GPG para los paquetes de software:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Luego habilitamos el repositorio EPEL 7 en nuestros sistemas CentOS:

yum -y install epel-release
yum -y install yum-priorities

Edita /etc/yum.repos.d/epel.repo…

nano /etc/yum.repos.d/epel.repo

… y agrega la línea priority=10 a la sección [epel]:

[epel]
name=Paquetes Extra para Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Luego actualizamos nuestros paquetes existentes en el sistema:

yum -y update

3 Configuración de los Servidores GlusterFS

server1.example.com/server2.example.com:

GlusterFS está disponible en el repositorio del grupo de interés especial de almacenamiento de CentOS. Instala el repositorio con este comando:

yum -y install centos-release-gluster

Luego instala el servidor GlusterFS de la siguiente manera:

yum -y install glusterfs-server

Crea los enlaces de inicio del sistema para el demonio Gluster y arráncalo:

systemctl enable glusterd.service  
systemctl start glusterd.service

El comando

glusterfsd --version

debiera mostrar ahora la versión de GlusterFS que acabas de instalar (3.7.12 en este caso):

[root@server1 ~]# glusterfsd --version  
glusterfs 3.7.12 built on Jun 24 2016 14:11:19  
Repository revision: git://git.gluster.com/glusterfs.git  
Copyright (c) 2006-2013 Red Hat, Inc.   
GlusterFS viene con ABSOLUTAMENTE NINGUNA GARANTÍA.  
Está licenciado para ti bajo tu elección de la Licencia Pública General Reducida de GNU, versión 3 o cualquier versión posterior (LGPLv3 o posterior), o la Licencia Pública General de GNU, versión 2 (GPLv2), en todos los casos como lo publica la Free Software Foundation.

Si utilizas un firewall, asegúrate de que los puertos TCP 111, 24007, 24008, 24009-(24009 + número de bloques en todos los volúmenes) estén abiertos en server1.example.com y server2.example.com.

A continuación, debemos agregar server2.example.com al grupo de almacenamiento de confianza (ten en cuenta que estoy ejecutando todos los comandos de configuración de GlusterFS desde server1.example.com, pero también puedes ejecutarlos desde server2.example.com porque la configuración se replica entre los nodos de GlusterFS; solo asegúrate de usar los nombres de host o direcciones IP correctas):

server1.example.com:

En server1.example.com, ejecuta

gluster peer probe server2.example.com
[root@server1 ~]# gluster peer probe server2.example.com  
peer probe: success.

El estado del grupo de almacenamiento de confianza debería ser ahora similar a esto:

gluster peer status
[root@server1 ~]# gluster peer status
Número de Pares: 1
Hostname: server2.example.com  
Uuid: 582e10da-aa1b-40b8-908c-213f16f57fe5  
Estado: Par en Clúster (Conectado)

A continuación, creamos el recurso compartido llamado testvol con dos réplicas (ten en cuenta que el número de réplicas es igual al número de servidores en este caso porque queremos configurar el espejado) en server1.example.com y server2.example.com en el directorio /data (esto se creará si no existe):

gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force
[root@server1 ~]# gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force  
volume create: testvol: success: please start the volume to access data  
[root@server1 ~]#

Inicia el volumen:

gluster volume start testvol

El resultado debería ser:

[root@server1 ~]# gluster volume start testvol  
volume start: testvol: success  
[root@server1 ~]#

Es posible que el comando anterior te diga que la acción no fue exitosa:

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

En este caso, debes verificar la salida de…

server1.example.com/server2.example.com:

netstat -tap | grep glusterfsd

en ambos servidores.

Si obtienes una salida como esta…

[root@server1 ~]# netstat -tap | grep glusterfsd  
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:49148 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:49148 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49150 server1.example.c:24007 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:49142 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:49149 ESTABLISHED 22880/glusterfsd  
[root@server1 ~]#

… todo está bien, pero si no obtienes ninguna salida…

[root@server2 ~]# netstat -tap | grep glusterfsd  
[root@server2 ~]#

… reinicia el demonio GlusterFS en el servidor correspondiente (server2.example.com en este caso):

server2.example.com:

systemctl restart glusterd.service

Luego verifica la salida de…

netstat -tap | grep glusterfsd

… nuevamente en ese servidor; ahora debería verse así:

[root@server2 ~]# netstat -tap | grep glusterfsd  
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:49140 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:49149 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:49143 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:49142 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49150 server2.example.c:24007 ESTABLISHED 10971/glusterfsd  
[root@server2 ~]#

Ahora volvamos a server1.example.com:

server1.example.com:

Puedes verificar el estado del volumen con el comando

gluster volume info

[root@server1 ~]# gluster volume info

Volume Name: testvol  
Type: Replicate  
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
Options Reconfigured:  
performance.readdir-ahead: on  
[root@server1 ~]#

Por defecto, todos los clientes pueden conectarse al volumen. Si deseas otorgar acceso solo a client1.example.com (= 192.168.1.102), ejecuta:

gluster volume set testvol auth.allow 192.168.1.102

Ten en cuenta que es posible usar comodines para las direcciones IP (como 192.168.*) y que puedes especificar múltiples 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
[root@server1 ~]# gluster volume info
Volume Name: testvol  
Type: Replicate  
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
Options Reconfigured:  
auth.allow: 192.168.1.102  
performance.readdir-ahead: on  
[root@server1 ~]#

4 Configuración del Cliente GlusterFS

client1.example.com:

En el cliente, podemos instalar el cliente GlusterFS de la siguiente manera:

yum -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 puedes usar server2.example.com en el comando anterior)

Ahora deberías ver el nuevo recurso compartido en las salidas de…

mount
[root@client1 ~]# mount  
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)  
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)  
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930336k,nr_inodes=232584,mode=755)  
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)  
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)  
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)  
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)  
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)  
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/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/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)  
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)  
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)  
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)  
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)  
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)  
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)  
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)  
configfs on /sys/kernel/config type configfs (rw,relatime)  
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)  
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)  
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)  
debugfs on /sys/kernel/debug type debugfs (rw,relatime)  
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)  
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)  
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)  
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=188060k,mode=700)  
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)  
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)  
[root@client1 ~]#

… y…

df -h
[root@client1 ~]# df -h  
Filesystem Size Used Avail Use% Mounted on  
/dev/mapper/centos-root 28G 1.3G 27G 5% /  
devtmpfs 909M 0 909M 0% /dev  
tmpfs 919M 0 919M 0% /dev/shm  
tmpfs 919M 8.6M 910M 1% /run  
tmpfs 919M 0 919M 0% /sys/fs/cgroup  
/dev/sda1 497M 192M 306M 39% /boot  
tmpfs 184M 0 184M 0% /run/user/0  
server1.example.com:/testvol 28G 12G 17G 41% /mnt/glusterfs  
[root@client1 ~]#

En lugar de montar el recurso compartido de GlusterFS manualmente en el cliente, puedes agregar el comando de montaje al archivo /etc/rc.local. No lo agregaré a /etc/fstab ya que rc.local siempre se ejecuta después de que la red está activa, lo cual es necesario para un sistema de archivos de red.

Abre /etc/rc.local y agrega la siguiente línea:

nano /etc/rc.local
[...]  
/usr/sbin/mount.glusterfs server1.example.com:/testvol /mnt/glusterfs

(Nuevamente, en lugar de server1.example.com, también puedes usar server2.example.com)

Para probar si tu /etc/rc.local modificado está funcionando, reinicia el cliente:

reboot

Después del reinicio, deberías encontrar el recurso compartido en las salidas de…

df -h

… y…

mount

5 Pruebas

Ahora vamos a crear algunos archivos de prueba en el recurso compartido de GlusterFS:

client1.example.com:

touch /mnt/glusterfs/test1  
touch /mnt/glusterfs/test2

Ahora verifiquemos el directorio /data en server1.example.com y server2.example.com. Los archivos test1 y test2 deberían estar presentes en cada nodo:

server1.example.com/server2.example.com:

ls -l /data
[root@server1 ~]# ls -l /data  
total 0  
-rw-r--r--. 2 root root 0 Jul 1 2016 test1  
-rw-r--r--. 2 root root 0 Jul 1 2016 test2  
[root@server1 ~]

Ahora apagamos server1.example.com y agregamos/borramos algunos archivos en el recurso compartido de GlusterFS en client1.example.com.

server1.example.com:

shutdown -h now

client1.example.com:

touch /mnt/glusterfs/test3  
touch /mnt/glusterfs/test4  
rm -f /mnt/glusterfs/test2

Los comandos pueden tardar un tiempo en ejecutarse a medida que GlusterFS cambia a server2 después de que no puede alcanzar server1. Aquí podemos ver la tolerancia a fallos del sistema, ya que aún podemos trabajar en nuestro recurso de almacenamiento de datos cuando server1 está fuera de línea. Los cambios deberían ser visibles en el directorio /data en server2.example.com:

server2.example.com:

ls -l /data
[root@server2 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4

Vamos a reiniciar server1.example.com y a ver el directorio /data:

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test2  
[root@server1 ~]#

Como ves, server1.example.com sincronizó automáticamente los cambios. En caso de que el cambio no se haya sincronizado aún, es fácil de arreglar; solo necesitamos invocar un comando de lectura en el recurso compartido de GlusterFS en client1.example.com, por ejemplo:

client1.example.com:

ls -l /mnt/glusterfs/
[root@client1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4  
[root@server1 ~]#

Ahora echa un vistazo al directorio /data en server1.example.com nuevamente, y deberías ver que los cambios se han replicado a ese nodo:

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4  
[root@server1 ~]#

6 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.