Cómo usar HAProxy como un balanceador de carga de capa 4 para servidores de aplicaciones

Introducción

En este tutorial, te enseñaremos cómo usar HAProxy como un balanceador de carga de capa 4 para tus servidores de WordPress, específicamente el nivel de aplicación web. El balanceo de carga de los servidores de aplicaciones agrega redundancia a tu configuración, lo que aumenta la confiabilidad en caso de fallas en el servidor o problemas de red, y distribuye la carga en varios servidores para aumentar el rendimiento de lectura.

Asumimos que tu configuración incluye un servidor de aplicaciones de WordPress que se conecta a un servidor de bases de datos MySQL separado (consulta los requisitos previos para ver un tutorial sobre cómo configurar eso).

El balanceo de carga de Capa 4 es adecuado para tu sitio si solo estás ejecutando una única aplicación de servidor web. Si tu entorno es más complejo (por ejemplo, si deseas ejecutar WordPress y un servidor web estático en servidores separados, con un solo punto de entrada), deberás analizar el balanceo de carga de la capa de aplicación (Capa 7).

Este tutorial está escrito con WordPress como ejemplo, pero los conceptos generales se pueden usar para balancear la carga de otras aplicaciones web.

Prerrequisitos

Antes de continuar con este tutorial, debes haber completado la configuración de un sitio de WordPress con un servidor de base de datos independiente (o tener una configuración similar).

Después de configurar WordPress en aplicaciones web y servidores de base de datos separados, debes tener dos VPS. Debido a que trataremos con varios VPS, para fines de referencia, llamaremos a tus dos VPS existentes de la siguiente manera:

  • wordpress-1: tu servidor de aplicaciones web de WordPress
  • mysql-1: tu servidor MySQL para WordPress

En una vista abstracta de tu entorno actualmente se ve algo como esto:

Además de tu entorno actual, necesitaremos dos VPS adicionales durante este tutorial. Los llamaremos:

  • wordpress-2: tu segundo servidor de aplicaciones web de WordPress
  • haproxy-www: tu servidor HAProxy, para balancear la carga

Si no estás familiarizado con los conceptos o la terminología básicos del balanceo de carga, como el balanceo de carga de la capa 4 o los backends o ACL, aquí hay un artículo que explica los conceptos básicos: Introducción a HAProxy y Conceptos de balanceo de carga.

Nuestro objetivo

Al final de este tutorial, queremos tener un entorno que se vea así:

Es decir, tus usuarios accederán a tu sitio de WordPress yendo a tu servidor HAProxy, que los reenviará a tus servidores de aplicaciones de WordPress con balanceo de carga de forma integral. Tus dos (o más, si lo deseas) tendrán acceso a tu base de datos MySQL.

Instantánea de tu entorno actual

Opcional: antes de continuar con este tutorial, desearás crear instantáneas de tu entorno actual. La instantánea tiene dos propósitos en este tutorial:

  1. Para volver a un entorno de trabajo si se cometes un error.
  2. Para hacer una réplica única del servidor original, eliminando la necesidad de instalar y configurar PHP y Nginx nuevamente.

Debes tomar una instantánea de tus VPS’s wordpress-1 y mysql-1 .

Ahora que tenemos instantáneas, estamos listos para continuar construyendo el resto de nuestro entorno.

Crear tu segundo servidor de aplicaciones web

Ahora necesitamos crear un segundo VPS que compartirá la carga con nuestro servidor de aplicaciones web original. Hay dos opciones para esto:

  1. Crear un nuevo VPS a partir de la instantánea que tomaste del VPS original, wordpress-1
  2. Crear un nuevo VPS desde cero y configurarlo manualmente con el mismo software y configuración que wordpress-1

Con cualquiera de los dos métodos, asegúrate de seleccionar la opción de red privada si está disponible. Se recomienda la red privada para todos los VPS utilizados en este tutorial.

Si no tienes una opción de red privada, sustituye las direcciones IP privadas con las direcciones IP públicas de tus VPS.

Ten en cuenta que el uso de direcciones IP públicas cuando está transmitiendo datos confidenciales, como contraseñas de base de datos no cifradas entre tu aplicación y los servidores de la base de datos, no es una buena práctica, ya que esa información viajará a través de Internet.

Opción 1: Crear un nuevo VPS con una instantánea

Crea un nuevo VPS llamado wordpress-2, usando la instantánea que tomaste de wordpress-1.

Si optaste por este método, omite la “Opción 2” en la sección “Sincronizar archivos de aplicación web”.

Opción 2: Crear nuevos VPS desde cero

Esta es una alternativa a la “Opción 1”.

Si deseas configurar el servidor de wordpress-2 desde cero, en lugar de utilizar una instantánea de wordpress-1, asegúrate de instalar el mismo software. Puedes consultar algún tutorial en internet sobre los requisitos previos si no recuerdas cómo instalaste y configuraste tu servidor de WordPress original.

Para una referencia rápida, aquí hay una lista del software pertinente y los archivos de configuración que necesitarás instalar o replicar:

Software:

Para instalar este software, ejecuta lo siguiente en tu servidor de wordpress-2:

Archivos de configuración que deben editarse o crearse para que coincidan con tu servidor de aplicaciones original:

  • /etc/php5/fpm/php.ini
  • /etc/php5/fpm/pool.d/www.conf
  • /etc/nginx/sites-available/example.com
  • /etc/nginx/sites-enabled/example.com

No olvides reiniciar PHP y Nginx una vez que hayas terminado de configurar el software, con estos comandos:

Una vez que hayas terminado de instalar y configurar tu nuevo servidor de aplicaciones, tendremos que sincronizar los archivos de aplicaciones de WordPress.

Sincronizar lo archivos de la aplicación web

Antes de poder balancear la carga de la aplicación, debemos asegurarnos de que los archivos de la aplicación web del nuevo servidor estén sincronizados con tu servidor de WordPress original. La ubicación de estos archivos depende de dónde instalaste WordPress y algunos otros archivos. Además de los archivos php que WordPress necesita para ejecutar, los archivos cargados y los complementos instalados a través de la interfaz de WordPress deben sincronizarse a medida que se cargan o se instalan. En el documento de requisitos previos, instalamos WordPress en /var/www/example.com– usaremos esta ubicación para todos nuestros ejemplos, pero debes sustituir esto con tu ruta de instalación de WordPress real.

Hay varias formas de sincronizar archivos entre servidores: NFS o glusterFS son opciones adecuadas. Utilizaremos glusterFS para satisfacer nuestras necesidades de sincronización porque permite que cada servidor de aplicaciones almacene su propia copia de los archivos de la aplicación, al tiempo que mantiene la coherencia en todo el sistema de archivos. Aquí hay un diagrama conceptual de nuestro almacenamiento compartido de destino:

Si no estás familiarizado con la terminología de glusterFS que se utiliza en esta sección, puedes consultar algún tutorial en línea.

Nota: las siguientes subsecciones se alternan entre los servidores de wordpress-1 wordpress-2 con frecuencia. ¡Asegúrate de ejecutar los comandos en los servidores adecuados, o te encontrarás con problemas!

Editar archivo hosts

Nota: Si tienes un DNS interno y tienes registros para las direcciones IP privadas de tus VPS, no dudes en omitir este paso y sustituir esos nombres de host por el resto de los comandos de instalación y configuración de glusterFS.

De lo contrario, en wordpress-1 y wordpress-2 VPS:

Editar /etc/hosts:

Agrega las siguientes dos líneas, sustituyendo la primera parte de cada una con las direcciones IP respectivas de los servidores de tu aplicación:

Debes guardar y Salir.

Instalar GlusterFS y configurar un volumen replicado

En los VPS’s wordpress-1 y wordpress-2:

Usa apt-get para instalar el software del servidor glusterFS:

En el servidor wordpress-1, ejecuta el siguiente comando para mirar con tu wordpress-2:

En wordpress-2, ejecuta el siguiente comando para mirar con wordpress-1:

En el servidor wordpress-1 y wordpress-2, para crear la ubicación donde glusterFS almacenará los archivos que administra, ejecuta:

En wordpress-1, para crear un volumen de glusterFS replicado llamado volume1, que almacenará tus datos en /gluster-storage ambos servidores de aplicaciones, ejecuta:

En wordpress-1 otra vez, ejecuta el siguiente comando para iniciar volume glusterFS que acabas de crear en volume1:

En wordpress-1, si deseas ver información sobre glusterFS volume que acabas de crear e iniciar, ejecuta:

Deberías ver que tienes dos “bricks” glusterFS, uno para cada servidor de WordPress.

Ahora que tenemos un volumen glusterFS en ejecución, hay que montarlo para poder usarlo como un sistema de archivos de replicación.

Montaje del almacenamiento compartido

Vamos a montar el sistema de archivos en wordpress-1 primero.

En wordpress-1, edita fstab para que nuestro sistema de archivos compartido se monte en el arranque:

Agregua la siguiente línea al final del archivo para usar /storage-pool como nuestro punto de montaje. Siéntete libre de sustituir esto (aquí y para el resto de esta configuración de glusterFS):

Tienes que Guardar y Salir.

En wordpress-1, ahora puedes montar el volumen glusterFS en el sistema de archivos /storage_pool:

Esto monta el volumen compartido, /storage-pool, en tu VPS wordpress-1. Puede ejecutarse df –h y debería aparecer como un sistema de archivos montado. A continuación, seguiremos un proceso similar para montar el almacenamiento compartido en wordpress-2.

En wordpress-2, edita fstab para que nuestro sistema de archivos compartido se monte en el arranque:

Agrega la siguiente línea al final del archivo para usar /storage-pool como nuestro punto de montaje. Si usaste un valor diferente, asegúrate de sustituirlo aquí:

En wordpress-2, ahora puedes montar el volumen glusterFS en el sistema de archivos /storage_pool:

Ahora, todos los archivos que se crean, modifican o eliminan en el sistema de archivos /storage-pool se sincronizarán en ambos servidores, incluso si uno de los servidores se cae temporalmente.

Mover archivos de WordPress a almacenamiento compartido

El siguiente paso es mover los archivos de WordPress de wordpress-1 al almacenamiento compartido. Por favor, sustituye las palabras resaltadas con tus propios valores. /var/www/example.com representa dónde se ubicaron los archivos de WordPress (y donde Nginx está buscando los archivos), y example.com en sí mismo es simplemente el nombre base del directorio.

En wordpress-1, ejecuta estos comandos para mover los archivos de la aplicación de WordPress para tu sistema de archivos compartidos, /storage-pool:

A continuación, querrás crear un enlace simbólico, que apunte a los archivos de WordPress en el sistema de archivos compartido, donde tus archivos de WordPress se almacenaron originalmente al ejecutar:

Ahora los archivos de WordPress se encuentran en el sistema de archivos compartidos, /storage-pool y todavía se puede acceder a través de Nginx a su ubicación original, /var/www/example.com.

Punto nuevo en el servidor de aplicaciones para almacenamiento compartido

El siguiente paso es crear un enlace simbólico en nuestro nuevo servidor de aplicaciones web que apunte a los archivos de WordPress en el sistema de archivos compartido.

Si creaste wordpress-2 con la opción de instantánea, ejecuta los siguientes comandos en wordpress-2:

Si creaste wordpress-2 * desde cero, ejecuta los siguientes comandos ** en wordpress-2:

¡Eso es todo para sincronizar los archivos de aplicación de WordPress! El siguiente paso es dar a nuestro nuevo servidor de aplicaciones, wordpress-2, acceso a la base de datos.

Crear un nuevo usuario de base de datos

Debido a que MySQL identifica a los usuarios por nombre de usuario y host de origen, debemos crear un nuevo usuario de wordpress que pueda conectarse desde nuestro nuevo servidor de aplicaciones, wordpress-2.

En tu base de datos VPS, mysql-1 , conéctate a la consola MySQL:

En las siguientes declaraciones de MySQL, reemplaza todas las palabras resaltadas con lo que sea apropiado para tu entorno:

  • wordpressuser: tu usuario de MySQL WordPress. Asegúrate de que sea el mismo que el nombre de usuario ya existente
  • wordpress2private_IP: la IP privada de tu VPS wordpress-2
  • password: la contraseña de tu usuario de MySQL WordPress. Asegúrate de que sea la misma que la contraseña existente (y que sea una buena contraseña)

Ejecuta esta declaración para crear un usuario de MySQL que pueda conectarse desde tu nuevo servidor de WordPress, wordpress-2:

Nuevamente, sustituye tus propios valores por wordpressuserwordpress_2_private_IP y, si tu base de datos no recibe el nombre de “wordpress”, asegúrate de cambiar eso también.

Ahora tu segundo servidor de aplicación web, wordpress-2, puede iniciar sesión en MySQL en tu servidor de base de datos, mysql-1.

Aún sin balanceo de carga

Ten en cuenta que hay dos servidores de aplicaciones web que se ejecutan, pero la aplicación no tiene balanceo de carga porque se debe acceder a cada servidor a través de sus respectivas direcciones IP públicas. Queremos poder acceder a la aplicación a través de la misma URL, como http://example.com/, y balancear el tráfico entre los dos servidores de aplicaciones web. Aquí es donde entra HAProxy.

Instalar HAProxy

Debes crear un nuevo VPS con redes privadas. Para este tutorial, lo llamaremos haproxy-www.

En nuestro VPS haproxy-www , instalemos HAProxy con apt-get:

Necesitamos habilitar el script de inicio de HAProxy, para que HAProxy inicie y se detenga junto con tu VPS.

Cambia el valor de ENABLED a 1 para habilitar el script de inicio de HAProxy:

Debes guardar y Salir. Ahora HAProxy comenzará y se detendrá con tu VPS. Además, ahora puedes usar el comando service para controlar tu HAProxy. Vamos a ver si está funcionando:

No se está ejecutando. Eso está bien, porque necesita ser configurado antes de que podamos usarlo. Vamos a configurar HAProxy para nuestro entorno a continuación.

Configuración de HAProxy

El archivo de configuración de HAProxy se divide en dos secciones principales:

  • Global: establece parámetros de todo el proceso
  • Proxies: se compone de parámetros defaultslistenfrontend, and backend.

Nuevamente, si no estás familiarizado con HAProxy o con los conceptos y la terminología básica de balanceo de carga, consulta este enlace: Introducción a los conceptos de HAProxy y balanceo de carga.

Configuración HAProxy: Global

Toda la configuración de HAProxy se debe realizar en tu VPS HAProxy, haproxy-www .

Primero, hagamos una copia del archivo predeterminado haproxy.cfg:

Ahora abre haproxy.cfg en un editor de texto:

Verás que hay dos secciones ya definidas: global y defaults. Primero haremos algunos cambios en algunos de los parámetros predeterminados.

Bajo defaults, busca las siguientes líneas:

Reemplaza la palabra “http” con “tcp en ambos casos:

Seleccionando tcp como el modo configura HAProxy para realizar el balanceo de carga de la capa 4. En nuestro caso, esto significa que todo el tráfico entrante en una dirección IP y puerto específicos se reenviará al mismo backend. Si no estás familiarizado con este concepto, puedes leer este post.

¡No cierres el archivo de configuración todavía! Agregaremos la configuración de proxy a continuación.

Configuración HAProxy: Proxies

Lo primero que queremos agregar es un frontend. Para una configuración básica de balanceo de carga de capa 4, una interfaz de usuario escucha el tráfico en una dirección IP y un puerto específico y luego reenvía el tráfico entrante a un servidor específico.

Al final del archivo, agreguemos nuestra interfaz, www. Asegúrate de reemplazarlo haproxy_www_public_IP con la IP pública de tu VPS haproxy-www:

Aquí hay una explicación de lo que significa cada línea en el fragmento de configuración de frontend anterior:

  • frontend www: especifica un frontend llamado “www”, ya que lo usaremos para manejar el tráfico entrante de www
  • bind haproxy_www_public_IP: 80: reemplaza haproxy_www_public_IP con la dirección IP pública de haproxy-www. Esto le dice a HAProxy que esta interfaz manejará el tráfico de red entrante en esta dirección IP y este puerto
  • default_backend wordpress-backend: esto especifica que todo el tráfico de este frontend se reenviará a wordpress-backend, que definiremos en el siguiente paso

Una vez que hayas terminado de configurar el frontend, continúa agregando el backend agregando las siguientes líneas. Asegúrate de reemplazar las palabras resaltadas con los valores apropiados:

Aquí hay una explicación de lo que significa cada línea en el fragmento de configuración de backend anterior:

  • backend wordpress-backend: especifica un backend llamado “wordpress-backend”
  • balance roundrobin: especifica que este backend usará el algoritmo de balanceo de carga “roundrobin”
  • mode tcp: especifica que este backend usará “tcp” o proxy de capa 4
  • server wordpress-1 …: especifica un servidor backend llamado “wordpress-1”, la IP privada (que debes sustituir) y el puerto que está escuchando, 80 en este caso. La opción “check” hace que el balanceador de carga realice periódicamente una comprobación de estado en este servidor
  • servidor wordpress-2 …: esto especifica un servidor backend llamado “wordpress-2”

Ahora debes guardar y salir. HAProxy ya está listo para iniciarse, pero primero habilitemos el registro.

Habilitar el registro de HAProxy

Habilitar el registro en HAProxy es muy simple. Primero edita el archivo rsyslog.conf:

A continuación, busca las siguientes dos líneas y elimínalas para habilitar la recepción de Syslog UDP. Debería parecerse a lo siguiente cuando hayas terminado:

Ahora reinicia rsyslog para habilitar la nueva configuración:

¡El registro de HAProxy ahora está habilitado! El archivo de registro se creará en /var/log/haproxy.log una vez que se inicie HAProxy.

Iniciar HAProxy y PHP/Nginx

En haproxy-www, inicia HAProxy para que los cambios de configuración surtan efecto:

Dependiendo de cómo configures tu nuevo servidor de aplicaciones, es posible que debas reiniciar tu aplicación de WordPress reiniciando PHP y Nginx.

En wordpress-2, reinicie PHP y Nginx ejecutando estos comandos:

Ahora, WordPress debería estar ejecutándose en ambos servidores de aplicaciones, y tienen balanceo de carga. Pero todavía hay un último cambio de configuración por hacer.

Actualizar la configuración de WordPress

Ahora que la URL de tu aplicación de WordPress ha cambiado, debemos actualizar un par de configuraciones en WordPress.

En cualquiera de los servidores de WordPress, edita tu wp-config.php. Se encuentra donde instalaste WordPress (en el tutorial, se instaló en /var/www/example.com pero tu instalación puede variar):

Tienes que encontrar la línea cerca de la parte superior que dice define(‘DB_NAME’, ‘wordpress’); y agrega las siguientes líneas encima de ella, sustituyendo los valores resaltados:

Ahora debes guardar y salir. En este momento las URL de WordPress están configuradas para apuntar a tu balanceador de carga en lugar de solo a tu servidor de WordPress original, que entra en juego cuando intentas acceder al Panel de control de wp-admin.

¡Balanceo de carga completo!

¡Tus servidores de aplicaciones web ahora tienen balanceo carga! ¡Tú usuario de WordPress con balanceo de carga ahora es accesible a través de la dirección IP pública o el nombre de dominio de tu balanceador de carga, haproxy-www!

Conclusión

Ahora la carga de tus usuarios se distribuirá entre tus dos servidores de WordPress. Además, si uno de tus servidores de aplicaciones de WordPress deja de funcionar, tu sitio seguirá estando disponible porque el otro servidor de WordPress reenviará todo el tráfico.

Con esta configuración, recuerda que tu servidor balanceador de carga HAProxy, haproxy-www, y tu servidor de base de datos, mysql-1, deben estar en ejecución para que tu sitio funcione correctamente.