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


Alta disponibilidad ( HA ) simplemente se refiere a la calidad de un sistema para funcionar continuamente sin fallas durante un largo período de tiempo. Las soluciones de HA pueden implementarse 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 (conocidas comúnmente como nodos o miembros ) que trabajan juntas para realizar una tarea. En tal configuración, solo un nodo proporciona el servicio con el nodo (s) secundario (es) que se hace cargo si falla.

Los clusters se dividen en cuatro tipos principales:

  • Storage: provide a consistent file system image across servers in a cluster, allowing the servers to simultaneously read and write to a single shared file system.
  • High Availability: eliminate single points of failure and by failing over services from one cluster node to another in case a node goes becomes inoperative.
  • Load Balancing: dispatch network service requests to multiple cluster nodes to balance the request load among the cluster nodes.
  • High Performance: carry out parallel or concurrent processing, thus helping to improve performance of applications.

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

Para configurar un clúster, necesitamos al menos dos servidores. Para los fines de esta guía, utilizaremos dos servidores Linux:

  • Node1: 192.168.10.10
  • Node2: 192.168.10.11

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

Configurando las configuraciones DNS locales en cada servidor

Para que los dos servidores se comuniquen entre sí, necesitamos configurar la configuración de DNS local apropiada 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 correctamente con el comando systemctl.

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

Después de iniciar el servicio Nginx, debemos crear páginas web personalizadas para identificar y probar las operaciones en ambos servidores. Modificaremos el contenido de la página de índice predeterminada de Nginx 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 marcapasos

A continuación, debemos 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 que se complete la instalación, asegúrese de que el daemon 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 "hacinamiento" . Por lo tanto, debemos configurar la autenticación necesaria para pcs . Comencemos por crear 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 pcs .

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

Ahora cree un clúster y llénelo con algunos nodos (el nombre del clúster no puede superar los 15 caracteres, en este ejemplo, hemos utilizado examplecluster ) en el servidor Nodo1.

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

Ahora habilite el cluster 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á activo y en ejecución usando el siguiente comando.

$ sudo pcs status
OR
$ sudo crm_mon -1

Desde la salida del comando anterior, puede ver que hay una advertencia de que no hay dispositivos STONITH , pero que STONITH aún está habilitado en el clúster. Además, no se han configurado recursos/servicios de clúster.

La primera opción es desactivar STONITH (o Disparar el otro nodo en la cabeza ), la implementación de cercado en Marcapasos .

Este componente ayuda a proteger sus datos para que no sean dañados por el acceso simultáneo. Para los fines de esta guía, la deshabilitaremos ya que no hemos configurado ningún dispositivo.

Para desactivar STONITH , ejecute el siguiente comando:

$ sudo pcs property set stonith-enabled=false

A continuación, también ignore la política 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 quórum policy estén desactivadas.

$ 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, utilizado 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 direcciones IP flotantes no son solo para situaciones de conmutación por error, tienen otros pocos casos de uso. Necesitamos configurar el clúster de tal manera que solo el miembro activo del clúster "sea propietario" o responda a la IP flotante en un momento dado.

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

Primero comience agregando el flotante_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: is the name of the service.
  • “ocf:heartbeat:IPaddr2”: tells Pacemaker which script to use, IPaddr2 in this case, which namespace it is in (pacemaker) and what standard it conforms to ocf.
  • op monitor interval=60s”: instructs Pacemaker to check the health of this service every one minutes by calling the agent’s monitor action.

Luego agrega 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, ejecute el siguiente comando para verificar el estado de los recursos.

$ sudo pcs status resources

En cuanto a la salida del comando, se han enumerado los dos recursos agregados: "floating_ip" y "http_server" . El servicio floating_ip está desactivado porque el nodo primario está en funcionamiento.

Si tiene un 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 en node2.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 valor predeterminado), dentro del intervalo de monitoreo de 2 minutos, debería poder ver el aviso del grupo de que http_server falló y se movió a otro nodo.

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

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

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