Introducción a HAProxy y balanceadores de carga

Introducción

HAProxy, que significa High Availability Proxy (Proxy de alta disponibilidad), es un popular software de código abierto TCP/HTTP Balanceador de carga y una solución de proxy que se puede ejecutar en Linux, Solaris y FreeBSD. Su uso más común es mejorar el rendimiento y la confiabilidad de un entorno de servidor distribuyendo la carga de trabajo entre múltiples servidores (por ejemplo, web, aplicación, base de datos). Se utiliza en muchos entornos de alto perfil, incluidos: GitHub, Imgur, Instagram y Twitter.

En esta guía, proporcionaremos una descripción general de qué es HAProxy, la terminología básica de balanceador de carga y ejemplos de cómo se puede usar para mejorar el rendimiento y la confiabilidad de tu propio entorno de servidor.

Terminología de HAProxy

Hay muchos términos y conceptos que son importantes cuando se analiza el balanceo de carga y el proxy. Repasaremos los términos de uso común en las siguientes subsecciones.

Antes de entrar en los tipos básicos de balanceo de carga, hablaremos sobre las ACL, los backends y los frontends.

Lista de control de acceso (ACL)

En relación con el balanceo de carga, las ACL se utilizan para probar alguna condición y realizar una acción (por ejemplo, seleccionar un servidor o bloquear una solicitud) según el resultado de la prueba. El uso de las ACL permite el reenvío flexible del tráfico de red en función de una variedad de factores, como la coincidencia de patrones y el número de conexiones a un servidor, por ejemplo.

Ejemplo de una ACL:

Esta ACL comprueba si coincide la ruta de la solicitud de un usuario que inicia con /blog. Esto coincidiría con una solicitud de http://yourdomain.com/blog/blog-entry-1, por ejemplo.

Backend

Un backend es un conjunto de servidores que recibe solicitudes reenviadas. Los backends se definen en la sección de back-end de la configuración de HAProxy. En su forma más básica, un backend se puede definir por:

  • qué algoritmo de equilibrio de carga utilizar
  • una lista de servidores y puertos

Un backend puede contener uno o varios servidores; en general, agregar más servidores a tu backend aumentará tu capacidad de carga potencial al distribuir la carga entre varios servidores. Aumentar la confiabilidad también se logra de esta manera, en caso de que algunos de tus servidores back-end no estén disponibles.

Aquí está un ejemplo de una configuración de dos back-end, Web-backend y blog-backend con dos servidores web en cada uno, escuchando en el puerto 80:

La línea balance roundrobin especifica el algoritmo de balanceo de carga, que se detalla en los Algoritmos de balanceo de carga.

mode http especifica que se utilizará el proxy de capa 7, que se explica en la sección tipos de balanceadores de carga.

La opción check al final de las directivas server especifica que se deben realizar comprobaciones de estado en esos servidores de back-end.

Frontend

Un frontend define cómo se deben reenviar las solicitudes a los backends. Los frontends se definen en la sección de frontend de la configuración de HAProxy. Sus definiciones se componen de los siguientes componentes:

  • Un conjunto de direcciones IP y un puerto (por ejemplo, 10.1.1.7:80, *: 443, etc.)
  • ACLs
  • Reglas use_backend, que definen qué backends utilizar según las condiciones de ACL que coincidan, y/o una regla default_backend que maneja todos los demás casos.

Un frontend puede configurarse para varios tipos de tráfico de red, como se explica en la siguiente sección.

Tipos de balanceo de carga

Ahora que entendemos los componentes básicos que se utilizan en el balanceo de carga, entremos en los tipos básicos de balanceo de carga.

Sin balanceo de carga

Un entorno de aplicación web simple sin balanceo de carga podría tener el siguiente aspecto:

En este ejemplo, el usuario se conecta directamente a tu servidor web, en yourdomain.com y no hay balanceo de carga. Si tu único servidor web se cae, el usuario ya no podrá acceder a tu servidor web. Además, si muchos usuarios intentan acceder a tu servidor simultáneamente y no puede manejar la carga, es posible que tengan una experiencia lenta o que no puedan conectarse en absoluto.

Balanceo de carga de capa 4

La forma más sencilla de balancear la carga del tráfico de red a múltiples servidores es usar el balanceo de carga de la capa 4 (capa de transporte). El balanceo de carga de esta manera reenviará el tráfico del usuario según el rango de IP y el puerto (es decir, si se recibe una solicitud para http://yourdomain.com/anything), el tráfico se reenviará al backend que maneja todas las solicitudes de yourdomain.com en el puerto 80 ).

Aquí hay un diagrama de un ejemplo simple de balanceo de carga de capa 4:

El usuario accede al balanceador de carga, que reenvía la solicitud del usuario al grupo de servidores de back -end web. Cualquiera que sea el servidor backend seleccionado, responderá directamente a la solicitud del usuario. En general, todos los servidores del servidor web deben ofrecer contenido idéntico; de lo contrario, el usuario podría recibir contenido inconsistente. Ten en cuenta que ambos servidores web se conectan al mismo servidor de base de datos.

Balanceo de carga de capa 7

Otra forma más compleja de balancear la carga del tráfico de la red es usar el balanceo de carga de la capa 7 (capa de aplicación). El uso de la capa 7 permite que el balanceador de carga reenvíe las solicitudes a diferentes servidores backend en función del contenido de la solicitud del usuario. Este modo de balanceo de carga te permite ejecutar múltiples servidores de aplicaciones web en el mismo dominio y puerto.

Aquí hay un diagrama de un ejemplo simple de balanceo de carga de capa 7:

En este ejemplo, si un usuario solicita yourdomain.com/blog, se reenvían al backend del blog, que es un conjunto de servidores que ejecutan una aplicación de blog. Otras solicitudes se reenvían a web-backend, que podría estar ejecutando otra aplicación. Ambos backends usan el mismo servidor de base de datos, en este ejemplo.

Un fragmento de la configuración de ejemplo del frontend se vería así:

Esto configura una interfaz llamada http, que maneja todo el tráfico entrante en el puerto 80.

acl url_blog path_beg /blog coincide con una solicitud si la ruta de la solicitud del usuario comienza con /blog.

use_backend blog-backend if url_blog utiliza la ACL para enviar el tráfico al blog-backend.

default_backend web-backend especifica que el resto del tráfico se reenviará a web-backend.

Algoritmos de balanceo de carga

El algoritmo de balanceo de carga que se utiliza determina qué servidor, en un backend, se seleccionará cuando se realice el balanceo de carga. HAProxy ofrece varias opciones para algoritmos. Además del algoritmo de balanceo de carga, a los servidores se les puede asignar un parámetro de peso para manipular la frecuencia con la que se selecciona el servidor, en comparación con otros servidores.

Debido a que HAProxy proporciona tantos algoritmos de equilibrio de carga, aquí solo describiremos algunos de ellos. Puedes consultar el Manual de configuración de HAProxy para obtener una lista completa de algoritmos.

Algunos de los algoritmos utilizados comúnmente son los siguientes:

roundrobin

Round Robin selecciona servidores por turnos. Este es el algoritmo por defecto.

leastconn

Selecciona el servidor con el menor número de conexiones; se recomienda para sesiones más largas. Los servidores en el mismo backend también se rotan en forma de round-robin.

source

Este selecciona qué servidor usar en función de un hash de la IP de origen, es decir, la dirección IP de tu usuario. Este es un método para asegurar que un usuario se conectará al mismo servidor.

Sticky Sessions

Algunas aplicaciones requieren que un usuario continúe conectándose al mismo servidor backend. Esta persistencia se logra a través de Sticky Sessions – sesiones adhesivas, utilizando el parámetro de Sticky Sessions en el backend que lo requiere.

Comprobar el estado

HAProxy usa controles de estado para determinar si un servidor de back-end está disponible para procesar solicitudes. Esto evita tener que eliminar manualmente un servidor del backend si no está disponible. La comprobación de estado predeterminada intentar establecer una conexión TCP con el servidor, es decir, comprobar si el servidor backend está escuchando en la dirección IP y el puerto configurados.

Si un servidor falla una comprobación de estado, por lo tanto, no puede atender las solicitudes, se desactiva automáticamente en el backend, es decir, el tráfico no se reenviará hasta que vuelva a estar en buen estado. Si todos los servidores de un servidor backend fallan, el servicio dejará de estar disponible hasta que al menos uno de esos servidores backend vuelva a funcionar correctamente.

Para ciertos tipos de backends, como los servidores de bases de datos en ciertas situaciones, la comprobación de estado predeterminada es insuficiente para determinar si un servidor todavía está en buen estado.

Otras soluciones

Si crees que HAProxy puede ser demasiado complejo para tus necesidades, las siguientes soluciones pueden ser una mejor opción:

  • Servidores virtuales de Linux (LVS): un balanceador de carga de capa 4 simple y rápido incluido en muchas distribuciones de Linux
  • Nginx: un servidor web rápido y confiable que también se puede utilizar para fines de balanceo de carga y proxy. Nginx se usa a menudo junto con HAProxy por sus capacidades de almacenamiento y compresión.

Alta Disponibilidad

Las configuraciones de balanceo de carga de capa 4 y 7 descritas antes usan un balanceador de carga para dirigir el tráfico a uno de los muchos servidores backend. Sin embargo, tu balanceador de carga es un punto único de falla en estas configuraciones; Si se cae o se ve abrumado por las solicitudes, puede causar una alta latencia o tiempo de inactividad para tu servicio.

Una configuración de High Availability (HA) es una infraestructura sin un solo punto de falla. Evita que una sola falla del servidor sea un evento de tiempo de inactividad al agregar redundancia a cada capa de su arquitectura. Un balanceador de carga facilita la redundancia para la capa de back-end (servidores web/de aplicaciones), pero para una configuración de alta disponibilidad verdadera, también necesita tener balanceadores de carga redundantes.

Aquí hay un diagrama de una configuración básica de alta disponibilidad:

En este ejemplo, tienes varios balanceadores de carga (uno activo y uno o más pasivos) detrás de una dirección IP estática que se puede volver a asignar de un servidor a otro. Cuando un usuario accede a tu sitio web, la solicitud pasa a través de la dirección IP externa al balanceador de carga activo. Si ese balanceador de carga falla, su mecanismo de conmutación por error lo detectará y reasignará automáticamente la dirección IP a uno de los servidores pasivos. Hay varias formas diferentes de implementar una configuración de HA activa/pasiva.

 Conclusión

Ahora que tienes un conocimiento básico del balanceo de carga y conoces algunas maneras en que HAProxy facilita tus necesidades de balanceo de carga, tienes una base sólida para comenzar a mejorar el rendimiento y la confiabilidad de tu propio entorno de servidor.