Cómo configurar y mantener alta disponibilidad/agrupación en clústeres en Linux


Alta disponibilidad (HA) simplemente se refiere a la calidad de un sistema para operar continuamente sin fallas durante un largo período de tiempo. Las soluciones HA se pueden implementar utilizando hardware y/o software, y una de las soluciones comunes para implementar HA es la agrupación en clústeres.

En informática, un clúster está formado por dos o más computadoras (comúnmente conocidas como nodos o miembros) que trabajan juntas para realizar una tarea. En una configuración de este tipo, solo un nodo proporciona el servicio y los nodos secundarios se hacen cargo si falla.

Los clústeres se dividen en cuatro tipos principales:

  • Almacenamiento: proporciona una imagen del sistema de archivos coherente en todos los servidores de un clúster, lo que permite que los servidores lean y escriban simultáneamente en un único sistema de archivos compartido.
  • Alta disponibilidad: elimine los puntos únicos de falla y mediante la conmutación por error de los servicios de un nodo de clúster a otro en caso de que un nodo deje de funcionar.
  • Equilibrio de carga: envíe solicitudes de servicio de red a varios nodos del clúster para equilibrar la carga de solicitudes entre los nodos del clúster.
  • Alto rendimiento: realiza procesamiento paralelo o concurrente, lo que ayuda a mejorar el rendimiento de las aplicaciones.

Otra solución ampliamente utilizada para proporcionar HA es la replicación (específicamente replicaciones de datos). La replicación es el proceso mediante el cual una o más bases de datos (secundarias) se pueden mantener sincronizadas con una única base de datos primaria (o maestra).

Para configurar un clúster, necesitamos al menos dos servidores. Para el propósito de esta guía, usaremos dos servidores Linux:

  • Nodo1: 192.168.10.10
  • Nodo2: 192.168.10.11

En este artículo, demostraremos los conceptos básicos de cómo implementar, configurar y mantener alta disponibilidad/clústeres en Ubuntu 16.04/18.04 y CentOS 7. Demostraremos cómo agregar el servicio HTTP de Nginx al clúster.

Configurar los ajustes de DNS local en cada servidor

Para que los dos servidores se comuniquen entre sí, debemos configurar los ajustes de DNS locales apropiados en el archivo/etc/hosts en ambos servidores.

Abra y edite el archivo con su editor de línea de comandos favorito.

$ sudo vim /etc/hosts  

Agregue las siguientes entradas con las direcciones IP reales de sus servidores.

192.168.10.10	node1.example.com
192.168.10.11 	node2.example.com

Guarde los cambios y cierre el archivo.

Instalación del servidor web Nginx

Ahora instale el servidor web Nginx usando los siguientes comandos.

$ sudo apt install nginx  [On Ubuntu]
$ sudo yum install epel-release && sudo yum install nginx [On CentOS 7]

Una vez que se complete la instalación, inicie el servicio Nginx por ahora y habilítelo para que se inicie automáticamente en el momento del arranque, luego verifique si está funcionando con el comando systemctl.
En Ubuntu, el servicio debe iniciarse automáticamente inmediatamente después de que se complete la preconfiguración del paquete, simplemente puede habilitarlo.

$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ sudo systemctl status nginx

Después de iniciar el servicio Nginx, necesitamos crear páginas web personalizadas para identificar y probar operaciones en ambos servidores. Modificaremos el contenido de la página de índice Nginx predeterminada como se muestra.

$ echo "This is the default page for node1.example.com" | sudo tee /usr/share/nginx/html/index.html 	#VPS1
$ echo "This is the default page for node2.example.com" | sudo tee /usr/share/nginx/html/index.html 	#VPS2

Instalación y configuración de Corosync y Pacemaker

A continuación, tenemos que instalar Pacemaker, Corosync y Pcs en cada nodo de la siguiente manera.

$ sudo apt install corosync pacemaker pcs	#Ubuntu 
$ sudo yum install corosync pacemaker pcs	#CentOS 

Una vez completada la instalación, asegúrese de que el demonio pcs se esté ejecutando en ambos servidores.

$ sudo systemctl enable pcsd
$ sudo systemctl start pcsd
$ sudo systemctl status pcsd

Durante la instalación, se crea un usuario del sistema llamado "hacluster". Por lo tanto, debemos configurar la autenticación necesaria para las PC. Comencemos creando una nueva contraseña para el usuario "hacluster", necesitamos usar la misma contraseña en todos los servidores:

$ sudo passwd hacluster

A continuación, en uno de los servidores (Nodo1), ejecute el siguiente comando para configurar la autenticación necesaria para las PC.

$ sudo pcs cluster auth node1.example.com node2.example.com -u hacluster -p password_here --force

Ahora cree un clúster y rellénelo con algunos nodos (el nombre del clúster no puede exceder los 15 caracteres; en este ejemplo, hemos usado examplecluster) en el servidor Node1.

$ sudo pcs cluster setup --name examplecluster node1.example.com node2.example.com 

Ahora habilite el clúster en el arranque e inicie el servicio.

$ sudo pcs cluster enable --all
$ sudo pcs cluster start --all

Ahora verifique si el servicio de clúster está funcionando con el siguiente comando.

$ sudo pcs status
OR
$ sudo crm_mon -1

A partir del resultado del comando anterior, puede ver que hay una advertencia acerca de que no hay dispositivos STONITH, pero STONITH todavía está habilitado en el clúster. Además, no se han configurado recursos/servicios de clúster.

La primera opción es deshabilitar STONITH (o Disparar al otro nodo en la cabeza), la implementación de esgrima en Pacemaker.

Este componente ayuda a proteger sus datos para que no se corrompan por el acceso simultáneo. A los efectos de esta guía, la desactivaremos ya que no hemos configurado ningún dispositivo.

Para apagar STONITH, ejecute el siguiente comando:

$ sudo pcs property set stonith-enabled=false

A continuación, también ignore la política de quórum ejecutando el siguiente comando:

$ sudo pcs property set no-quorum-policy=ignore

Después de configurar las opciones anteriores, ejecute el siguiente comando para ver la lista de propiedades y asegúrese de que las opciones anteriores, stonith y la política de quórum estén deshabilitadas.

$ sudo pcs property list

En esta sección, veremos cómo agregar un recurso de clúster. Configuraremos una IP flotante que es la dirección IP que se puede mover instantáneamente de un servidor a otro dentro de la misma red o centro de datos. En resumen, una IP flotante es un término técnico común, que se utiliza para las IP que no están vinculadas estrictamente a una única interfaz.

En este caso, se utilizará para admitir la conmutación por error en un clúster de alta disponibilidad. Tenga en cuenta que las IP flotantes no son solo para situaciones de conmutación por error, tienen algunos otros casos de uso. Necesitamos configurar el clúster de tal manera que solo el miembro activo del clúster "posea" o responda a la IP flotante en un momento dado.

Agregaremos dos recursos de clúster: el recurso de dirección IP flotante llamado "floating_ip" y un recurso para el servidor web Nginx llamado "http_server".

Primero comience agregando el floating_ip de la siguiente manera. En este ejemplo, nuestra dirección IP flotante es 192.168.10.20.

$ sudo pcs resource create floating_ip ocf:heartbeat:IPaddr2 ip=192.168.10.20 cidr_netmask=24 op monitor interval=60s

dónde:

  • floating_ip: es el nombre del servicio.
  • “ocf: heartbeat: IPaddr2”: le dice a Pacemaker qué script usar, IPaddr2 en este caso, en qué espacio de nombres se encuentra (marcapasos) y qué estándar cumple con ocf.
  • "intervalo de monitorización de operaciones u003d 60 s": indica a Pacemaker que verifique el estado de este servicio cada minuto llamando a la acción del monitor del agente.

Luego agregue el segundo recurso, llamado http_server. Aquí, el agente de recursos del servicio es ocf: heartbeat: nginx.

$ sudo pcs resource create http_server ocf:heartbeat:nginx configfile="/etc/nginx/nginx.conf" op monitor timeout="20s" interval="60s"

Una vez que haya agregado los servicios de clúster, emita el siguiente comando para verificar el estado de los recursos.

$ sudo pcs status resources

En cuanto a la salida del comando, se enumeran los dos recursos agregados: “floating_ip” y “http_server”. El servicio floating_ip está desactivado porque el nodo principal está en funcionamiento.

Si tiene el firewall habilitado en su sistema, debe permitir todo el tráfico a Nginx y todos los servicios de alta disponibilidad a través del firewall para una comunicación adecuada entre los nodos:

-------------- CentOS 7 -------------- 
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=high-availability		
$ sudo firewall-cmd --reload

-------------- Ubuntu -------------- 
$ sudo ufw allow http	
$ sudo ufw allow high-availability						
$ sudo ufw reload 

El paso final e importante es probar que nuestra configuración de alta disponibilidad funciona. Abra un navegador web y navegue hasta la dirección 192.168.10.20. Debería ver la página Nginx predeterminada del nodo2.example.com como se muestra en la captura de pantalla.

Para simular una falla, ejecute el siguiente comando para detener el clúster en node2.example.com.

$ sudo pcs cluster stop http_server

Luego vuelva a cargar la página en 192.168.10.20, ahora debería acceder a la página web predeterminada de Nginx desde node1.example.com.

Alternativamente, puede simular un error indicando al servicio que se detenga directamente, sin detener el clúster en ningún nodo, utilizando el siguiente comando en uno de los nodos:

 
$ sudo crm_resource --resource http_server --force-stop 

Luego, debe ejecutar crm_mon en modo interactivo (el predeterminado), dentro del intervalo de monitoreo de 2 minutos, debería poder ver el aviso del clúster de que http_server falló y moverlo a otro nodo.

Para que sus servicios de clúster se ejecuten de manera eficiente, es posible que deba establecer algunas restricciones. Puede ver la página de manual de pcs (man pcs) para obtener una lista de todos los comandos de uso.

Para obtener más información sobre Corosync y Pacemaker, consulte: https://clusterlabs.org/

En esta guía, hemos mostrado los conceptos básicos de cómo implementar, configurar y mantener alta disponibilidad/agrupación en clústeres/replicación en Ubuntu 16.04/18.04 y CentOS 7. Demostramos cómo agregar el servicio HTTP de Nginx a un clúster. Si tiene alguna idea o pregunta que compartir, utilice el formulario de comentarios a continuación.