Wie man ein hochverfügbares Apache Cluster (inkl. Loadbalancer) aufsetzt

loadb1/loadb2:

vi /etc/ha.d/ldirectord.cf

checktimeout=10
checkinterval=2
autoreload=no
logfile="local0"
quiescent=yes

virtual=192.168.0.105:80
        real=192.168.0.101:80 gate
        real=192.168.0.102:80 gate
        fallback=127.0.0.1:80 gate
        service=http
        request="ldirector.html"
        receive="Test Page"
        scheduler=rr
        protocol=tcp
        checktype=negotiate

In die virtual= Zeile fügen wir unsere virtuelle IP Adresse (192.168.0.105 in diesem Beispiel) ein und in den real= Zeilen listen wir die IP Adressen unserer Apache Systeme (192.168.0.101 und 192.168.0.102 in diesem Beispiel) auf. In der request= Zeile listen wir den Namen einer Datei auf  webserver1 und webserver2 auf, die ldirectord wiederholt anfragen wird um herauszufinden, ob  webserver1 und webserver2 noch da sind. Diese Datei (die wir später erstellen werden) muss die Zeichenfolge, die in der receive= Zeile aufgelistet ist, beinhalten.

Danach erstellen wir die System Startup Links für heartbeat und entfernen diese von ldirectord da ldirectord vom  heartbeat Daemon gestartet wird:

loadb1/loadb2:

update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 .
update-rc.d -f ldirectord remove

Schließlich starten wir heartbeat (und damit auch ldirectord):

loadb1/loadb2:

/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start

5 Die Load Balancer testen

Lass uns überprüfen, ob beide Load Balancer wie erwartet funktionieren:

loadb1/loadb2:

ip addr sh eth0

Der aktive Load Balancer sollte die virtuelle IP Adresse (192.168.0.105) auflisten:

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:40:18:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.103/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.105/24 brd 192.168.0.255 scope global secondary eth0

Der Hot-standby sollte dies anzeigen:

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:50:e3:3a brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0

loadb1/loadb2:

ldirectord ldirectord.cf status

Ausgabe auf dem aktiven Load Balancer:

ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 1455

Ausgabe auf dem Hot-standby:

ldirectord is stopped for /etc/ha.d/ldirectord.cf

loadb1/loadb2:

ipvsadm -L -n

Ausgabe auf dem aktiven Load Balancer:

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.105:80 rr
  -> 192.168.0.101:80             Route   0      0          0
  -> 192.168.0.102:80             Route   0      0          0
  -> 127.0.0.1:80                 Local   1      0          0

Ausgabe auf dem Hot-standby:

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

loadb1/loadb2:

/etc/ha.d/resource.d/LVSSyncDaemonSwap master status

Ausgabe auf dem aktiven Load Balancer:

master running
(ipvs_syncmaster pid: 1591)

Ausgabe auf dem Hot-standby:

master stopped

Wenn Deine Tests gut gelaufen sind, kannst Du nun weiter machen und die beiden Apache Systeme konfigurieren.

6 Konfiguriere die beiden Apache Systeme

Letztendlich müssen wir unsere Apache Cluster Systeme webserver1.example.com und webserver2.example.com konfigurieren, um Anfragen auf der virtuellen IP Adresse 192.168.0.105  zu akzeptieren.

webserver1/webserver2:

apt-get install iproute

Füge Folgendes /etc/sysctl.conf hinzu:

webserver1/webserver2:

vi /etc/sysctl.conf

# Enable configuration of arp_ignore option
net.ipv4.conf.all.arp_ignore = 1

# When an arp request is received on eth0, only respond if that address is
# configured on eth0. In particular, do not respond if the address is
# configured on lo
net.ipv4.conf.eth0.arp_ignore = 1

# Ditto for eth1, add for all ARPing interfaces
#net.ipv4.conf.eth1.arp_ignore = 1

# Enable configuration of arp_announce option
net.ipv4.conf.all.arp_announce = 2

# When making an ARP request sent through eth0 Always use an address that
# is configured on eth0 as the source address of the ARP request.  If this
# is not set, and packets are being sent out eth0 for an address that is on
# lo, and an arp request is required, then the address on lo will be used.
# As the source IP address of arp requests is entered into the ARP cache on
# the destination, it has the effect of announcing this address.  This is
# not desirable in this case as adresses on lo on the real-servers should
# be announced only by the linux-director.
net.ipv4.conf.eth0.arp_announce = 2

# Ditto for eth1, add for all ARPing interfaces
#net.ipv4.conf.eth1.arp_announce = 2

Führe dann dies aus:

webserver1/webserver2:

sysctl -p

Füge diesen Bereich für die virtuelle IP Adresse /etc/network/interfaces hinzu:

webserver1/webserver2:

vi /etc/network/interfaces

auto lo:0
iface lo:0 inet static
  address 192.168.0.105
  netmask 255.255.255.255
  pre-up sysctl -p > /dev/null

Führe dann dies aus:

webserver1/webserver2:

ifup lo:0

Zum Schluss müssen wir die Datei ldirector.html erstellen. Diese Datei wird wiederholt von den beiden Load Balancer Systemen angefragt, damit sie sehen können, ob die beiden Apache Systeme noch funktionsfähig sind. Ich gehe davon aus, dass der Dokumenten-Root der Haupt-Webseite von Apache auf webserver1 und webserver2  /var/www ist, daher erstellen wir die Datei /var/www/ldirector.html:

webserver1/webserver2:

vi /var/www/ldirector.html

Test Page

7 Weitere Tests

Nun kannst Du auf die Webseite zugreifen, die von den beiden Apache Systemen gehostet wird indem Du http://192.168.0.105 in Deinem Browser eingibst.

Unterbreche nun Apache entweder auf webserver1 oder webserver2. Du solltest die Webseite dann immer noch auf http://192.168.0.105 sehen können, da der Load Balancer Anfragen an das laufende Apache System leitet. Wenn Du natürlich beide Apaches unterbrichst, wird die Anfrage fehlschlagen.

Gehen wir nun davon aus, dass loadb1 unser aktiver Load Balancer und loadb2 der Hot-standby ist. Unterbrich nun  heartbeat auf loadb1:

loadb1:

/etc/init.d/heartbeat stop

Warte ein paar Sekunden und versuche dann http://192.168.0.105 wieder in Deinem Browser. Du müsstest immer noch Deine Webseite sehen können, da loadb2 nun die aktive Rolle übernommen hat.

Starte heartbeat nun erneut auf loadb1:

loadb1:

/etc/init.d/heartbeat start

loadb2 sollte immer noch die aktive Rolle haben. Wiederhole die Schritte von Kapitel 5 auf loadb1 und loadb2 und Du müsstest die umgekehrten Ergebisse wie zuvor sehen.

Wenn Du auch diese Tests bestanden hast, funktioniert Dein oadbalanced Apache Cluster wie erwartet. Viel Spaß!

8 Zusätzliche Lektüre

Diese Anleitung veranschaulicht, wie man zwei Apache Systeme loadbalanced. Es zeigt nicht, wie man die Dateien im Apache Dokumenten-Root in sync hält oder wie man einen Datenspeicher wie einen NFS Server erstellt, den beide Apache Systeme verwenden können. Sie bietet auch keinen Lösungsweg, wie man seine MySQL Datenbank(en) verwaltet. Du findest Lösungen für diese Probleme hier:

9 Links

Das könnte dich auch interessieren …