Que es el balanceo de carga
El balanceo de carga (load balancing) es una tecnica que distribuye el trafico de red entrante entre multiples servidores backend para evitar que un solo servidor se sature, maximizar la utilizacion de recursos, garantizar la alta disponibilidad del servicio y permitir la escalabilidad horizontal de la infraestructura. Un balanceador de carga actua como punto de entrada unico para los clientes y decide a cual de los servidores backend enviar cada solicitud segun el algoritmo de distribucion configurado.
El balanceo de carga es esencial para aplicaciones web con alto trafico que requieren alta disponibilidad, donde la caida de un servidor no debe afectar el servicio al usuario final.
Algoritmos de distribucion de trafico
| Algoritmo | Como funciona | Mejor para |
|---|---|---|
| Round Robin | Distribuye secuencialmente entre los servidores en orden | Servidores con capacidad similar y solicitudes homogeneas |
| Least Connections | Envia al servidor con menos conexiones activas | Solicitudes con tiempos de procesamiento variables |
| IP Hash | El mismo cliente siempre va al mismo servidor (afinidad) | Aplicaciones que requieren sesiones persistentes |
| Weighted Round Robin | Distribuye segun el peso asignado a cada servidor | Servidores con capacidad diferente |
| Least Response Time | Envia al servidor con menor tiempo de respuesta | Entornos con servidores de rendimiento variable |
Configurar balanceo de carga con Nginx
Nginx puede funcionar como balanceador de carga eficiente. La configuracion se realiza en el archivo del sitio en /etc/nginx/sites-available/:
# Definir el grupo de servidores backend
upstream backend_pool {
# Algoritmo predeterminado: Round Robin
server 192.168.1.10:80;
server 192.168.1.11:80;
server 192.168.1.12:80;
# Con pesos diferentes
# server 192.168.1.10:80 weight=3;
# server 192.168.1.11:80 weight=1;
# Keepalive para reutilizar conexiones
keepalive 32;
}
server {
listen 80;
server_name ejemplo.com;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Verificacion de salud de los backends (Health Checks)
upstream backend_pool {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
# Servidor de respaldo, solo activo si los otros fallan
server 192.168.1.12:80 backup;
}
Consideraciones importantes
- El balanceador de carga debe tener redundancia propia (al menos dos instancias con failover) para no convertirse en un punto unico de fallo.
- Si la aplicacion web usa sesiones de usuario almacenadas en el servidor, usar el algoritmo IP Hash o centralizar las sesiones en Redis o Memcached para que cualquier servidor pueda atender a cualquier usuario.
- Configurar el balanceador de carga con SSL termination para que maneje los certificados SSL y comunique con los backends en HTTP interno, reduciendo la carga de procesamiento criptografico en los servidores de aplicacion.
