GNU/Linux >> Tutoriales Linux >  >> Cent OS

Almacenamiento de alta disponibilidad con GlusterFS en CentOS 7:espejo en dos servidores de almacenamiento

Este tutorial muestra cómo configurar un almacenamiento de alta disponibilidad con dos servidores de almacenamiento (CentOS 7.2) que usan GlusterFS. Cada servidor de almacenamiento será un espejo del otro servidor de almacenamiento y los archivos se replicarán automáticamente en ambos servidores de almacenamiento. El sistema cliente (también CentOS 7.2) 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 utilizo tres sistemas, dos servidores y un cliente:

  • servidor1.ejemplo.com:dirección IP 192.168.0.100 (servidor)
  • servidor2.ejemplo.com:dirección IP 192.168.0.101 (servidor)
  • cliente1.ejemplo.com:dirección IP 192.168.0.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 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 siguiente configuración. Si prefiere usar direcciones IP, no tiene que preocuparse si los nombres de host se pueden resolver o no).

2 Habilitar repositorios adicionales

servidor1.ejemplo.com/servidor2.ejemplo.com/cliente1.ejemplo.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

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

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

... y agregue la línea prioridad=10 a la sección [epel]:

[epel]
name=Extra Packages for 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

servidor1.ejemplo.com/servidor2.ejemplo.com:

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

yum -y install centos-release-gluster

Luego instale el servidor GlusterFS de la siguiente manera:

yum -y install glusterfs-server

Cree los enlaces de inicio del sistema para el demonio Gluster e inícielo:

systemctl enable glusterd.service
systemctl start glusterd.service

El comando

glusterfsd --version

ahora debería mostrar la versión de GlusterFS que acaba de instalar (3.7.12 en este caso):

[[email protected] ~]# 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. <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.

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.

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.

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: 582e10da-aa1b-40b8-908c-213f16f57fe5
State: Peer in Cluster (Connected)

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 (se creará si no existe):

gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force
[[email protected] ~]# 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
[[email protected] ~]#

Iniciar el volumen:

gluster volume start testvol

El resultado debería ser:

[[email protected] ~]# gluster volume start testvol
volume start: testvol: success
[[email protected] ~]#

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 comprobar 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 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
[[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 (server2.example.com en este caso):

servidor2.ejemplo.com:

systemctl restart glusterd.service

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 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
[[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] ~]# información de volumen de gluster

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
[[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

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] ~]# 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
[[email protected] ~]#

4 Configuración del cliente GlusterFS

cliente1.ejemplo.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 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,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)
[[email protected] ~]#

... y...

df -h
[[email protected] ~]# 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
[[email protected] ~]#

En lugar de montar el recurso compartido GlusterFS manualmente en el cliente, agrega 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

Abra /etc/rc.local y agregue la siguiente línea:

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

(De nuevo, en lugar de server1.example.com, ¡también puede usar server2.example.com!)

Para probar si su /etc/rc.local modificado funciona, reinicie el cliente:

reboot

Después del reinicio, debería 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 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
[[email protected] ~]# 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
[[email protected] ~]

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 comandos pueden tardar un tiempo en ejecutarse ya que Glusterfs cambia al servidor 2 después de que ya no puede acceder al servidor 1. Podemos ver aquí la tolerancia a fallas del sistema, ya que aún podemos trabajar en nuestro recurso compartido de almacenamiento de datos cuando el servidor 1 está fuera de línea. Los cambios deberían estar visibles en el directorio /data en server2.example.com:

servidor2.ejemplo.com:

ls -l /data
[[email protected] ~]# 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

Iniciemos server1.example.com nuevamente y echemos un vistazo al directorio /data:

servidor1.ejemplo.com:

ls -l /data
[[email protected] ~]# 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
[[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 /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
[[email protected] ~]#

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

servidor1.ejemplo.com:

ls -l /data
[[email protected] ~]# 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
[[email protected] ~]#

6 Enlaces

  • GlusterFS:http://www.gluster.org/
  • Documentación de GlusterFS 3.2:http://download.gluster.com/pub/gluster/glusterfs/3.2/Documentation/AG/html/index.html
  • CentOS:http://www.centos.org/

Cent OS
  1. Almacenamiento de alta disponibilidad con GlusterFS en Debian 8:espejo en dos servidores de almacenamiento

  2. Almacenamiento de alta disponibilidad con GlusterFS 3.0.x en Debian Squeeze:replicación automática de archivos en dos servidores de almacenamiento

  3. Almacenamiento de alta disponibilidad con GlusterFS 3.2.x en Debian Wheezy:replicación automática de archivos (espejo) en dos servidores de almacenamiento

  4. Distribución de cuatro nodos de almacenamiento con GlusterFS en Fedora 12

  5. Almacenamiento de alta disponibilidad con GlusterFS en Fedora 12:replicación automática de archivos (espejo) en dos servidores de almacenamiento

Distribución de cuatro nodos de almacenamiento con GlusterFS en CentOS 5.4

Almacenamiento de alta disponibilidad con GlusterFS 3.2.x en CentOS 6.3:replicación automática de archivos (espejo) en dos servidores de almacenamiento

Creación de un servidor de almacenamiento independiente similar a NFS con GlusterFS 3.2.x en CentOS 6.3

Distribución en cuatro nodos de almacenamiento con GlusterFS 3.2.x en CentOS 6.3

Almacenamiento distribuido en cuatro nodos de almacenamiento con GlusterFS 3.2.x en CentOS 6.3

Almacenamiento replicado distribuido en cuatro nodos de almacenamiento con GlusterFS 3.2.x en CentOS 6.3