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.