Es hängt davon ab, wie das Protokoll und der Anwendungsfall abwägen. Für alles, wo die Anzahl der Verbindungen mit der Last / Nutzung korreliert, ist es besser, sie zu verwenden leastconn
. Aufgrund der Funktionsweise von Netzwerken und Anwendungen ist dies so gut wie immer der Fall, und Sie sollten es leastconn
standardmäßig besser verwenden .
RDP / X11-Remote-Desktops / Jump-Hosts
Ein Unternehmen verfügt beispielsweise über einen Pool von Remote-Desktops, mit denen Mitarbeiter eine Verbindung herstellen. Sie möchten, dass die Mitarbeiter gleichmäßig auf die Desktops verteilt werden.
Die Anzahl der aktiven Verbindungen in diesem Anwendungsfall ist ungefähr "wie viele Mitarbeiter diesen Desktop gerade verwenden". Der Host mit den geringsten Verbindungen wird von den wenigsten Mitarbeitern verwendet und ist wahrscheinlich am wenigsten ausgelastet. Verwenden Sie unter diesen Umständen "Leastconn", um die Last gleichmäßig auf die Anzahl der Benutzer zu verteilen.
Ein idealer Load Balancer sollte sich der Remotedesktoplast bewusst sein. Wie viele Benutzer? Wie viele Bewerbungen? Wie viel Speicher und CPU verbraucht? Es gibt kommerzielle Lösungen für Remote-Desktops (Microsoft / Citrix / etc ...), die diese Metriken normalerweise messen, um die Nutzung sehr gut zu verbreiten. HAProxy ist ein einfacher Netzwerklastenausgleich und kann nichts Besseres tun, als Verbindungen mit zu zählen leastconn
.
HTTP / HTTPS
Bei HTTP bedeutet eine aktive Verbindung, dass der Server gerade eine Anforderung verarbeitet. Die Anschlüsse sind direkt proportional zur Last. Sie möchten den Server mit der geringsten Anzahl aktiver Verbindungen auswählen (Anforderungen werden ausgeführt). Verwendung leastconn
für HTTP (S) -Verkehr.
Stellen Sie sich ein Szenario mit zwei HTTP-Servern vor, in dem ein Server Anforderungen langsamer verarbeitet (möglicherweise ist er überlastet, möglicherweise verfügt er über ältere Hardware).
roundrobin
verteilt die Anforderungen zur Hälfte auf die beiden Server. Es ist sehr ineffizient, der schnellere Server sollte mehr brauchen. Schlimmer noch, der langsamere Server könnte überlastet sein, er wird noch langsamer, wenn mehr Anfragen eingehen und jederzeit Anfragen löschen können. Das willst du nicht.
leastconn
würde feststellen, dass die Server uneben sind. Der langsamere Server hält Verbindungen länger und hat eine höhere Verbindungsanzahl. leastconn
berücksichtigt dies und bevorzugt den anderen Server.
Nach meiner Erfahrung, einschließlich Rollen, in denen ich ausschließlich Leistungstests für mittelgroße bis große Websites durchgeführt habe. leastconn
kann 300% so effizient sein wie roundrobin
bei HTTP (S). roundrobin
Verteilt die Verbindung nicht fair und führt bei hoher Last zu Instabilität.
DNS-Anfrage
(Ignorieren wir, dass HAProxy UDP nicht unterstützt und UDP verbindungslos ist).
Ein letztes Beispiel. DNS ist ein einfaches Protokoll. Die Clients senden eine einzelne UDP-Nachricht, um eine Domäne anzufordern, und der DNS-Server antwortet in einer einzelnen Nachricht.
In diesem Fall besteht keine wirkliche Verbindung. Selbst wenn es so wäre, würde es (theoretisch) sofort geschlossen werden.
Unter diesen Umständen wäre es nicht sinnvoll, Verbindungen zu zählen, es ist nicht optimal für leastconn
. Ein einfacher roundrobin
kann Nachrichten verteilen.
Ein häufiges Missverständnis
Menschen glauben manchmal, dass sie nicht leastconn
für kurzlebige Verbindungen verwendet werden sollten (ähnlich wie im letzten Beispiel). Sogar die HAProxy-Dokumentation ist darüber irreführend.
leastconn
Use of this algorithm is recommended where very long sessions are
expected, such as LDAP, SQL, TSE, etc... but is not very well
suited for protocols using short sessions such as HTTP.
[misleading advice, should ignore it]
In der realen Welt short connections
ist das keine Sache.
Anwendungen basieren auf TCP. Nachrichten werden zugestellt und häufig in der richtigen Reihenfolge verarbeitet. Wenn ein Server langsam oder überlastet ist, werden "kurze" Verbindungen länger. Wenn es (mehr) Verbindungen gibt, wird wahrscheinlich (mehr) gearbeitet. Verbindungsanzahl und Verbindungsdauer variieren und haben Bedeutung.
Stellen Sie sich einen einfachen HTTP-Server vor. Einige Assets dauern einige Millisekunden, einige API-Aufrufe dauern einige Sekunden, das Laden einer Seite mit einer beliebigen Anzahl von Anforderungen usw. kann einige Zeit dauern. Anforderungen sind nicht von kurzer Dauer, ihre Lebensdauer hängt davon ab, was auf welchem Server verarbeitet wird. leastconn
versteht die laufenden Aktivitäten und passt die Verteilung an, genau das, was Sie von einem Load Balancer erwarten.