Una introducción a HAProxy y conceptos de equilibrio de carga

Introducción

HAProxy, que significa Proxy de Alta Disponibilidad, es un popular software de código abierto para balanceo de carga TCP/HTTP y solución de proxy que se puede ejecutar en Linux, macOS 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 varios 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, obtendrá una visión general de lo que es HAProxy, revisará la terminología de balanceo de carga y verá ejemplos de cómo podría usarse para mejorar el rendimiento y la confiabilidad de su propio entorno de servidor.

Terminología de HAProxy

Hay muchos términos y conceptos importantes cuando se trata de balanceo de carga y proxy. Repasará los términos comúnmente utilizados en las siguientes subsecciones.

Antes de entrar en los tipos básicos de balanceo de carga, debería comenzar con una revisión de ACL, backends y frontends.

Lista de Control de Acceso (ACL)

En relación con el equilibrio 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) en función del resultado de la prueba. El uso de ACL permite un reenvío flexible del tráfico de red basado en una variedad de factores como la coincidencia de patrones y el número de conexiones a un backend, por ejemplo.

Ejemplo de una ACL:

acl url_blog path_beg /blog

Esta ACL se empareja si la ruta de la solicitud de un usuario comienza con /blog. Esto coincidiría con una solicitud de http://tudominio.com/blog/entrada-de-blog-1, por ejemplo.

Para obtener una guía detallada sobre el uso de ACL, consulta el Manual de Configuración de HAProxy.

Backend

A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:

  • qué algoritmo de equilibrio de carga usar
  • a list of servers and ports

A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.

Aquí tienes un ejemplo de una configuración de dos backends, web-backend y blog-backend, con dos servidores web en cada uno, escuchando en el puerto 80:

backend web-backend
   balance roundrobin
   server web1 web1.yourdomain.com:80 check
   server web2 web2.yourdomain.com:80 check
   
backend blog-backend
   balance roundrobin
   mode http
   server blog1 blog1.yourdomain.com:80 check
   server blog1 blog1.yourdomain.com:80 check

La línea balance roundrobin especifica el algoritmo de equilibrio de carga, que se detalla en la sección de Algoritmos de Equilibrio de Carga.

mode http especifica que se utilizará el proxy de la capa 7, que se explica en la sección Tipos de Balanceo de Carga.

La opción check al final de las directivas server especifica que se deben realizar comprobaciones de salud en esos servidores backend.

Frontend

A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend section of the HAProxy configuration. Their definitions are composed of the following components:

  • a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
  • ACLs
  • Reglas use_backend, que definen qué backends usar dependiendo de qué condiciones de ACL coincidan, y/o una regla default_backend que maneja todos los demás casos

A frontend can be configured to various types of network traffic, as explained in the next section.

. Tipos de Balanceo de Carga

Ahora que tienes una comprensión de los componentes básicos que se utilizan en el balanceo de carga, puedes pasar a los tipos básicos de balanceo de carga.

Sin Balanceo de Carga

A simple web application environment with no load balancing might look like the following:

No Load Balancing

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

Balanceo de Carga de Capa 4

La forma más simple de balancear el tráfico de red hacia múltiples servidores es usar el balanceo de carga de capa 4 (capa de transporte). Balancear la carga de esta manera reenviará el tráfico de usuario basado en el rango de IP y el puerto (es decir, si llega una solicitud para http://yourdomain.com/anything, el tráfico se reenviará al backend que maneja todas las solicitudes para yourdomain.com en puerto 80). Para más detalles sobre la capa 4, consulte la subsección de TCP de nuestra Introducción a las Redes.

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

Layer 4 Load Balancing

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

Balanceo de carga en la capa 7

Otra forma más compleja de balancear el tráfico de red es utilizando el balanceo de carga en la capa 7 (capa de aplicación). Usar la capa 7 permite al balanceador de carga reenviar solicitudes a diferentes servidores backend según el contenido de la solicitud del usuario. Este modo de balanceo de carga le permite ejecutar múltiples servidores de aplicaciones web bajo el mismo dominio y puerto. Para obtener más detalles sobre la capa 7, consulte la subsección HTTP de nuestra Introducción a las Redes.

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

Layer 7 Load Balancing

En este ejemplo, si un usuario solicita yourdomain.com/blog, se le reenvía al backend 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 utilizan el mismo servidor de base de datos, en este ejemplo.

A snippet of the example frontend configuration would look like this:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog
 
  default_backend web-backend

Esto configura un frontend llamado 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 dirigir el tráfico al backend blog-backend.

default_backend web-backend especifica que todo el otro tráfico se enviará al backend web-backend.

Algoritmos de Balanceo de Carga

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

A few of the commonly used algorithms are as follows:

roundrobin

Round Robin selecciona los servidores por turnos. Este es el algoritmo predeterminado.

leastconn

Selecciona el servidor con menos conexiones. Esto se recomienda para sesiones más largas. Los servidores en el mismo backend también se rotan de forma circular.

fuente

Esto selecciona qué servidor utilizar en función de un hash de la dirección IP de origen desde la que los usuarios realizan las solicitudes. Este método asegura que los mismos usuarios se conecten a los mismos servidores.

Sesiones Pegajosas

Algunas aplicaciones requieren que un usuario continúe conectándose al mismo servidor backend. Esto se puede lograr mediante sesiones pegajosas, utilizando el parámetro appsession en el backend que lo requiera.

Verificación de Salud

HAProxy utiliza verificaciones de salud para determinar si un servidor backend está disponible para procesar solicitudes. Esto evita tener que eliminar manualmente un servidor del backend si se vuelve no disponible. La verificación de salud predeterminada consiste en intentar establecer una conexión TCP con el servidor.

Si un servidor falla en una comprobación de salud y, por lo tanto, no puede atender solicitudes, se deshabilita automáticamente en el backend, y el tráfico no se enviará a él hasta que vuelva a estar saludable. Si todos los servidores en un backend fallan, el servicio se volverá no disponible hasta que al menos uno de esos servidores backend vuelva a estar saludable.

Para ciertos tipos de backends, como servidores de bases de datos, la comprobación de salud predeterminada no necesariamente determina si un servidor sigue siendo saludable.

El servidor web Nginx también se puede usar como un servidor proxy independiente o un balanceador de carga, y a menudo se utiliza en conjunto con HAProxy por sus capacidades de almacenamiento en caché y compresión.

Alta disponibilidad

Las configuraciones de balanceo de carga de capa 4 y 7 descritas en este tutorial utilizan un balanceador de carga para dirigir el tráfico a uno de muchos servidores backend. Sin embargo, su balanceador de carga es un único punto de fallo en estas configuraciones; si falla o se ve abrumado con solicitudes, puede causar una alta latencia o tiempo de inactividad para su servicio.

A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.

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

En este ejemplo, tienes múltiples balanceadores de carga (uno activo y uno o más pasivos) detrás de una dirección IP estática que puede ser remapeada 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 hacia el balanceador de carga activo. Si ese balanceador de carga falla, tu mecanismo de conmutación por error lo detectará y automáticamente reasignará la dirección IP a uno de los servidores pasivos. Hay varias formas de implementar una configuración de alta disponibilidad activo/pasivo. Para obtener más información, lee Cómo Usar IPs Reservadas.

Conclusión

Ahora que tienes comprensión sobre el balanceo de carga, y sabes cómo hacer uso de HAProxy, tienes una base sólida para empezar a mejorar el rendimiento y la fiabilidad de tu propio entorno de servidor.

Si estás interesado en almacenar la salida de HAProxy para verla más tarde, echa un vistazo a Cómo Configurar el Registro de HAProxy con Rsyslog en CentOS 8 [Inicio Rápido].

Si estás buscando resolver un problema, echa un vistazo a Errores Comunes de HAProxy. Si se necesita un análisis más detallado, consulta Cómo Solucionar Problemas Comunes de HAProxy.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts