Load Balancing — Rozloženie záťaže
Load balancer (LB) rozdeľuje prichádzajúcu sieťovú prevádzku medzi viacero backendových serverov. Cieľom je zvýšiť dostupnosť, výkon a škálovateľnosť aplikácií.
1. L4 vs L7 Load Balancing
| Vlastnosť | L4 (Transport) | L7 (Application) |
|---|---|---|
| Vrstva OSI | TCP / UDP | HTTP / HTTPS / gRPC |
| Rozhodovanie | IP + port | URL, hlavičky, cookies, obsah |
| Výkon | Rýchlejší (menej inšpekcie) | Pomalší, ale inteligentnejší |
| Príklady | AWS NLB, HAProxy (TCP mód) | AWS ALB, Nginx, HAProxy (HTTP mód) |
| SSL termination | Zvyčajne nie (passthrough) | Áno — dešifruje a znova šifruje |
| Use case | Databázy, TCP služby, gaming | Web aplikácie, API gateway, microservices |
Kedy L4? Keď nepotrebuješ rozhodovať na základe obsahu a chceš minimálnu latenciu. Kedy L7? Keď potrebuješ routing podľa URL path, host header alebo cookie-based sessions.
2. Algoritmy rozloženia záťaže
Round Robin
Požiadavky sa striedavo posielajú na každý server v poradí.
Request 1 → Server A
Request 2 → Server B
Request 3 → Server C
Request 4 → Server A (opäť od začiatku)
✅ Jednoduchý, funguje dobre keď sú servery rovnako výkonné. ❌ Neráta s aktuálnym zaťažením servera.
Weighted Round Robin
Servery s vyšším výkonom dostanú väčšiu váhu:
server backend1 weight 3 # dostane 3x viac requestov
server backend2 weight 1
Least Connections
Požiadavka ide na server s najmenším počtom aktívnych spojení.
upstream backend {
least_conn;
server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3;
}
✅ Lepší pre dlhé spojenia (WebSocket, databázy). ❌ Overhead na sledovanie spojení.
IP Hash
Hash klientovej IP adresy určí, na ktorý server pôjde. Rovnaká IP → vždy rovnaký server.
upstream backend {
ip_hash;
server 10.0.0.1;
server 10.0.0.2;
}
✅ Prirodzené sticky sessions bez cookies. ❌ Nerovnomerné rozloženie ak veľa klientov ide cez jeden NAT.
Ďalšie algoritmy
- Random — náhodný výber (prekvapivo efektívny pri veľkom počte serverov)
- Least Response Time — kombinácia najmenej spojení + najrýchlejšia odozva
- Resource-based — na základe health check reportov (CPU, RAM)
3. HAProxy
HAProxy je open-source, vysoko výkonný L4/L7 load balancer a reverse proxy.
Inštalácia
# Debian/Ubuntu
sudo apt install haproxy
# Overenie
haproxy -v
Základná konfigurácia
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5s
timeout client 30s
timeout server 30s
retries 3
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 10.0.0.1:8080 check inter 5s fall 3 rise 2
server web2 10.0.0.2:8080 check inter 5s fall 3 rise 2
server web3 10.0.0.3:8080 check inter 5s fall 3 rise 2
listen stats
bind *:8404
stats enable
stats uri /stats
stats auth admin:password123
HAProxy — kľúčové parametre
| Parameter | Popis |
|---|---|
balance |
Algoritmus (roundrobin, leastconn, source) |
check |
Zapne health check |
inter |
Interval medzi health checkmi |
fall |
Počet zlyhaní pred označením "down" |
rise |
Počet úspechov pred označením "up" |
weight |
Váha servera |
backup |
Server sa použije len ak sú primárne down |
HAProxy v TCP (L4) móde
frontend tcp_front
bind *:3306
mode tcp
default_backend mysql_servers
backend mysql_servers
mode tcp
balance leastconn
server db1 10.0.0.10:3306 check
server db2 10.0.0.11:3306 check backup
4. Nginx ako Load Balancer
Nginx je primárne web server, ale výborne funguje aj ako L7 load balancer.
Základná konfigurácia
# /etc/nginx/conf.d/load-balancer.conf
upstream backend_app {
least_conn;
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeouty
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
}
Nginx vs HAProxy
| Nginx | HAProxy | |
|---|---|---|
| Primárne | Web server + LB | Čistý LB/proxy |
| L4 | Áno (stream modul) | Áno (natívne) |
| L7 | Áno | Áno |
| Health checks | Pasívne (free) / Aktívne (Plus) | Aktívne (free) |
| Dashboard | Nginx Plus ($$$) | Zadarmo (stats page) |
| Výkon | Výborný | Mierne lepší pri čistom LB |
5. Cloud Load Balancers
AWS
| Typ | Vrstva | Use Case |
|---|---|---|
| ALB (Application) | L7 | HTTP/HTTPS, path-based routing, gRPC |
| NLB (Network) | L4 | TCP/UDP, ultra-nízka latencia, statická IP |
| CLB (Classic) | L4/L7 | Legacy — nepoužívať pre nové projekty |
| GWLB (Gateway) | L3 | Firewall, IDS/IPS appliances |
# Terraform — ALB príklad
resource "aws_lb" "app" {
name = "app-alb"
internal = false
load_balancer_type = "application"
subnets = var.public_subnets
security_groups = [aws_security_group.alb.id]
}
resource "aws_lb_target_group" "app" {
name = "app-tg"
port = 8080
protocol = "HTTP"
vpc_id = var.vpc_id
health_check {
path = "/health"
healthy_threshold = 2
unhealthy_threshold = 3
interval = 30
timeout = 5
}
}
GCP
- HTTP(S) Load Balancer — globálny L7, anycast IP, Cloud CDN integrácia
- TCP/UDP Load Balancer — regionálny L4
- Internal Load Balancer — pre interný traffic vo VPC
Azure
- Azure Application Gateway — L7, WAF integrácia
- Azure Load Balancer — L4, interný aj verejný
6. Health Checks
Health checks overujú, či sú backend servery živé a schopné obsluhovať požiadavky.
Typy health checkov
| Typ | Popis | Príklad |
|---|---|---|
| TCP | Overí, či je port otvorený | check v HAProxy |
| HTTP | Pošle GET request, očakáva 2xx | option httpchk GET /health |
| Custom script | Spustí externý skript | external-check v HAProxy |
| gRPC | gRPC health check protocol | ALB s gRPC target group |
Best practices pre health check endpoint
// GET /health
app.get('/health', async (req, res) => {
try {
// Over pripojenie na DB
await db.query('SELECT 1');
// Over pripojenie na cache
await redis.ping();
res.status(200).json({
status: 'healthy',
timestamp: new Date().toISOString()
});
} catch (error) {
res.status(503).json({
status: 'unhealthy',
error: error.message
});
}
});
⚠️ Liveness vs Readiness: Liveness = "som živý?" (reštart ak nie). Readiness = "som pripravený na traffic?" (vyraď z LB ak nie).
7. Sticky Sessions (Session Affinity)
Sticky sessions zabezpečia, že klient je vždy smerovaný na rovnaký backend server.
Kedy ich potrebuješ?
- Aplikácia ukladá session do pamäte (nie do Redis/DB)
- WebSocket spojenia
- Uploadovanie veľkých súborov v čiastkových requestoch
Implementácia v HAProxy
backend web_servers
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 10.0.0.1:8080 check cookie s1
server web2 10.0.0.2:8080 check cookie s2
Implementácia v Nginx
upstream backend {
ip_hash; # sticky na základe IP
# Alebo s nginx-sticky-module:
# sticky cookie srv_id expires=1h;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
⚠️ Anti-pattern: Sticky sessions sťažujú škálovanie. Preferuj stateless aplikácie s externým session store (Redis, DB).
8. SSL/TLS Termination
SSL termination = load balancer dešifruje HTTPS traffic a posiela plain HTTP na backend.
Client --[HTTPS]--> LB --[HTTP]--> Backend
Výhody
- Backend servery nemusia spracovávať TLS → menšia záťaž
- Jednoduchšia správa certifikátov (len na LB)
- LB vidí obsah requestu → môže robiť L7 routing
HAProxy SSL termination
frontend https_front
bind *:443 ssl crt /etc/ssl/certs/app.pem
http-request set-header X-Forwarded-Proto https
default_backend web_servers
backend web_servers
balance roundrobin
server web1 10.0.0.1:8080 check
SSL Passthrough
Ak potrebuješ end-to-end šifrovanie (napr. compliance požiadavky):
frontend tcp_front
bind *:443
mode tcp
default_backend web_servers
backend web_servers
mode tcp
server web1 10.0.0.1:443 check
SSL Re-encryption
LB dešifruje, inšpektuje a znovu šifruje smerom na backend:
Client --[HTTPS]--> LB --[HTTPS]--> Backend
9. Best Practices
Architektúra
- ✅ Používaj minimálne 2 LB (active-passive alebo active-active) pre HA
- ✅ Umiestni LB do viacerých AZ (availability zones)
- ✅ Nastav connection draining — dokonči existujúce requesty pred vyradením servera
- ✅ Používaj DNS failover medzi regiónmi pre disaster recovery
Health Checks
- ✅ Nastav rozumné intervaly — príliš časté zaťažujú backend
- ✅ Používaj dedikovaný health endpoint — nie hlavnú stránku
- ✅ Over všetky závislosti v health checku (DB, cache, externé služby)
- ❌ Nepoužívaj príliš agresívne
fallhodnoty — krátkodobý spike ≠ výpadok
Bezpečnosť
- ✅ SSL termination na LB, plain HTTP len v internej sieti
- ✅ Nastav rate limiting a DDoS ochranu na LB
- ✅ Filtruj X-Forwarded-For hlavičky — nedôveruj klientom
- ✅ Použi WAF (Web Application Firewall) na L7 LB
Monitoring
- ✅ Sleduj response time, error rate, active connections
- ✅ Nastav alerty na vysokú latenciu alebo error rate > threshold
- ✅ Loguj access logy na LB pre debugging a audit
Session Management
- ✅ Preferuj stateless aplikácie s externým session store
- ✅ Ak musíš sticky sessions → používaj cookie-based, nie IP-based
- ❌ Nepoužívaj sticky sessions ako náhradu za správny session management
10. Zhrnutie
┌─────────────┐
Klienti ──────► │ Load │
│ Balancer │
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
┌────▼───┐ ┌────▼───┐ ┌────▼───┐
│ App 1 │ │ App 2 │ │ App 3 │
└────────┘ └────────┘ └────────┘
| Čo | Odporúčanie |
|---|---|
| Webové aplikácie | L7 LB (ALB, Nginx, HAProxy HTTP) |
| TCP služby | L4 LB (NLB, HAProxy TCP) |
| Algoritmus | least_conn pre väčšinu prípadov |
| Sessions | Stateless + Redis/DB |
| SSL | Termination na LB |
| HA | Min. 2 LB + multi-AZ |
| Health checks | HTTP GET /health s dependency checkmi |