Aus irgendeinem Grund scheint ipvsadm die Verbindungen zwischen meinen realen Servern nicht gleichmäßig zu verteilen, wenn ich die WLC- oder LC-Scheduler verwende. Ein realer Server wird mit Anfragen völlig überlastet, während die anderen relativ wenige Verbindungen erhalten.
Meine ldirectord.cf-Datei sieht folgendermaßen aus:
quiescent = yes
autoreload = yes
checktimeout = 10
checkinterval = 10
# *.example.com http
virtual = 192.0.2.111:http
real = 10.10.10.1:http ipip 10
real = 10.10.10.2:http ipip 10
real = 10.10.10.3:http ipip 10
real = 10.10.10.4:http ipip 10
real = 10.10.10.5:http ipip 10
scheduler = lc
protocol = tcp
service = http
checktype = negotiate
request = "/lb"
receive = "Up and running"
virtualhost = "site.com"
fallback = 127.0.0.1:http
Das Seltsame, was meiner Meinung nach das Problem verursachen könnte (aber ich bin mir nicht wirklich sicher), ist, dass ipvsadm aktive Verbindungen nicht richtig zu verfolgen scheint, sie erscheinen alle als inaktive Verbindungen
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.0.2.111:http lc
-> 10.10.10.1:http Tunnel 10 0 10
-> 10.10.10.2:http Tunnel 10 0 18
-> 10.10.10.3:http Tunnel 10 0 3
-> 10.10.10.4:http Tunnel 10 0 10
-> 10.10.10.5:http Tunnel 10 0 5
Wenn ich ipvsadm -Lnc
das tue, sehe ich viele Verbindungen, aber immer nur in den Zuständen ESTABLISHED und FIN_WAIT.
Ich habe vorher ldirectord auf einem auf Gentoo basierenden Load Balancer verwendet und Activeconn war genau, seit der Umstellung auf Ubuntu 10.4 LTS scheint etwas anders zu sein.
# ipvsadm -v
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
Verfolgt ipvsadm aktive Verbindungen nicht richtig und führt dies dazu, dass die Lastverteilung nicht richtig funktioniert? Wenn ja, wie kann ich es wieder zum Laufen bringen?
Bearbeiten:Es wird noch merkwürdiger, wenn ich cat /proc/net/ip_vs
dann sehe, dass die richtigen Activeconns da sind:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP C000026F:0050 rr
-> 0AB42453:0050 Tunnel 10 1 24
-> 0AB4321D:0050 Tunnel 10 0 23
-> 0AB426B2:0050 Tunnel 10 2 25
-> 0AB4244C:0050 Tunnel 10 2 22
-> 0AB42024:0050 Tunnel 10 2 23
Antwort1
Wenn alle Server die gleiche Anzahl an Verbindungen haben, wird bei lc (least connection) immer eine neue Verbindung zum ersten Server in der Liste hergestellt. Das kann bedeuten, dass bei einer sehr geringen Auslastung und nur ab und zu einer Verbindung diese Verbindung immer zum ersten Host in der Liste geht.
Antwort2
Mein Favorit ist wrr (Weigthed Round Robin). Gehe ich recht in der Annahme, dass Sie den DR-Ansatz (Direct Routing) verwenden?
In diesem Fall erkennt ipvsadm die Verbindung nicht als solche, da die Antwort vom RS (realer Server) direkt an den Client geht – und nicht zurück über den LB.
Antwort3
Gemessen an der Anzahl Ihrer Verbindungen stellt dies für Sie vermutlich kein Problem dar, es kann jedoch zu einer ungleichmäßigen Verteilung mit der geringsten Anzahl an Verbindungen kommen, wenn einer der realen Server langsamer reagiert als die anderen. Er erhält dann pro Zeit weniger neue Verbindungen als die anderen, da sich bei ihm die Anzahl der Verbindungen schneller erhöht.
Antwort4
Davids Befehlsausgaben zeigen, dass er den Tunnelmodus (IPIP) verwendet, der im Allgemeinen als Variante von DR eingerichtet ist. Wir müssten einige Routingtabellen oder Diagramme sehen, um sein Setup besser zu verstehen.
Ich stimme jedoch zu, dass die Verbindungsverfolgung in LVS wahrscheinlich verwirrt ist, da es die TCP-FIN-Pakete nicht sieht.
ipvsadm verfügt über einige Einstellungen, um abgelaufene Verbindungen schneller abzubrechen. Beispielsweise beendet der folgende Befehl inaktive Verbindungen nach einer Stunde:
/sbin/ipvsadm --set 3600 120 300
Die Quelle der Clients sollte doppelt überprüft werden. Das Standardverhalten von LVS besteht darin, dauerhafte Verbindungen über die Client-IP herzustellen. Wenn also ein Stresstest mit wget oder ab von derselben Test-Client-IP aus durchgeführt wird, werden alle Verbindungen an denselben Realserver gesendet.
Haproxyist ein intelligenterer Lastenausgleich, muss aber im Rückpfad der Pakete sitzen, um völlig transparent zu arbeiten.