Aufsetzen eines hochverfügbaren Load Balancers (mit Failover und Session Support) mit HAProxy/Heartbeat auf Fedora 8

Version 1.0
Author: Oliver Meyer <o [dot] meyer [at] projektfarm [dot] de>

Diese Anleitung erklärt, wie man einen Load Balancer (bestehend aus zwei Systemen) in einer aktiven/passiven Konfiguration mit HAProxy und heartbeat auf Fedora 8 aufsetzt. Der Load Balancer sitzt zwischen dem Benutzer und zwei (oder mehreren) Apache Web Servern, die den gleichen Inhalt aufweisen. Der Load Balancer verteilt die Anfragen an die Web Server und überprüft ihren Zustand. Wenn einer von ihnen ausfällt, werden alle Anfragen automatisch zum verbleibenden Web Server(n) umgeleitet. Zusätzlich überwachen die beiden Load Balancer-Systeme sich gegenseitig unter Verwendung von heartbeat. Wenn der Master ausfällt, wird der Slave zum Master, was bedeutet, dass dass der Benutzer keinerlei Störungen des Dienstes bemerken wird. HAProxy unterstützt Sessions, das heißt, Du kannst es mit jedem Web Programm verwenden, das Sessions in Anspruch nimmt (wie zum Beispiel Foren, Warenkörbe etc.).

Von der HAProxy Webseite: „HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. Supporting tens of thousands of connections is clearly realistic with todays hardware. Its mode of operation makes its integration into existing architectures very easy and riskless, while still offering the possibility not to expose fragile web servers to the Net.“

Diese Anleitung ist ein praktischer Leitfaden ohne jegliche Garantie – theoretisches Hintergrundwissen wird nicht abgedeckt. Es gibt viele Möglichkeiten ein solches System einzurichten – dies ist der Weg, den ich gewählt habe.

1 Vorbereitung

Für diese Anleitung habe ich vier Fedora 8 Systeme (minimale Installation ohne gui etc.) mit folgender Konfiguration eingerichtet.

1.1 Load Balancer 1

Hostname: lb1.example.com
IP: 192.168.0.110
Shared IP: 192.168.0.120

1.2 Load Balancer 1

Hostname: lb2.example.com
IP: 192.168.0.111
Shared IP: 192.168.0.120

1.3 Web Server 1

Hostname: http1.example.com
IP: 192.168.0.112

1.4 Web Server 2

Hostname: http2.example.com
IP: 192.168.0.113

1.5 Überblick

+—————–+
| 192.168.0.120 |
| Shared IP |
+——–+——–+
|
+———————-+
| |
+——–+——–+ +——–+——–+
| 192.168.0.110 | | 192.168.0.111 |
| Load Balancer 1 | | Load Balancer 2 |
+——–+——–+ +——–+——–+

+——–+——–+ +——–+——–+
| 192.168.0.112 | | 192.168.0.113 |
| Web Server 1 | | Web Server 2 |
+—————–+ +—————–+

2 HTTP1 & HTTP2

2.1 Firewall Konfiguration

Damit auf die Web Server von außen zugegriffen werden kann, musst Du die entsprechenden Ports auf beiden Web Servern öffnen.

system-config-firewall-tui

Setze HTTP & HTTPS als vertrauenswürdigen Dienst, wie auf dem unteren Screenshot gezeigt und speichere die Einstellungen.

2.2 Apache Konfiguration

HAProxy arbeitet als transparenter Proxy – das heißt es wird die IP Adresse des Benutzers in einem Feld namens „X-Forwarded-For“ zu den Web Servern leiten. Damit die Web Server die IP Adresse des Benutzers und nicht die IP Adressen der Load Balancer in den Log-Dateien speichern, müssen wir das Log Format in der Apache Konfigurationsdatei auf beiden Servern bearbeiten.

vi /etc/httpd/conf/httpd.conf

Suche nach den Zeilen, die mit „LogFormat“ beginnen …

[...]
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
[...]

… und ersetze „%h“ mit „%{X-Forwarded-For}i“. Der Inhalt sollte wie folgt aussehen:

[...]
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
[...]

Wir werden HAProxy so konfigurieren, dass es den Zustand des Web Servers überprüft indem es kontinuierlich die Datei „check.txt“ der Web Server abruft. Um die Log-Dateien klein zu halgen, passen wir den ersten vhost auf jedem Web Server an (HAProxy wird die IP Adressen der Web Server nutzen, um die Datei abzurufen – also wird der erste vhost auf die Anfrage reagieren) um sicher zu gehen, dass der Zugriff auf „check.txt“ nicht gelogged wird. In diesem Beispiel werden die vhosts konfiguriert in „/etc/httpd/conf.d/vhosts.conf“.

Füge folgende Zeile der Konfiguration Deines ersten vhosts hinzu …

SetEnvIf Request_URI „^/check.txt$“ dontlog

… und füge die Ausnahme (env=!dontlog) der Zeile für das CustomLog hinzu. Zum Beispiel könnte die Konfiguration für den ersten vhost wie folgt aussehen:

NameVirtualHost 192.168.0.112:80
<VirtualHost 192.168.0.112:80>
    ServerName health.example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/haproxy

    SetEnvIf Request_URI "^/check.txt$" dontlog
    LogLevel warn
    ErrorLog /var/log/httpd/vhost_error.log
    CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog
</VirtualHost>

Nun müssen wir die Datei „check.txt“ (diese Datei kann leer sein) innerhalb des Dokumenten-Roots des ersten vhosts erstellen.

touch /var/www/haproxy/check.txt

Danach ist die Konfiguration der Web Server abgeschlossen – starte die Web Server neu.

/etc/init.d/httpd restart

3 LB1 & LB2

3.1 Firewall Konfiguration

Damit HTTP & HTTPS Verbindungen an die Web Server weitergeleitet werden können und die heartbeat daemons mit einander kommunizieren können, musst Du die entsprechenden Ports auf beiden Load Balancern öffnen.

system-config-firewall-tui

Setze HTTP & HTTPS als vertrauenswürdigen Dienst und gib das heartbeat-port (694 udp) in das Feld „Andere Ports“ ein, wie unten gezeigt wird. Speichere danach die Einstellungen.

Das könnte dich auch interessieren …