linux-ubuntu-debian load-balancing haproxy nginx keepalived ha networking

Load Balancing: HAProxy, Nginx & Keepalived (Artikel 056)

Kombination von Load Balancing und Hochverfügbarkeit. Einsatz von Keepalived für VIP-Failover und HAProxy/Nginx zur Verteilung von Web-Traffic auf Layer 4 und Layer 7.

# Load Balancing Masterclass: HAProxy & Keepalived

TL;DR / Management Summary Ein einzelner Load Balancer ist ein Single Point of Failure. In diesem Modul bauen wir ein hochverfügbares Gateway: Keepalived verwaltet eine virtuelle IP (VIP), die zwischen zwei Nodes schwenkt, während HAProxy den eingehenden Traffic intelligent auf Backend-Server verteilt. Empfehlung: HAProxy für maximale Flexibilität (Layer 7), Nginx für einfache Web-Setups und Keepalived als unverzichtbares Fundament für das IP-Failover.


# 1. Einführung & Architektur

Die Schichten des Load Balancings.

  • Layer 4 (Transport): Keepalived (VRRP). Arbeitet auf IP/Port Ebene. Schnell, merkt sich keine Sessions.
  • Layer 7 (Application): HAProxy / Nginx. Erkennt HTTP-Header, Cookies und Pfade. Erlaubt intelligentes Routing.

# Architektur-Übersicht (Mermaid)

graph TD
    A[Client: Internet] -->|Traffic| B[Virtual IP: 10.0.0.100]
    subgraph "HA Balancer Stack"
        B --- C[Node 1: Keepalived + HAProxy]
        B --- D[Node 2: Keepalived + HAProxy]
        C <..>|VRRP Heartbeat| D
    end
    C --> E[Backend Web 1]
    C --> F[Backend Web 2]
    D --> E
    D --> F

# 2. Keepalived: Die virtuelle IP (VIP)

Das Fundament.

Keepalived nutzt das VRRP-Protokoll. Der Node mit der höchsten Priorität hält die IP.

# Konfiguration (/etc/keepalived/keepalived.conf)

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret
    }
    virtual_ipaddress {
        10.0.0.100/24
    }
}

# 3. HAProxy: Intelligente Verteilung

Der Traffic-Manager.

HAProxy bietet ungeschlagene Performance und detaillierte Statistiken.

# Konfiguration (/etc/haproxy/haproxy.cfg)

frontend main_gateway
    bind *:80
    acl is_api path_beg /api
    use_backend api_servers if is_api
    default_backend web_servers

backend web_servers
    balance roundrobin
    server srv1 10.0.0.51:80 check
    server srv2 10.0.0.52:80 check

backend api_servers
    balance leastconn
    server api1 10.0.0.61:8080 check

# 4. Day-2 Operations: Monitoring & Health-Checks

Wann ist ein Backend “down”?

# HAProxy Stats Page

Aktivieren Sie die grafische Übersicht:

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s

# Keepalived Checks

Stellen Sie sicher, dass Keepalived die IP abgibt, wenn HAProxy stirbt:

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

# 5. Troubleshooting & “War Stories”

Praxisfallen.

# Story 1: “Der Split-Brain VIP”

Symptom: Beide Balancer-Nodes behaupten “MASTER” zu sein. Die VIP ist doppelt im Netz (IP-Konflikt). Ursache: Die Balancer können sich gegenseitig nicht mehr per UDP/Multicast (Port 112) erreichen (Firewall!). Lösung: Erlauben Sie VRRP-Traffic in UFW/Iptables: ufw allow proto vrrp.

# Story 2: “Session-Verlust bei Failover”

Symptom: Wenn der Balancer schwenkt, fliegen alle User aus der Applikation (Login weg). Ursache: HAProxy verteilt zwar Last, aber die Sessions liegen lokal auf den Webservern. Lösung: Nutzen Sie Redis für zentrales Session-Management oder setzen Sie stick-table in HAProxy ein, damit User immer zum gleichen Backend geschickt werden (Persistence).


# 6. Fazit & Empfehlung

  • Redundanz: Betreiben Sie Load Balancer niemals als Single Node.
  • Layer 7: Nutzen Sie HAProxy, wenn Sie Header-Manipulation oder komplexes Path-Routing brauchen.
  • Performance: HAProxy ist für reine Load-Balancing-Aufgaben effizienter als Nginx.

# Anhang: Cheatsheet

Aufgabe Befehl / URL
VIP prüfen ip addr show eth0
HAProxy Config Test haproxy -c -f /etc/haproxy/haproxy.cfg
HAProxy Status systemctl status haproxy
Stats URL http://<vip>:8404/stats
Keepalived Logs journalctl -u keepalived -f
Backup erzwingen systemctl stop keepalived (auf Master)