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:
- Mirror Your Web Site With rsync
- Setting Up A Highly Available NFS Server
- How To Set Up A Load-Balanced MySQL Cluster
- How To Set Up Database Replication In MySQL
9 Links
- heartbeat / The High-Availability Linux Project: http://linux-ha.org
- The Linux Virtual Server Project: http://www.linuxvirtualserver.org
- Ultra Monkey: http://www.ultramonkey.org