CARP & HAProxy: High-Availability für Anfänger

Das Themengebiet der High-Availability im Webbereich ist oft kompliziert, groß, und schwer zu fassen. Das muss es aber nicht sein, dank CARP und HAProxy. Die Verbindung dieser beiden Techniken ermöglicht es anfragen auf mehrere Server zu verteilen und dabei das Single-Point-of-Failure Problem zu umgehen. Dafür brauchen wir nur mindestens 2 Rechner mit FreeBSD (oder einem anderen BSD System mit CARP unterstütung), die im gleichen Subnetz stehen und etwas Zeit zur Einrichtung folgender Software:

HAProxy

HAProxy ist ein Reverse TCP Proxy mit Load-Balancing Funktionalität. Er verteilt die Last auf mehrere (Backend-)Server und erkennt wenn einer von ihnen nicht mehr erreichbar ist. HAProxy kann sowohl für das Balancing von MySQL-Anfragen als auch für HTTP-Requests genutzt werden. Ich konzentriere mich hier ausschließlich auf das letztere.

Installation

Die Installation erfolgt am einfachsten über den Ports-Tree

cd /usr/ports/net/haproxy
make install clean

Dies kompiliert und installiert HAProxy auf dem System.

Konfiguration

Die Konfigurationsdatei für HAProxy liegt unter /usr/local/etc/haproxy.conf. Ein Ansatzpunkt für eine funktionierende Konfiguration könnte folgendes sein

global
        daemon
        maxconn 256

defaults
        mode http
        timeout connect 5000ms
        timeout client 5000ms
        timeout server 5000ms
        stats enable

frontend http-in
        option httplog
        log global
        default_backend servers

backend servers
        server server1 server1.example.com:8080 check
        server server2 server2.example.com:8080 check

CARP

CARP steht für “Common Address Redundancy Protocol”. Es ermöglicht, dass wenn ein eine IP-Adresse nicht mehr erreichbar ist, automatisch von einem anderen Host übernommen werden kann. Voraussetzung hierfür ist, dass alle Computer im gleichen Netzwerksegment stehen, da CARP via Broadcast arbeitet.

Installation

Ab FreeBSD 9.0 ist CARP standardmäßig aktiviert. Bei älteren Versionen muss entweder der Support in den Kernel einkompiliert werden oder das Kernelmodul aktiviert werden mit dem Eintrag.

if_carp_load="YES"

in der Datei /boot/loader.conf

Konfigurationsdateien

Die Konfiguration von CARP ist relativ simpel. Als erstes wird ein Master-Server Konfiguriert. Dieser hält standardmäßig die IP.

Dafür müssen wir ein CARP Interface erstellen un konfigurierten. Im Laufenden Betrieb nutzen wir dafür

ifconfig carp0 create
ifconfig vhid 1 pass <passwort> 10.10.0.1/16

Das Passwort und die vhid-Nummer müssen auf allen Backup-Systemen gleich sein. Damit diese Konfiguration auch bei einem Neustart noch funktioniert, ergänzen wir die /etc/rc.conf um folgende Zeilen

cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass <passwort> 10.10.0.1/16"

Auf den Backup-Systemen wird das CARP-Interface auf ähnlich weise erstellt nur, dass das Argument “adskew” eingefügt wird:

cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 advskew 100 pass <passwort> 10.10.0.1/16"

Je höher der Wert hinter “advskew” desto niedriger die Priorität falls das Haupt-System ausfällt.