Hochverfügbarkeit (vom Linux Virtual Server Projekt)
Wenn mehr und mehr kritische kommerzielle applikationen ihren weg
in das Internet finden, wird das bereitstellen von hochverfügbaren
Diensten zunehmend wichtig. Einer der Vorteile von einem Cluster
System ist das es Hardware und Software Redundanz besitzt.
Hochverfügbarkeit kann bereitgestellt werden durch das aufspüren
von Node oder Daemon Fehlern und die angemessene Rekonfiguration des
Systems so das die Arbeitslast von den verbleibenden Nodes in dem
Cluster übernommen werden kann.
In wirklichkeit ist, hochverfügbarkeit ein sehr weites Feld.
Ein elegantes hoch- verfügbarkeits System hat möglicherweise
ein verlässliches Gruppen Kommunikations sub-system,
Mitgliedschafts Management, "quoram sub-systems",
concurrent control sub-system und so weiter. Da gibt es sehr viel
Arbeit. Wie auch immer, wir können einige existierende Software
benutzen, um nun ein hochverfügbarkeits LVS systems zu bauen. Da
gibt es viele Methoden um ein hochverfügbarkeits LVS System zu
bauen, bitte schreiben Sie mir eine Mitteilung wenn Sie eine elegante
Methode herausgefunden haben. Die folgende zwei Methoden dienen nur
als Referenz.
1. Die mon+heartbeat+fake+coda Lösung
Die Hochverfügbarkeit eines
Virtuellen Servers kann bereitgestellt werden durch Benutzung von
"mon",
"heartbeat" , "fake"
und "coda"
Software. Der "mon" ist ein allgemein benutzbares
Ressourcen Monitor System, welches benutzt werden kann um
Verfügbarkeit von Netzwerk Diensten und Server Nodes zu
monitoren. Der "heartbeat" Code ermöglicht zur Zeit
die heartbeats zwischen zwei Node Computern durch eine serielle
Verbindung und UDP heartbeats. Fake ist IP Übernahme Software
realisiert durch Manipulation der ARP Tabellen(spoofing). Die
Hochverfügbarkeit eines Linux Virtual Servers ist illustriert in
dem folgenden Bild.

Der Server Ausfall wird folgendermaßen abgehandelt: Der
"mon" Daemon läuft auf dem Load Balancer um Service
Daemons und Server Nodes in dem Cluster zu monitoren. Der
fping.monitor ist konfiguriert aufzuspüren ob die Server Nodes
jede t Sekunden noch lebendig sind, und der relative Service Monitor
ist auch dafür konfiguriert die Dienst Daemons auf allen Nodes
jede t Sekunden zu checken. Zum Beispiel, http.monitor kann benutzt
werden um die http Dienste zu checken; ftp.monitor ist für die
ftp Dienste, und so weiter. Ein Alarm wurde geschrieben um eine Regel
in der Tabelle des Linux Virtual Server entfernen/hinzufügen
während geprüft wird ob der Server Node oder Daemon down/up
ist. Deshalb kann der Load Balancer automatisch Dienste Daemons oder
Servers Ausfälle maskieren und sie wieder in den Dienst nehmen,
wenn sie sich wieder zurückgemeldet haben.
Jetzt, wird unser Load Balancer ein einzelner Ausfallpunkt des
gesamtem Systems. Der Auftrag des Maskierens des Ausfalls von dem
primären Load Balancer, müssen wir nun durch das Aufsetzten
eines Backup Load Balancers bewerkstelligen. Die "fake"
Software wird für den Backup Server benutzt um die IP Adresse
des primären Load Balancers zu übernehmen gesetzt den Fall,
das er ausfällt. Und der "heartbeat" Code wird zum
aufspüren des Status des primären Load Balancers benutzt um
"fake" auf den backup Server zu aktivieren/deaktivieren.
Zwei heartbeat Daemons laufen auf dem primären und den Backup,
sie heartbeaten die Mitteilung wie "Ich bin noch lebendig(I'm
alive)" jeder für sich durch die Serielle Leitung
periodisch. Wenn der heartbeatcode Daemon nicht die "Ich bin
noch lebendig(I'm alive)" von dem primären in der
definierten Zeit hören kann, wird die fake Software aktiviert
welche die Virtuelle IP Adresse übernimmt um den Load Balancing
Dienst weiterhin zu ermöglichen. Wenn er die "Ich bin noch
lebendig(I'm alive)" von dem primären später wieder
bekommt deaktiviert er "fake" zur freigabe der Virtuellen
IP Adresse, und der primäre kommt zu seiner eigendlichen Arbeit
zurück.
Wie auch immer, der Ausfall oder die Übernahme des primären
Load Balancers ist die Ursache das die etablierten Verbindungen in
der Hash Tabelle der aktuellen Implementation verloren gehen, welches
daher voraussetzt das Clients ihre Anfragen erneut abschicken müssen.
Coda ist ein Fehler
tolerantes verteiltes Datei System, ein Abkömmling des Andrew
Datei Systems. Der Content der Server kann in Coda abgelegt werden,
so das Dateien hochverfügbar und leicht zu managen sind.
Konfiguations Beispiele
Das folgende ist ein Beispiel einen hochverfügbaren
Virtuellen Webserver über Direct Routing aufzusetzen.
Der Ausfall von Real Servern
Der "mon" wird benutzt um Dienst Daemons und Server Nodes in dem
Cluster zu monitoren. z.B kann der fping.monitor benutzt werden um die Server
Nodes zu monitoren, http.monitor kann benutzt werden um die http Dienste zu
checken, ftp.monitor ist für die ftp Dienste, und so weiter. So, brauchen
wir nur einen Alarm zu generieren um eine Regel in der Virtual Server Tabelle
zu entfernen/hinzuzufügen wenn entdeckt wurde das der Server Node oder
Daemon down/up ist. Hier ist ein Beispiel genannt lvs.alert, welches einen virtuellen
Dienst(IP:Port) und den Dienst Port von Real Servern als Parameter nimmt.
#!/usr/bin/perl
#
# lvs.alert - Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down, or add the server when the service is up.
#
#
use Getopt::Std;
getopts ("s:g:h:t:l:P:V:R:W:F:u");
$ipvsadm = "/sbin/ipvsadm";
$protocol = $opt_P;
$virtual_service = $opt_V;
$remote = $opt_R;
if ($opt_u) {
$weight = $opt_W;
if ($opt_F eq "nat") {
$forwarding = "-m";
} elsif ($opt_F eq "tun") {
$forwarding = "-i";
} else {
$forwarding = "-g";
}
if ($protocol eq "tcp") {
system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");
} else {
system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");
}
} else {
if ($protocol eq "tcp") {
system("$ipvsadm -d -t $virtual_service -r $remote");
} else {
system("$ipvsadm -d -u $virtual_service -r $remote");
}
};
|
|
Der lvs.alert wird abgelegt unter dem /usr/lib/mon/alert.d Ordner. Die mon
Konfigurations Datei (/etc/mon/mon.cf oder /etc/mon.cf) kann folgendermassen
konfiguriert werden um die die http Dienste und Server in dem Cluster zu Monitoren.
#
# The mon.cf file
#
#
# global options
#
cfbasedir = /etc/mon
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 30s
#
# group definitions (hostnames or IP addresses)
#
hostgroup www1 www1.domain.com
hostgroup www2 www2.domain.com
#
# Web server 1
#
watch www1
service http
interval 10s
monitor http.monitor
period wd {Sun-Sat}
alert mail.alert wensong
upalert mail.alert wensong
alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
#
# Web server 2
#
watch www2
service http
interval 10s
monitor http.monitor
period wd {Sun-Sat}
alert mail.alert wensong
upalert mail.alert wensong
alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
|
|
Bedenke, das Du die Parameter für lvs.alert folgendermassen angeben musst
"lvs.alert -V 10.0.0.3:80 -R 192.168.0.3:8080" wenn der Ziel Port verschieden
in LVS/NAT ist.
Nun kann der Load Balancer automatisch Dienst Daemons oder Server
Ausfälle maskieren und sie wieder in den Dienst integrieren wenn
sie sich zurück melden.
Der Ausfall des Load Balancers
Unser Auftrag zu verhindern das der Load Balancer ein einzelner
Ausfallpunkt des gesammten Systems wird, müssen wir ein Backup
des Load Balancers aufsetzen und sie untereinander periodisch
heartbeaten lassen. Bitte lesen Sie das GettingStarted Dokument
welches sich im Heartbeat Packet befindet, es ist sehr einfach ein
2-Node heartbeat System aufzusetzen.
Als ein Beispiel nehmen wir an, das die
zwei Load Balancer die folgenden Adressen haben:
|
lvs1.domain.com (primary)
|
10.0.0.1
|
|
lvs2.domain.com (backup)
|
10.0.0.2
|
|
www.domain.com (VIP)
|
10.0.0.3
|
Nach der Installation des heartbeat bei beiden lvs1.domain.com und lvs2.domain.com,
erstelle einfach die /etc/ha.d/ha.conf folgendermassen:
#
# keepalive: how many seconds between heartbeats
#
keepalive 2
#
# deadtime: seconds-to-declare-host-dead
#
deadtime 10
# hopfudge maximum hop count minus number of nodes in config
hopfudge 1
#
# What UDP port to use for udp or ppp-udp communication?
#
udpport 1001
# What interfaces to heartbeat over?
udp eth0
#
# Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility local0
#
# Tell what machines are in the cluster
# node nodename ... -- must match uname -n
node lvs1.domain.com
node lvs2.domain.com
|
|
Die /etc/ha.d/haresources Datei ist folgendermassen:
lvs1.domain.com 10.0.0.3 lvs mon
|
|
Die /etc/rc.d/init.d/lvs ist folgendermassen:
#!/bin/sh
#
# You probably want to set the path to include
# nothing but local filesystems.
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
IPVSADM=/sbin/ipvsadm
case "$1" in
start)
if [ -x $IPVSADM ]
then
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPVSADM -A -t 10.0.0.3:80
$IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.1 -w 5 -g
$IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.2 -w 5 -g
fi
;;
stop)
if [ -x $IPVSADM ]
then
$IPVSADM -C
fi
;;
*)
echo "Usage: lvs {start|stop}"
exit 1
esac
exit 0
|
|
Zum Schluss, sei Dir sicher, das all die Dateien auf beiden den lvs1 und lvs2
Nodes erstellt worden sind, und ändere sie für deine eigene Konfiguration,
dann starte den heartbeat Daemon auf den beiden Nodes.
Nimm zur Kenntnis das "fake" (IP übernahme durch
Gratuitous Arp) schon in dem heartbeat Paket enthalten ist, so ist es
nicht notwendig "fake" separat aufzusetzen. Wenn der
lvs1.domain.com Node ausfällt, wird der lvs2.domain.com alle die
haresources von dem lvs1.domain.com übernehmen. D.h. übernehmen
der 10.0.0.3 Addresse druch Gratuitous ARP, starten des
/etc/rc.d/init.d/lvs und /etc/rc.d/init.d/mon Skriptes. Wenn die
lvs1.domain.com zurück kommt, gibt der lvs2 die HA resources
wieder frei und der lvs1 nimmt sie zurück.
2. Die ldirectord+heartbeat Lösung
Der ldirectord (Linux Director Daemon) geschrieben von Jacob
Rief ist ein stand-alone Daemon um Dienste von Real Servern zu
monitoren, gegenwärtig http and https Dienste. Er ist einfach zu
installieren und arbeitet mit dem heartbeat
Code. Das ldirectord Program kann unter dem contrib Verzeichnis in
dem ipvs tar ball gefunden werden, oder Du kannst das CVS
Repositorium des heartbeat für die letzte Version checken. Siehe
'perldoc ldirectord' über all die Informationen von ldirectord.
Dank an Jacob Rief für
das Schreiben dieses grossartigen Programms!
Die Vorteile von ldirectord über mon sind folgende:
-
Der ldirectord ist speziell für das LVS
Monitoring geschrieben worden.
Er liest konfigurations Dateien wie /etc/ha.d/xxx.cf, welche alle Informationen
über die Konfiguration der IPVS Routing Tabellen enthalten. Wenn der
ldirectord läuft, wird die IPVS Routing Tabelle passend konfiguriert.
Du kannst auch verschiedene Virtuelle Dienst Konfigurationen in mehreren
konfigurations Dateien anlegen, so das es möglich wird einige Parameter
von einigen Diensten zu modifizieren ohne andere Dienste herunterfahren
zu müssen.
-
Der ldirectored kann leicht durch heartbeat gestarted und gestoppt werden.
Lege den ldirectord unter den /etc/ha.d/resource.d/ Ordner, dann kannst
du folgende Zeile in der /etc/ha.d/haresources Datei anlegen:
node1 IPaddr::10.0.0.3 ldirectord::www ldirectord::mail
|
|
Jedenfalls, der ldirectord kann auch Manuell gestarted gestopped werden.
Du kannst ihn in Deinem LVS cluster auch ohne den Backup Load Balancer benutzen.
Konfigurations Beispiel
Für das beispiel welches in der mon+heartbeat+fake+coda Lösung vorgestellt
wurde, kannst Du die /etc/ha.d/www.cf folgendermassen konfigurieren:
#
# The /etc/ha.d/www.cf for ldirectord
#
# the number of second until a real server is declared dead
timeout = 10
# the number of second between server checks
checkinterval = 10
#
# virtual = x.y.z.w:p
# protocol = tcp|udp
# scheduler = rr|wrr|lc|wlc
# real = x.y.z.w:p gate|masq|ipip [weight]
# ...
#
virtual = 10.0.0.3:80
protocol = tcp
scheduler = wlc
real = 192.168.0.1:80 gate 5
real = 192.168.0.2:80 gate 5
request = "/.testpage"
receive = "test page"
|
|
Die /etc/ha.d/haresources Datei ist folgendermassen einfach:
lvs1.domain.com IPaddr::10.0.0.3 ldirectord::www
|
|
Du musst die .testpage Datei in den the DocumentRoot Verzeichnis von jedem
Webserver anlegen.
echo "test page" > .testpage
|
|
Starte die heartbeat Daemons auf den primären und den backup.
Wenn da irgend etwas schief läuft, kannst Du die /var/log/ha-log
beziehungsweise die /var/log/ldirector.log Datei checken.
Übersetzung durch Stefan M. Dohn Original Text von Wensong
Geschrieben am: 2002/10/15
|