Der Schlüssel zum Skalieren einer HTTP-Lastausgleichsschicht besteht darin, zuerst eine weitere Schicht für den Lastausgleich auf niedrigerer Ebene (IP oder TCP) hinzuzufügen. Diese Schicht kann vollständig mit Open-Source-Software erstellt werden, obwohl Sie mit modernen Routern bessere Ergebnisse erzielen.
Die Flows (TCP-Sitzungen) sollten mithilfe von Headern wie Quell- / Ziel-IP- und TCP-Ports gehasht werden, um zu entscheiden, an welches Frontend sie gehen. Sie benötigen auch einen Mechanismus, der sicherstellt, dass ein Frontend nicht mehr verwendet wird, wenn es abstirbt.
Es gibt verschiedene Strategien. Ich werde ein paar skizzieren, die ich in der Produktion auf Websites für Millionen von Benutzern verwendet habe, damit Sie sich ein Bild machen können. Es wäre zu lang, um alles im Detail zu erklären, aber ich hoffe, diese Antwort gibt Ihnen genug Informationen / Hinweise, um loszulegen. Um diese Lösungen zu implementieren, benötigen Sie jemanden, der sich mit Netzwerken wirklich auskennt.
Zugegeben, was ich hier beschreibe, ist viel schwieriger zu implementieren als das, was in anderen Antworten beschrieben wird, aber dies ist wirklich der Stand der Technik, wenn Sie eine stark frequentierte Website mit großen Skalierbarkeitsproblemen und Verfügbarkeitsanforderungen von über 99,9% haben. . Vorausgesetzt, Sie haben bereits einen Netzwerktechniker an Bord, kostet das Einrichten und Ausführen (sowohl im Capex- als auch im Opex-Modus) weniger als Load-Balancer-Appliances, und es kann fast ohne zusätzliche Kosten weiter skaliert werden (im Vergleich zum Kauf eines neuen, sogar mehr) teures Gerät, wenn Sie aus Ihrem aktuellen Modell herauswachsen).
Erste Strategie: mit einer Firewall
Vermutlich haben Sie ein paar Router, an denen Ihre ISP-Uplinks angeschlossen sind. Ihr ISP bietet 2 Verbindungen (aktiv / passiv, mit VRRP). Auf Ihren Routern verwenden Sie auch VRRP und leiten den Datenverkehr in Ihrem öffentlichen Netzwerk an eine Firewall weiter. Die Firewalls ( FW 1
und FW 2
darunter) sind ebenfalls aktiv / passiv und filtern den Datenverkehr und senden jeden Datenfluss an einen funktionsfähigen Front-End-Server (Ihre HTTP-Load-Balancer FE 1
und FE 2
darunter).
+ -------------- + + -------------- +
| ISP-Router A | | ISP-Router B |
+ -------------- + + -------------- +
| |
== # ====================== (öffentliches Netzwerk)
| |
+ --------------- + + --------------- +
| Ihr Router A | | Ihr Router B |
+ --------------- + + --------------- +
| |
== # ===== # ========= # ===== # == (RFC 1918 privates Netzwerk)
| | | |
+ ------ + + ------ + + ------ + + ------ +
| FW 1 | | FE 1 | | FE 2 | | FW 2 |
+ ------ + + ------ + + ------ + + ------ +
Das Ziel ist es, einen Fluss wie folgt aussehen zu lassen:
- Der ISP leitet den Datenverkehr zu Ihren IP-Adressen an Ihren aktiven Router weiter.
- Ihre Router leiten den Datenverkehr an einen VIP weiter, der eine RFC 1918- Adresse verwendet. Dieser VIP gehört der aktiven Firewall, ähnlich wie VRRP. Wenn Sie OpenBSD für Ihre Firewall-Anforderungen verwenden, können Sie CARP verwenden , eine patentfreie Alternative zu VRRP / HSRP.
- Ihre Firewall wendet den Filter an (z. B. "Nur 80 / TCP und 443 / TCP an diese bestimmte IP-Adresse zulassen").
- Ihre Firewall fungiert auch als Router und leitet die Pakete an ein funktionsfähiges Frontend weiter.
- Ihr Frontend beendet die TCP-Verbindung.
Jetzt geschieht die Zauberei in den Schritten 4 und 5. Sehen wir uns also genauer an, was sie tun.
Ihre Firewall kennt die Liste der Frontends ( FE 1
und FE 2
) und wählt eines davon basierend auf einem bestimmten Aspekt des Datenflusses aus (z. B. durch Hashing der Quell-IP und des Ports unter anderen Headern). Es muss aber auch sichergestellt werden, dass der Datenverkehr an ein funktionsfähiges Frontend weitergeleitet wird, da Sie sonst den Datenverkehr auf ein Schwarzes Loch bringen. Wenn Sie zum Beispiel OpenBSD benutzen, können Sie es benutzen relayd
. Wasrelayd
dies ist ganz einfach: Es überprüft alle Frontends auf Fehlerfreiheit (z. B. indem es ihnen eine HTTP-Prüfanforderung sendet) und fügt sie, wenn ein Frontend fehlerfrei ist, einer Tabelle hinzu, die die Firewall verwendet, um den nächsten Hop der Pakete eines bestimmten Datenflusses auszuwählen . Wenn ein Frontend die Integritätsprüfungen nicht besteht, wird es aus der Tabelle entfernt und es werden keine Pakete mehr an es gesendet. Bei der Weiterleitung eines Pakets an ein Frontend tauscht die Firewall lediglich die Ziel-MAC-Adresse des Pakets gegen die des ausgewählten Frontends aus.
In Schritt 5 werden die Pakete vom Benutzer von Ihrem Load Balancer empfangen (sei es Lack, Nginx oder was auch immer). Zu diesem Zeitpunkt ist das Paket noch an Ihre öffentliche IP-Adresse gerichtet, sodass Sie Ihre VIPs über die Loopback-Schnittstelle aliasisieren müssen. Dies wird als DSR (Direct Server Return) bezeichnet, da Ihre Frontends die TCP-Verbindung beenden und die Firewall dazwischen nur Simplex-Verkehr sieht (nur eingehende Pakete). Ihr Router leitet ausgehende Pakete direkt an die Router des Internetdienstanbieters zurück. Dies ist besonders gut für HTTP-Datenverkehr geeignet, da Anforderungen in der Regel kleiner sind als Antworten, manchmal sogar erheblich. Nur um klar zu sein: Dies ist keine OpenBSD-spezifische Sache und wird häufig auf Websites mit hohem Datenverkehr verwendet.
Fallstricke:
- Endbenutzer stellen eine direkte Verbindung zu Ihren Front-End-Servern her, da Sie DSR verwenden. Vielleicht war es bereits der Fall, aber wenn nicht, müssen Sie sicherstellen, dass sie ausreichend gesichert sind.
- Wenn Sie OpenBSD verwenden, achten Sie darauf, dass der Kernel Single-Threaded ist, damit die Leistung eines einzelnen CPU-Kerns den Durchsatz einer Firewall einschränkt. Dies kann je nach Art der Netzwerkkarte und der angezeigten Paketrate ein Problem sein. Es gibt Möglichkeiten, dieses Problem zu lösen (mehr dazu weiter unten).
Zweite Strategie: ohne Firewall
Diese Strategie ist effizienter, aber schwieriger einzurichten, da sie stärker von den Besonderheiten der von Ihnen verwendeten Router abhängt. Die Idee ist, die Firewall oben zu umgehen und die Router die ganze Arbeit machen zu lassen, die die Firewalls gemacht haben.
Sie benötigen Router, die portspezifische L3 / L4-ACLs, BGP und ECMP sowie Policy Based Routing (PBR) unterstützen. Nur High-End-Router unterstützen diese Funktionen, und für die Verwendung von BGP fallen häufig zusätzliche Lizenzgebühren an. Dies ist in der Regel immer noch billiger als der Hardwarelastausgleich und zudem wesentlich einfacher zu skalieren. Das Gute an diesen High-End-Routern ist, dass sie in der Regel eine Übertragungsrate aufweisen (z. B. können sie die Verbindung auch auf 10-GbE-Schnittstellen immer maximal nutzen, da alle Entscheidungen, die sie treffen, in Hardware von ASICs getroffen werden).
Wenden Sie auf die Ports, auf denen sich Ihre ISP-Uplinks befinden, die ACL an, die sich früher in der Firewall befand (z. B. "Nur 80 / TCP und 443 / TCP auf diese bestimmte IP-Adresse zulassen"). Lassen Sie dann jedes Ihrer Frontends eine BGP-Sitzung mit Ihrem Router aufrechterhalten. Sie können das ausgezeichnete OpenBGPD (wenn Ihre Frontends auf OpenBSD sind) oder Quagga verwenden . Ihr Router prüft den Datenverkehr zu den Frontends, die fehlerfrei sind (da sie ihre BGP-Sitzungen beibehalten). Der Router leitet den Datenverkehr auch mit PBR entsprechend weiter.
Verfeinerungen
- Bei der Firewall-Pair-Lösung ist es hilfreich, wenn Sie die TCP-Zustände über die Firewalls hinweg synchronisieren können, damit beim Ausfall einer Firewall alles reibungslos auf die andere übergeht. Sie erreichen dies mit
pfsync
.
- Beachten Sie, dass
pfsync
sich die Paketrate auf Ihren Firewalls normalerweise verdoppelt.
- HTTP ist ein zustandsloses Protokoll, daher ist es nicht das Ende der Welt, wenn Sie während eines Firewall-Failovers alle Verbindungen zurücksetzen, weil Sie es nicht verwenden
pfsync
.
- Wenn Sie einer einzelnen Firewall entwachsen sind, können Sie ECMP auf Ihrem Router verwenden, um Ihren Datenverkehr an mehr als ein Firewall-Paar weiterzuleiten.
- Wenn Sie mehr als ein Firewall-Paar verwenden, können Sie auch alle aktivieren / deaktivieren. Sie können dies erreichen, indem die Firewalls eine BGP-Sitzung mit den Routern aufrechterhalten, ähnlich wie die Frontends eine Sitzung im 2. Entwurf ohne Firewalls aufrechterhalten müssen.
relayd
Beispielkonfigurations
Siehe auch HOWTO unter https://calomel.org/relayd.html
vip = "1.2.3.4" # Ihre öffentliche IP-Adresse
# (Sie können mehrere haben, müssen es aber nicht)
fe1 = "10.1.2.101"
fe2 = "10.1.2.102"
fe3 = "10.1.2.103"
fe4 = "10.1.2.104" # Sie können beliebig viele Frontends haben.
int_if = "em0"
Tabelle <fe> {$ fe1 Wiederholung 2, $ fe2 Wiederholung 2, $ fe3 Wiederholung 2, $ fe4 Wiederholung 2}
Tabelle <Fallback> {127.0.0.1}
webtraffic umleiten {
lausche auf $ vip port 80
Sitzungs-Timeout 60
route to <fe> check http "/healthcheck.html" digest "(die sha1sum von healthcheck.html)" interface $ int_if
}