Almacenamiento compartido con GlusterFS en Proxmox VE

Saludos nuevamente.

Primero que todo, el contenido de este post está basado en mi manual Configuración de un Clúster de Alta Disponibilidad con dos nodos Proxmox VE 3.2. Un manual de auto-consulta que he hecho, el cual lo he ido enriqueciendo a medida que he hecho cosas, lo nuevo que hago lo voy añadiendo como anexos (no será la organización más adecuada del contenido de un libro, pero pienso modificarla más adelante cuando tenga un poco más de tiempo y recursos). El tema que a continuación mostraré pertenece al Anexo 4: Almacenamiento compartido con GlusterFS en Proxmox VE, el cual estuve haciendo por allá por mayo de 2014 en mi casa.

Sin más preámbulo, aquí les va.

Anexo 4 – Almacenamiento compartido con GlusterFS en Proxmox VE

Como se dijo anteriormente en la página 22, el tipo de almacenamiento compartido que se debe utilizar en un Clúster HA Proxmox de dos nodos es el DRBD (no dicho por mi, eso está en la Wiki de Proxmox VE). No obstante, en este anexo se describe cómo utilizar un almacenamiento compartido utilizando un clúster GlusterFS conformado por dos equipos con GNU/Linux.

Primero que todo, hay que saber qué cosa es GlusterFS (Tomado de Wikipedia).

—————————————–

¿Qué es GlusterFS?

El Sistema de Archivos Gluster, Gluster File System o GlusterFS, es un multiescalable sistema de archivos para NAS desarrollado inicialmente por Gluster Inc. Este permite agregar varios servidores de archivos sobre Ethernet o interconexiones Infiniband RDMA en un gran entorno de archivos de red en paralelo. El diseño del GlusterFS se basa en la utilización del espacio de usuario y de esta manera no compromete el rendimiento. Se pueden encontrar siendo utilizado en una gran variedad de entornos y aplicaciones como computación en nube, ciencias biomédicas y almacenamiento de archivos. El GlusterFS está licenciado bajo la licencia GNU General Public License versión 3.

Gluster Inc fue el principal patrocinador comercial del GlusterFS, el cual ofrece tanto productos comerciales como apoyo para desarrollo de soluciones libres basadas en el GlusterFS. En Octubre de 2011, fue anunciada la adquisición de Gluster Inc por Red Hat Inc.

Diseño de GlusterFS

El GlusterFS se basa en la interacción de componentes cliente y servidor. Los servidores normalmente se implementan como almacenamiento en bloques, en cada servidor el proceso daemon glusterfsd exporta un sistema de archivos local como un volumen. El proceso cliente glusterfs, se conecta a los servidores a través de algún protocolo TCP/IP, InfiniBand o SDP, compone volúmenes compuestos virtuales a partir de los múltiples servidores remotos, mediante el uso de traductores. Por defecto, los archivos son almacenados enteros, pero también puede configurarse que se fragmente en múltiples porciones en cada servidor. Los volúmenes pueden ser montados en los equipos cliente mediante el modulo FUSE o acceder a través de la librería cliente libglusterfs sin incurrir en problemas con el sistema de archivos FUSE.

La mayor parte de las funcionalidades del GlusterFS se implementa como traductores, incluyendo:

  • Espejado y la replicación de archivos.
  • Fragmentación de los archivos o Data striping.
  • Balanceo de carga para la lectura y escritura de archivos.
  • Volúmenes con tolerancia a fallos.
  • Planificación de E/S y almacenamiento en caché de disco.
  • Las cuotas de almacenamiento

 

El servidor GlusterFS se mantiene mínimamente simple: exporta un sistema de archivos existente como está, dejando en manos de los traductores del lado del cliente a la estructura del almacenamiento. Los propios clientes se manejan independientemente, no se comunican directamente entre sí, y los traductores administran la consistencia de los datos entre ellos.

El GlusterFS se basa en un algoritmo de hash elástico en vez de utilizar un modelo de metadatos centralizados o distribuidos. Desde la versión 3.1, los volúmenes pueden ser agregados, eliminados o migrados en forma dinámica, esto ayuda a prever problemas de consistencia, y permite que el GlusterFS pueda ser escalado a varios petabytes sobre hardware de bajo coste, evitando así los cuellos de botella que normalmente afectan a muchos sistemas de archivos distribuidos con múltiple concurrencia.

—————————————–

Distribución que se utilizará para el Clúster GlusterFS

Existen varias distribuciones en la comunidad Open-Source que pueden servir como Sistema Operativo base para el clúster con GlusterFS, pero las que más se utilizan para este menester son:

  • Red Hat y derivados (CentOS)
  • Debian y algunos de sus derivados

 

En este apartado se ejemplificará, por el momento, con la distribución  GNU/Linux Debian 7.0. La infraestructura de red que se utilizará es la siguiente:

  • Red de Gestión de los hipervisores y servidor(es) SAN/NAS: 192.168.137.0/24
  • Subred para el Almacenamiento en Red (Red SAN/GlusterFS): 10.0.1.0/24

 

O sea, cada hipervisor tendrá una o varias conexiones diferentes al área de almacenamiento o clúster GlusterFS.

Configuración del Clúster con GlusterFS

A continuación se mostrará la configuración de los equipos para la creación del clúster GlusterFS. Todo el proceso se realizará mediante la interfaz de línea de comandos (CLI).

Para ello se necesitan dos o más servidores o estaciones de trabajo adaptadas como tal (PCs con más recursos que lo normal). Se recomienda que los mismos tengan una cantidad de memoria RAM, microprocesadores rápidos y una buena cantidad de discos duros para lograr tener una buena capacidad de almacenamiento. En este caso se utilizaron dos equipos con 512 MB de RAM, un microprocesador de un solo núcleo y dos discos duros de 80 GB tecnología IDE.

Cada servidor posee dos tarjetas de red GbE, una conectada a la red de gestión y la otra a la red de datos o del GlusterFS. En fin, una imagen vale más que mil palabras, aquí está el diagrama de la infraestructura para la prueba:

GlusterFS - Infra

En este punto, se recomienda detenerse a leer el apartado “Cabina SAN/NAS: Discos duros e Infraestructura de Red, algo importante a tener en cuenta” ubicado previamente en la página 97 para tener una idea clara de la infraestructura de red que hay que utilizar para el área de almacenamiento.

Bueno, entrando en materia, configurar un clúster GlusterFS en GNU/Linux Debian es una de las cosas más sencillas de realizar. Lo primero que hay que hacer es configurar las interfaces de red y la visibilidad entre el los equipos integrantes del clúster y los demás activos, ya sea por nombres FQDN, aliases de los mismos, o por direcciones IP (en otras palabras, teniendo o un servidor DNS bien configurado o el archivo /etc/hosts de cada elemento de la granja de servidores con los datos básicos bien establecidos).

Las interfaces de red se configuran de la siguiente manera:

Nodo GFS-1.RED.CODESA.CO.CU

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

      address 192.168.137.20

      netmask 255.255.255.0

      network 192.168.137.0

      broadcast 192.168.137.255

      gateway 192.168.137.1

 

auto eth1

iface eth1 inet static

      address 10.0.1.1

      netmask 255.255.255.0

      network 10.0.1.0

      broadcast 10.0.1.255

Nodo GFS-2.RED.CODESA.CO.CU

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

      address 192.168.137.21

      netmask 255.255.255.0

      network 192.168.137.0

      broadcast 192.168.137.255

      gateway 192.168.137.1

 

auto eth1

iface eth1 inet static

      address 10.0.1.2

      netmask 255.255.255.0

      network 10.0.1.0

      broadcast 10.0.1.255

En el caso de usar el archivo /etc/hosts para la resolución básica de nombres FQDN, aliases y direcciones IP, el contenido sería el siguiente (las direcciones que aparecen aquí pueden ser adaptadas al escenario que se tenga):

 

127.0.0.1         localhost.localdomain        localhost

 

192.168.137.20    gfs-1.red.codesa.co.cu       gfs-1

192.168.137.21    gfs-2.red.codesa.co.cu       gfs-2

 

192.168.137.10    prx-c0-1.red.codesa.co.cu    prx-c0-1

192.168.137.11    prx-c0-2.red.codesa.co.cu    prx-c0-2

 

10.0.1.1          gfs-1.red.codesa.co.cu       gfs-1

10.0.1.2          gfs-2.red.codesa.co.cu       gfs-2

 

10.0.1.10         prx-c0-1.red.codesa.co.cu    prx-c0-1

10.0.1.11         prx-c0-2.red.codesa.co.cu    prx-c0-2

 

# The following lines are desirable for IPv6 capable hosts

::1     localhost ip6-localhost ip6-loopback

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

Luego de probar la conectividad y visibilidad en red (haciendo ping a los nombres de los servidores), se pasa al plato fuerte: configurar el Clúster GlusterFS.

Preparación del sistema de archivos base del GlusterFS

En toda la literatura consultada sobre implementación de clústeres con GlsuterFS hay un punto de convergencia, y es que el sistema de archivos base que se utiliza es el XFS.

¿Qué es XFS? (Tomado de Wikipedia)

XFS es un sistema de archivos de 64 bits con journaling de alto rendimiento creado por SGI (antiguamente Silicon Graphics Inc.) para su implementación de UNIX llamada IRIX. En mayo de 2000, SGI liberó XFS bajo una licencia de código abierto.

XFS se incorporó a Linux a partir de la versión 2.4.25, cuando Marcelo Tosatti (responsable de la rama 2.4) lo consideró lo suficientemente estable para incorporarlo en la rama principal de desarrollo del kernel. Los programas de instalación de las distribuciones de SuSE, Gentoo, Mandriva, Slackware, Fedora Core, Ubuntu y Debian ofrecen XFS como un sistema de archivos más. En FreeBSD el soporte para solo-lectura de XFS se añadió a partir de diciembre de 2005 y en junio de 2006 un soporte experimental de escritura fue incorporado a FreeBSD-7.0-CURRENT y luego lamentablemente eliminado en FreeBSD 10.0

XFS es el más antiguo de los sistemas de archivos con journaling disponible para la plataforma UNIX, tiene un código maduro, estable y bien depurado. Su desarrollo lo comenzó en 1993 la compañía Silicon Graphics Inc., y apareció por primera vez en el IRIX 5.3 en 1994. El sistema de archivos fue liberado bajo la GNU General Public License en mayo de 2000 y posteriormente portado a GNU/Linux, apareciendo por primera vez en una distribución entre el 2001 y el 2002.

Características del sistema de archivos XFS

Capacidad

XFS soporta un sistema de archivos de hasta 8 exabytes, aunque esto puede variar dependiendo de los límites impuestos por el sistema operativo. En sistemas GNU/Linux de 32 bits, el límite es 16 terabytes.

Registro de bitácora (journaling)

XFS provee soporte para llevar un registro (journaling), donde los cambios al sistema de archivos primero son escritos a un diario o journal antes de que se actualicen los datos del disco. El journal es un buffer circular de bloques del disco que no son parte del sistema de archivos. En XFS el registro (journal) contiene entradas ‘lógicas’ que describen a un alto nivel las operaciones que se están realizando, al contrario de otros sistemas de archivo con un registro (journal) ‘físico’, que guardan una copia de los bloques modificados durante cada transacción. Las actualizaciones del registro (journal) se realizan asincrónicamente para evitar una baja en el rendimiento.

En el caso de una caída repentina del sistema, las operaciones inmediatamente anteriores a la caída pueden ser terminadas, garantizando así la consistencia del sistema. La recuperación se realiza automáticamente a la hora del montaje del sistema de archivos y la velocidad de recuperación es independiente del tamaño del sistema de archivos. Incluso si alguna información que fuese modificada inmediatamente antes de la caída del sistema no fuese escrita al disco, XFS se encarga de borrar todos los bloques de datos sin escribir, eliminando así cualquier compromiso de seguridad.

Grupos de asignación

Los sistemas de archivos XFS están particionados internamente en grupos de asignación, que son regiones lineares de igual tamaño dentro del sistema de archivos. Los archivos y los directorios pueden crear grupos de asignación. Cada grupo gestiona sus inodos y su espacio libre de forma independiente, proporcionando escalabilidad y paralelismo — múltiples hilos pueden realizar operaciones de E/S simultáneamente en el mismo sistema de archivos.

LVM

Es posible aumentar la capacidad de sistemas de ficheros XFS: xfsgrowfs es ideal para particiones LVM.

Actualidad

La distribución comercial de linux Red Hat Enterprise Linux incorporo XFS en su versión 7.0  como su sistema de archivos por defecto, destacando su capacidad de manejar una partición de hasta 500 terabytes.

Creación y montaje del sistema de archivos base para el volumen GlusterFS a exportar

Ya comprendidos los conceptos, se pasa a preparar las particiones. En este caso, y como se dijo anteriormente, se dispone de dos discos duros de 80 GB de tamaño. Para utilizar todo el espacio de disco (160 GB), se utilizará volúmenes LVM. Los pasos son los siguientes:

NOTA: Se asume que los discos en el sistema operativo tienen los apuntadores /dev/sdb y /dev/sdc.

1.- Particionar /dev/sdb con una sola partición que abarque todo el disco y definir su tipo como Linux LVM.
2.- Particionar /dev/sdc con una sola partición que abarque todo el disco y definir su tipo como Linux LVM.
3.- Instalar el paquete lvm2 para la gestión de volúmenes LVM:

# aptitude install lvm2

4.- Instalar el paquete xfsprogs para la gestión de particiones XFS

# aptitude install xfsprogs

5.- Crear volumen físico con las dos particiones previamente creadas:

# pvcreate /dev/sdb /dev/sdc

6.- Crear grupo de volúmenes

# vgcreate VGDATAGFS /dev/sdb /dev/sdc

7.- Crear el volumen lógico que servirá de base a la partición XFS (se utilizará el valor de la cantidad total de extents y no el valor del tamaño total):

# lvcreate -l 40958 –name LVGFS0 VGDATAGFS

8.- Formatear el volumen lógico

# mkfs.xfs /dev/VGDATAGFS/LVGFS0

Al terminar el formato, la partición se ve así:

XFS over LVM - Format partition - 1

9.- Crear el punto de montaje para la nueva partición XFS que será el directorio base para la replicación del GlusterFS

# mkdir -p /srv/storages/glusterfs/gfs0

10.- Añadir punto de montaje en el archivo /etc/fstab para que cargue automáticamente durante el arranque del sistema. Esto se hace añadiendo la siguiente línea en el archivo antes mencionado:

/dev/VGDATAGFS/LVGFS0  /srv/storages/glusterfs/gfs0 xfs      rw,noatime,nodiratime,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota      0     0

11.- Montar el volumen

# mount /srv/storages/glusterfs/gfs0

o Reiniciar el servidor.

Configuración del Clúster GlusterFS

Ahora toca el turno a la configuración del clúster. Para ello se deben completar los siguientes pasos:

  • Instalar el paquete del GlusterFS

 

En este punto cabe destacar que los paquetes del GlusterFS que viene en el repo principal de Debian 7 son de la versión 3.2. Y los que está en el repo PVE-Test de Proxmox VE son de la versión 3.5 o superior. A la hora de configurar el almacenamiento cliente en el segundo a través de la GUI da un error de montaje del volumen GlusterFS. Según el log del sistema, aparecía en las líneas del error esta parte:

Invalid argument

Después de un buen rato rompiéndome la cabeza, se me ocurrió instalar los paquetes que vienen en el repo PVE-Test de Proxmox en Debian 7 (como no contaba con la rama backports de Debian 7 en ese momento tuve que improvisar), de todas maneras este es el sistema operativo base del mismo.

Para ello añadí la línea que está dentro del archivo /etc/apt/sources.list.d/pve-enterprise en uno de los Proxmoxes al archivo /etc/apt/sources.list de los equipos con Debian 7 que fungen como Servidores de Volúmenes GlusterFS:

deb file:///media/flash/proxmox-repo/pve-test-repository wheezy pvetest

Y luego actualicé la lista de paquetes mediante el comando “aptitude update”.

OJO: Bajo ninguna circunstancia ejecutar el comando “aptitude upgrade”, dado que puede provocar que se instalen paquetes innecesarios. Este cambio se hace solamente para instalar o actualizar los paquetes del GlusterFS.

# aptitude install glusterfs-server

Esto instalará primeramente las dependencias de los paquetes del GlusterFS de la versión 3.5 y luego actualizará los existentes, los cuales inicialmente tienen la versión 3.2. Así ya no habrán conflictos en las versiones entre el servidor y el cliente GlusterFS, dado que serán de la misma versión: la 3.5.

  • Iniciar el clúster GlusterFS ejecutando en el nodo gfs-1.red.codesa.co.cu el comando:

# gluster peer probe 10.0.1.2

  • Chequear el status del clúster ejecutando el comando:

# gluster peer status

Como se ve en la siguiente imagen:

GlusterFS Cluster - Peer Status

  • Crear el volumen GlusterFS (Datastore) ejecutando en el nodo gfs-1.red.codesa.co.cu el comando:

# gluster volume create gfs0 replica 2 transport tcp 10.0.1.1:/srv/storages/glusterfs/gfs0 10.0.1.2:/srv/storages/glusterfs/gfs0

Como se ve en la siguiente imagen:

GlusterFS Cluster - Create Datastore GFS0

  • Iniciar el volúmen ejecutando en el nodo gfs-1.red.codesa.co.cu el comando:

# gluster volume start gfs0

Como se ve en la siguiente imagen:

GlusterFS Cluster - Start Datastore GFS0

  • Para saber si el demonio del GlusterFS está ejecutándose, ejecutar el siguiente comando:

# ps aux | grep gluster

# netstat -tap | grep glusterfsd

 Como se ve en la imagen siguiente:

GlusterFS Cluster - Check if GlusterFS Daemon is running

  • Finalmente, para chequear si el volumen está disponible, ejecutar el siguiente comando en los dos servidores:

# gluster volume info

Si el resultado es satisfactorio, como se ve en las imágenes siguientes, se dispone de un volumen GlusterFS, el cual mantiene una replicación entre los dos nodos del clúster y está listo para ser usado:

GlusterFS Cluster - Check if GlusterFS Volume is available - Server 1 GlusterFS Cluster - Check if GlusterFS Volume is available - Server 2

Integración del volumen GlusterFS recién creado al Clúster Proxmox VE

Una vez creado y listo el volumen GlusterFS, lo que queda es usarlo, ¿dónde?, pues, en otro clúster previamente creado: el de dos nodos con Proxmox VE 3.3; el cual utilizará dicho volumen como almacenamiento compartido para guardar las imágenes de discos duros de las máquinas virtuales (KVM) o contenedores (OpenVZ), aunque también se pueden almacenar otro elementos como plantillas pre-creadas de contenedores OpenVZ, imágenes de CD/DVD de instalación de otros sistemas operativos, respaldos de máquinas virtuales, etc.

NOTA: En este punto cabe destacar que el trabajo con los discos duros de los contenedores es mucho más tedioso, debido a que se usa mucho la activación y desactivación de las cuotas de disco (y una plantilla trae una gran cantidad de archivos y subdirectorios). En mi caso, tuve que esperar varios minutos para completar la creación de un contenedor o la migración en vivo de un nodo a otro; y en cuanto a la migración en vivo, en el caso de OpenVZ, se apaga primeramente el contenedor para luego migrarlo, y una vez migrado restablecer la cuota de disco.

Bueno, entrando ya en materia, lo primero que hay que hacer es añadir un nuevo almacenamiento compartido en el clúster Proxmox de la siguiente manera:

Gestor de Proxmox —> Datacenter —> Storage —> Add —> GlusterFS

Datacenter - Storage - Add - GlusterFS

Donde sale una nueva ventana…

Datacenter - Storage - Add - GlusterFS - Parameters - ID_Server1_Server2

A la cual se le deben especificar valores a los siguientes parámetros:

ID: <ID del bloque>

Server: < Nombre FQDN o dirección IP de uno de los nodos réplica del clúster GlusterFS>

Second Server: < Nombre FQDN o dirección IP de otro de los nodos réplica del clúster GlusterFS, que servirá como respaldo por si se cae el principal>

Volume nane: <Nombre del volumen GlusterFS que exporta el clúster del mismo tipo>

Datacenter - Storage - Add - GlusterFS - Parameters - Volume_Name_Dropdown_List

Content: <Contenido que albergará el nuevo almacenamiento compartido>

Datacenter - Storage - Add - GlusterFS - Parameters - Volume-Name_Content

Nodes: <Se deja tal y como está>

Enable: Sí (Activado)

Max Backups: 1

Una vez establecidos los valores a los parámetros, sólo queda añadir el nuevo almacenamiento. O sea, presionar el botón “Add” en la ventana:

Datacenter - Storage - Add - GlusterFS - Add Button Press

Así se mostrará en los dos nodos del clúster:

Datacenter - Storage - Add - GlusterFS Storage created

Pinchando con el mouse el ícono del nuevo almacenamiento compartido creado en el árbol de los elementos (a la izquierda en la GUI de Proxmox) podemos ver su estado:

Datacenter - Storage - Add - GlusterFS Storage status

Aquí se puede ver que su espacio libre total es de aproximadamente 160 GB y se ha usado 32 MB para el funcionamiento de GlusterFS.

Una  vez  completados  estos  pasos,  ya  se  pueden  crear  nuevas  máquinas  virtuales  en  el nuevo almacenamiento compartido siguiendo el mismo procedimiento descrito en el epígrafe “Máquinas virtuales sobre el almacenamiento compartido” de la página 30 (o sea, la selección del almacenamiento donde se guardará el disco duro de la máquina virtual, la acotación en este punto se refiere a que utilizo un almacenamiento compartido que basado en una partición LVM sobre iSCSI), pero en este caso, la apariencia cambia un poquito en la pestaña “Hard Disk”:

Proxmox VE - Create VM over GlusterFS Storage

Terminada la creación de una máquina virtual KVM sobre un almacenamiento compartido basado en GlusterFS, su hardware virtual es como se muestra en la siguiente figura:

Proxmox VE - VM Created over GFS0 GlusterFS Storage

NOTA: La gran ventaja de usar GlusterFS como almacenamiento compartido radica en que permite guardar todos los elementos que soporta Proxmox: imágenes de discos de máquinas virtuales KVM, imágenes de CD/DVD de instalación de sistemas operativos, plantillas de contenedores OpenVZ, archivos de respaldo de máquinas virtuales (VZDumps) y estructuras completas de contenedores OpenVZ. Los otros tipos de almacenamiento compartido vistos hasta el momento solamente soportan imágenes de discos duros KVM si se usan directamente, aunque se si se montan en directorios locales como caminos de montaje, se le pueden hacer truquitos ara que permitan guardar cualquier cosa, ya que para Proxmox es un directorio local.

Creación de contenedores OpenVZ en el almacenamiento compartido GlusterFS

La creación de contenedores OpenVZ es similar a la de máquinas virtuales KVM. Tiene pequeñas diferencias.

Opciones generales…

Proxmox VE - Create CT over GlusterFS Storage - 1 - General Data

Selección de la plantilla pre-creada base de donde el contenedor se creará…

Proxmox VE - Create CT over GlusterFS Storage - 2 - Select template

El futuro contenedor tendrá un sistema operativo GNU/Linux Debian 6.0 (Squeeze)…

Proxmox VE - Create CT over GlusterFS Storage - 3 - Debian 6 x86 Template selected

Recursos o requerimientos que tendrá el contenedor

Proxmox VE - Create CT over GlusterFS Storage - 4 - Set Resources

Tipo de tarjeta de red virtual a utilizar…

Proxmox VE - Create CT over GlusterFS Storage - 5 - Network settings

Parámetros a utilizar para el cliente DNS del contenedor…

Proxmox VE - Create CT over GlusterFS Storage - 6 - DNS settings

Chequear y confirmar los datos proporcionados para crear el contenedor definitivamente…

Proxmox VE - Create CT over GlusterFS Storage - 7 - Confirm CT creation

Luego se ve como el nuevo contenedor se va creando. Aquí hay que tener muuuuucha paciencia si el hipervisor no está muy dotado en recursos, dado que este proceso tarda (son muchísimos archivos pequeños)…

Proxmox VE - Create CT over GlusterFS Storage - 8 - Creating CT process

Hasta que termina finalmente…

Proxmox VE - Create CT over GlusterFS Storage - 9 - CT creation complete successfully

Una vez creado el contenedor, se puede ver en el gestor de Proxmox:

Proxmox VE - VMs & CTs on GlusterFS Storage

Los datos directamente en el volumen GlusterFS se ven de la siguiente manera:

Servidor GFS-1.RED.CODESA.CO.CU:

Máquina virtual KVM

GlusterFS Cluster - VM Disk created on GlusterFS Datastore - Server 1

Contenedor OpenVZ

GlusterFS Cluster - CT Disk created on GlusterFS Datastore - Server 1

Servidor GFS-2.RED.CODESA.CO.CU:

Máquina virtual KVM

GlusterFS Cluster - VM Disk created on GlusterFS Datastore - Server 2

Contenedor OpenVZ

Se puede ver, además, las conexiones establecidas entre los nodos del clúster con Proxmox y los nodos del clúster con GlusterFS:

Servidor GFS-1.RED.CODESA.CO.CU:

GlusterFS Cluster - Server 1 connections

Servidor GFS-2.RED.CODESA.CO.CU:

GlusterFS Cluster - Server 2 connections

Migración de las máquinas virtuales y/o contenedores entre los nodos del clúster Proxmox

Antes de dejar el clúster Proxmox correctamente configurado, es altamente recomendable probar la migración de las máquinas virtuales y/o contenedores entre los nodos que conforman el mismo.

El proceso de migración de una máquina virtual KVM es el mismo de siempre. Por ejemplo, migrar una máquina del primer nodo al segundo:

Proxmox VE - Migrating VM Created over GFS0 GlusterFS Storage to Server 2 - 1   Proxmox VE - Migrating VM Created over GFS0 GlusterFS Storage to Server 2 - 2

Y todo funciona perfecto al final del proceso:

Proxmox VE - VM Migrated over GFS0 GlusterFS Storage to Server 2

Pero migrar un contenedor es otra historia bien distinta, se tarda baaaaaaaaaastante. Poe ejemplo, migración del primer nodo al segundo:

Proxmox VE - CT Migrating to second node

Se ve bien, ¿eh? Esperando…

Proxmox VE - CT Migrated to second node

Como se ve en la segunda imagen, se tardó 7 minutos en inicializar la cuota remota del disco duro en el segundo nodo.

Ahora bien, en la siguiente imagen las dos máquinas virtuales migraron al segundo nodo:

Proxmox VE - VMs & CTs on second node before migration

Ajustes posteriores al archivo de configuración del clúster Proxmox

Ahora toca el turno a la configuración avanzada del clúster Proxmox. Hasta el momento solamente se ha hecho una configuración básica del mismo, pero no es suficiente.

A continuación se muestra el contenido final del archivo de configuración ubicado en /etc/pve/cluster.conf:

<?xml version=”1.0″?>

<cluster config_version=”50″ name=”codesa-pveclr”>

<fence_daemon clean_start=”0″ post_fail_delay=”60″ post_join_delay=”30″/>

<cman expected_votes=”1″ keyfile=”/var/lib/pve-cluster/corosync.authkey”

two_node=”1″/>

<fencedevices>

<fencedevice agent=”fence_customized” name=”fence_customized”/>

</fencedevices>

<clusternodes>

<clusternode name=”prx-c0-1″ nodeid=”1″ votes=”1″>

<fence>

<method name=”1″>

<device name=”fence_customized” nodename=”prx-c0-1″/>

</method>

</fence>

</clusternode>

<clusternode name=”prx-c0-2″ nodeid=”2″ votes=”1″>

<fence>

<method name=”1″>

<device name=”fence_customized” nodename=”prx-c0-2″/>

</method>

</fence>

</clusternode>

</clusternodes>

<rm>

<failoverdomains>

<failoverdomain name=”failover_codesa-pveclr” nofailback=”1″ ordered=”1″>

<failoverdomainnode name=”prx-c0-1″ priority=”1″/>

<failoverdomainnode name=”prx-c0-2″ priority=”1″/>

</failoverdomain>

</failoverdomains>

<pvevm autostart=”1″ vmid=”100″/>

</rm>

</cluster>

Llegar a ella no fue tarea fácil, porque se tuvo que probar poco  a poco las partes del archivo. Cuando se añadió la parte de los métodos de fencing en los nodos, el Proxmox (o el Corosync) daba el siguiente error:

Proxmox VE - Cluster configuration validation failed - Modifying configration

¿La solución? Bueno… Después de varios días tratando de activar la configuración del HA en el clúster Proxmox, finalmente lo logré de la manera menos esperada: simplemente se sustituyó el archivo /etc/pve/cluster.conf original por uno funcional (claro, con sus correspondientes cambios) y luego reinicié los dos nodos. Claro está que soltó el error siguiente:

Fri Oct 10 00:48:19 2014:    Starting cman… tempfile:12: element device: Relax-NG validity error : Invalid attribute nodename for element device

Fri Oct 10 00:48:29 2014: Relax-NG validity error : Extra element fence in interleave

Fri Oct 10 00:48:29 2014: tempfile:8: element clusternodes: Relax-NG validity error : Element clusternode failed to validate content

Fri Oct 10 00:48:29 2014: tempfile:9: element clusternode: Relax-NG validity error : Element clusternodes has extra content: clusternode

Fri Oct 10 00:48:29 2014: Configuration fails to validate

Fri Oct 10 00:48:29 2014: [  OK  ]

No obstante, estoy conciente de que fue una solución burda y a la fuerza, lo cual hace que analice más adelante el por qué de este problema.

Claro, entre otras líneas del log del arranque del sistema operativo, o sea, en el archivo /var/log/boot, como se ve en la siguiente imagen:

Proxmox VE - Cluster configuration validation failed - Booting System

Pues, lo ignoré y seguí adelante. Vi que no dio errores de parsing del archivo de configuración del clúster, pero aún persistiendo el error anterior. No obstante, se  siguió con las pruebas más agresivas como, por ejemplo, apagar normal o súbitamente uno de los nodos o los dos nodos del clúster. El log nos informa del proceso:

Oct 11 08:43:08 prx-c0-2 corosync[2335]:   [TOTEM ] A processor failed, forming new configuration.

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] CLM CONFIGURATION CHANGE

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] New Configuration:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] #011r(0) ip(192.168.137.11)

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] Members Left:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] #011r(0) ip(192.168.137.10)

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] Members Joined:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [QUORUM] Members[1]: 2

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] CLM CONFIGURATION CHANGE

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] New Configuration:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] #011r(0) ip(192.168.137.11)

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] Members Left:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CLM   ] Members Joined:

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [TOTEM ] A processor joined or left the membership and a new membership was formed.

Oct 11 08:43:10 prx-c0-2 kernel: dlm: closing connection to node 1

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [CPG   ] chosen downlist: sender r(0) ip(192.168.137.11) ; members(old:2 left:1)

Oct 11 08:43:10 prx-c0-2 pmxcfs[2179]: [dcdb] notice: members: 2/2179

Oct 11 08:43:10 prx-c0-2 pmxcfs[2179]: [dcdb] notice: members: 2/2179

Oct 11 08:43:10 prx-c0-2 corosync[2335]:   [MAIN  ] Completed service synchronization, ready to provide service.

Oct 11 08:43:10 prx-c0-2 rgmanager[2729]: State change: prx-c0-1 DOWN

Oct 11 08:43:12 prx-c0-2 ntpd_intres[3605]: host name not found: 1.debian.pool.ntp.org

Oct 11 08:43:22 prx-c0-2 ntpd_intres[3605]: host name not found: 2.debian.pool.ntp.org

Oct 11 08:43:32 prx-c0-2 ntpd_intres[3605]: host name not found: 3.debian.pool.ntp.org

Oct 11 08:44:10 prx-c0-2 fenced[2392]: fencing node prx-c0-1

Oct 11 08:44:10 prx-c0-2 fenced[2392]: fence prx-c0-1 success

Oct 11 08:44:11 prx-c0-2 rgmanager[2729]: Starting stopped service pvevm:100

Oct 11 08:44:12 prx-c0-2 rgmanager[3910]: [pvevm] Move config for VM 100 to local node

Oct 11 08:44:12 prx-c0-2 pvevm: <root@pam> starting task UPID:prx-c0-2:00000F5A:000088F8:5439261C:qmstart:100:root@pam:

Oct 11 08:44:12 prx-c0-2 task UPID:prx-c0-2:00000F5A:000088F8:5439261C:qmstart:100:root@pam:: start VM 100: UPID:prx-c0-2:00000F5A:000088F8:5439261C:qmstart:100:root@pam:

Oct 11 08:44:13 prx-c0-2 rgmanager[3933]: [pvevm] Task still active, waiting

Oct 11 08:44:14 prx-c0-2 rgmanager[3953]: [pvevm] Task still active, waiting

Oct 11 08:44:15 prx-c0-2 rgmanager[3980]: [pvevm] Task still active, waiting

Oct 11 08:44:17 prx-c0-2 rgmanager[4000]: [pvevm] Task still active, waiting

Oct 11 08:44:18 prx-c0-2 rgmanager[4020]: [pvevm] Task still active, waiting

Oct 11 08:44:19 prx-c0-2 rgmanager[4042]: [pvevm] Task still active, waiting

Oct 11 08:44:20 prx-c0-2 rgmanager[4062]: [pvevm] Task still active, waiting

Oct 11 08:44:21 prx-c0-2 rgmanager[4082]: [pvevm] Task still active, waiting

Oct 11 08:44:22 prx-c0-2 rgmanager[4102]: [pvevm] Task still active, waiting

Oct 11 08:44:23 prx-c0-2 rgmanager[4122]: [pvevm] Task still active, waiting

Oct 11 08:44:24 prx-c0-2 rgmanager[4154]: [pvevm] Task still active, waiting

Oct 11 08:44:24 prx-c0-2 kernel: device tap100i0 entered promiscuous mode

Oct 11 08:44:24 prx-c0-2 kernel: vmbr0: port 2(tap100i0) entering forwarding state

Oct 11 08:44:25 prx-c0-2 rgmanager[4191]: [pvevm] Task still active, waiting

Oct 11 08:44:26 prx-c0-2 pvevm: <root@pam> end task UPID:prx-c0-2:00000F5A:000088F8:5439261C:qmstart:100:root@pam: OK

Oct 11 08:44:27 prx-c0-2 rgmanager[4214]: [pvevm] Task still active, waiting

Oct 11 08:44:28 prx-c0-2 rgmanager[2729]: Service pvevm:100 started

Oct 11 08:44:28 prx-c0-2 ntpd[2092]: Listen normally on 10 tap100i0 fe80::dcbb:3dff:fe27:8139 UDP 123

Oct 11 08:44:28 prx-c0-2 ntpd[2092]: peers refreshed

Oct 11 08:44:32 prx-c0-2 pvedaemon[2660]: <root@pam> starting task UPID:prx-c0-2:0000108E:000090E1:54392630:vncproxy:100:root@pam:

Oct 11 08:44:32 prx-c0-2 pvedaemon[4238]: starting vnc proxy UPID:prx-c0-2:0000108E:000090E1:54392630:vncproxy:100:root@pam:

Oct 11 08:44:35 prx-c0-2 kernel: tap100i0: no IPv6 routers present

Oct 11 08:44:40 prx-c0-2 ntpd_intres[3605]: host name not found: 0.debian.pool.ntp.org

Oct 11 08:44:50 prx-c0-2 ntpd_intres[3605]: host name not found: 1.debian.pool.ntp.org

Oct 11 08:45:00 prx-c0-2 ntpd_intres[3605]: host name not found: 2.debian.pool.ntp.org

Oct 11 08:45:06 prx-c0-2 rgmanager[4287]: [pvevm] VM 100 is running

Oct 11 08:45:09 prx-c0-2 pvedaemon[2660]: <root@pam> end task UPID:prx-c0-2:0000108E:000090E1:54392630:vncproxy:100:root@pam: OK

Oct 11 08:45:10 prx-c0-2 ntpd_intres[3605]: host name not found: 3.debian.pool.ntp.org

Oct 11 08:45:36 prx-c0-2 rgmanager[4338]: [pvevm] VM 100 is running

Oct 11 08:45:46 prx-c0-2 rgmanager[4376]: [pvevm] VM 100 is running

Oct 11 08:46:26 prx-c0-2 rgmanager[4438]: [pvevm] VM 100 is running

Oct 11 08:46:47 prx-c0-2 rgmanager[4486]: [pvevm] VM 100 is running

Oct 11 08:47:06 prx-c0-2 rgmanager[4527]: [pvevm] VM 100 is running

Oct 11 08:47:46 prx-c0-2 rgmanager[4595]: [pvevm] VM 100 is running

Oct 11 08:47:56 prx-c0-2 rgmanager[4626]: [pvevm] VM 100 is running

Oct 11 08:48:26 prx-c0-2 rgmanager[4677]: [pvevm] VM 100 is running

Oct 11 08:49:06 prx-c0-2 rgmanager[4745]: [pvevm] VM 100 is running

Oct 11 08:49:16 prx-c0-2 rgmanager[4776]: [pvevm] VM 100 is running

Oct 11 08:49:56 prx-c0-2 rgmanager[4844]: [pvevm] VM 100 is running

Oct 11 08:50:16 prx-c0-2 rgmanager[4885]: [pvevm] VM 100 is running

Oct 11 08:50:36 prx-c0-2 rgmanager[4926]: [pvevm] VM 100 is running

Y la máquina virtual 100 está en el segundo nodo finalmente (el contenedor se borró porque se tarde mucho [:)] ):

Proxmox VE - VM running after Server 1 powered off

Y el clúster está preparado para ser usado sin problemas.

Acerca del error de parsing del archivo de configuración cuando se añaden los métodos del fencing en la configuración del nodo

Bueno, volviendo al problema anterior, teníamos este error:

Fri Oct 10 00:48:19 2014:    Starting cman… tempfile:12: element device: Relax-NG validity error : Invalid attribute nodename for element device

Fri Oct 10 00:48:29 2014: Relax-NG validity error : Extra element fence in interleave

Fri Oct 10 00:48:29 2014: tempfile:8: element clusternodes: Relax-NG validity error : Element clusternode failed to validate content

Fri Oct 10 00:48:29 2014: tempfile:9: element clusternode: Relax-NG validity error : Element clusternodes has extra content: clusternode

Fri Oct 10 00:48:29 2014: Configuration fails to validate

Fri Oct 10 00:48:29 2014: [  OK  ]

Googleando un poco y viendo el post “HA Issues”, ubicado en la URL http://forum.proxmox.com/threads/8720-HA-Issues y donde al usuario se le presentó el mismo problema, vi que el Proxmox ejecuta a bajo nivel el comando siguiente:

ccs_config_validate -l /etc/pve/cluster.conf

Esto provoca el error descrito anteriomente, pero no da resultados que puedan hacerse uno una idea de lo que realmente pasa, o sea, de por qué da un error de parseo del archivo de configuración del clúster.

A modo de prueba, se ejecutó este mismo comando, añadiéndole también la opción -v para poder obtener un registro de eventos mucho más verboso (o sea, más detallado), en uno de los nodos de un clúster de Proxmox virgen (o sea, un clúster recién creado). El resultado fue el siguiente:

root@prx-c0-1:~# ccs_config_validate -v -l /etc/pve/cluster.conf

Creating temporary file: /tmp/tmp.K3ZcF0ApOn

Config interface set to: xmlconfig:cmanpreconfig

Configuration stored in temporary file

Updating relaxng schema

Validating..

Configuration validates

Validation completed

Como se ve, la validación terminó sin problemas.

Se ejecutó en uno de los nodos otra vez y dio el mismo error con las mismas líneas. Entonces seguí buscando en Inet algo que arrojara alguna luz para la solución del problema.

Leyendo e interpretando con más calma este error, me llamaron la atención las líneas siguientes:

Fri Oct 10 00:48:29 2014: Relax-NG validity error : Extra element fence in interleave

(…)

Fri Oct 10 00:48:29 2014: tempfile:9: element clusternode: Relax-NG validity error : Element clusternodes has extra content: clusternode

(…)

La validación del archivo de configuración está notificando que hay elementos de más en la declaración. Ahí fue que me percaté que en muchos ejemplos de fencing hacen referencia solamente al nombre del dispositivo de fencing en el método fence dentro del clusternode. Todo parece indicar que ha cambiado algo en la nueva versión de Proxmox, la 3.3, dado que en la 3.2 no me daba ningún tipo de error.

Entonces lo que hice fue modificar nuevamente el archivo de configuración del clúster y dejarlo de la siguiente manera:

<?xml version=”1.0″?>

<cluster config_version=”52″ name=”codesa-pveclr”>

<fence_daemon clean_start=”0″ post_fail_delay=”60″ post_join_delay=”30″/>

<cman expected_votes=”1″ keyfile=”/var/lib/pve-cluster/corosync.authkey”

two_node=”1″/>

<fencedevices>

<fencedevice agent=”fence_customized” name=”fence_customized”/>

</fencedevices>

<clusternodes>

<clusternode name=”prx-c0-1″ nodeid=”1″ votes=”1″>

<fence>

<method name=”1″>

<device name=”fence_customized”/>

</method>

</fence>

</clusternode>

<clusternode name=”prx-c0-2″ nodeid=”2″ votes=”1″>

<fence>

<method name=”1″>

<device name=”fence_customized”/>

</method>

</fence>

</clusternode>

</clusternodes>

<rm>

<failoverdomains>

<failoverdomain name=”failover_codesa-pveclr” nofailback=”1″ ordered=”1″>

<failoverdomainnode name=”prx-c0-1″ priority=”1″/>

<failoverdomainnode name=”prx-c0-2″ priority=”1″/>

</failoverdomain>

</failoverdomains>

<pvevm autostart=”1″ vmid=”100″/>

</rm>

</cluster>

Reinicié los dos nodos del clúster y probé agresivamente el funcionamiento del fencing (apagué el nodo que tenía las máquinas virtuales). ¡¡¡Sorpresa!!! ¡¡¡Vivaaaaaa!!! Todo funcionó sin problemas. 🙂 Era que tenía que eliminar el elemento extra que no hacía falta: el parámetro nodename en la declaración del método de fencing para el nodo en cuestión. 🙂

Bueno, este es el contenido del Anexo 4 de mi manual. Espero les sirva.

😀

Información adicional

Cuando hice esta parte del manual, meses antes había salido en Amazon el libro “Proxmox High Availability (2014)”. En ese momento no pude obtenerlo ni por los torrents. Muuuuuuuchos meses después me enteré por un amigo de una URL donde estaba ya el PDF. Lo descargué y vi que mi manual casi se acerca al capítulo del libro donde hablan de la integración de GlusterFS y Proxmox. No obstante, como documentación en español considero que puede serle útil a muchos administradores que utilizan Proxmox como platafroma de virtualización.

También quiero añadir que en esta URL (para los que tienen acceso a Internet) Ivan Ilves -conocido en este mundo de Proxmox y Vyatta/VyOS con el nick Cartman- creó un soberbio manual donde explica este proceso, pero utilizando a los mismos nodos Proxmox como servidores GlusterFS. Verán que tanto el contenido del post como los comentarios están muy interesantes.

Y ya, ahora sí. Fin.

😀

 

Acerca de Hector Suarez Planas

Es Licenciado en Ciencia de la Computación (3 de julio de 2002). Ha sido Administrador de Red en varias organizaciones, Programador y Analista de Sistemas. Actualmente se desempeña como Administrador de Red del Telecentro Tele Turquino de Santiago de Cuba. Tiene experiencia con sistemas Windows y GNU/Linux, Infraestructura de Redes (Cisco, AlliedTelesis, Netgear y HP ProCurve, Vyatta/VyOS), Servidores tanto físicos como virtuales (plataformas VMWare, Proxmox VE y Xen), Sistemas de Seguridad Informática (Snort/Suricata IDS, appliances AlienVault OSSIM), programador (Delphi, C++ Builder, Perl [poco], Python [algo]), entre otras cosas. Actualmente estoy incursionando en todo lo que tiene relación con Cloud Computing (OpenStack) y Centros de Datos. :-)
Esta entrada fue publicada en Almacenamiento, Debian, GlusterFS, Proxmox VE. Guarda el enlace permanente.

4 respuestas a Almacenamiento compartido con GlusterFS en Proxmox VE

  1. Rickygm dijo:

    Hola excelente artículo, tu libro de próxmox es descargable?

    • Hector Suarez Planas dijo:

      Saludos, Rickygm.

      Gracias. El libro aún no lo tengo en un formato descargable. Son cosas que hice y las fuí anotando para tener una fuente documental. Todo comenzó hace casi un año cuando quise hacer un clúster Proxmox usando DRBD como almacenamiento compartido. De ahí le fuí añadiendo cosas como iSCSI, GlusterFS y Ceph (que tengo las imágenes, pero aún no le he añadido el texto). Algo sencillo, claro está. 🙂 Cuando ya lo tenga a punto, entonces lo publicaré en un PDF.

  2. yoslan dijo:

    y cuando estara disponible el libro suenan interesante tus investigaciones e ve que llevas mucho tiempo desde que existia linux.cu gracias por compartir tu conocimiento sysadmin

  3. rickygm dijo:

    animo a seguir escribiendo , yo actualmente tengo un cluster con vmware y estoy motando otro con proxmox y una SAN , espero tenerlo listo en a inicios del 2016 , estoy masticando mucha docu.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *