
Ein horizontal skalierbarer Direct-Server-Return-Layer-4-Load-Balancer für Linux mit XDP/eBPF
Diese README wird derzeit aktualisiert, um die jüngsten Änderungen zu berücksichtigen – einige Informationen entsprechen möglicherweise nicht dem aktuellen Codestand. Diese Codeiteration ist noch nicht produktionsreif – für den Produktionseinsatz eine v0.2-Version verwenden
Ein horizontal skalierbarer Layer-4-Lastverteiler (L4LB) mit Direct Server Return (DSR) für Linux mit XDP/eBPF.
Wenn Sie glauben, dass dies nützlich sein könnte, oder Fragen/Anregungen haben, können Sie mich gerne unter [email protected] kontaktieren oder ein GitHub-Issue eröffnen.
Unterstützt jetzt IPv6 und Verteilung auf Schicht 3 (auch Tunneling genannt)! Die XVS-Bibliothek wurde aktualisiert, um diese Funktionen zu enthalten, und macht zudem die Notwendigkeit überflüssig, Health Checks aus einem Network Namespace auszuführen, was den Code erheblich vereinfacht. Dies beendet die Anforderung, dass alle Backends ein VLAN mit dem Lastverteiler teilen.
Aktuelle Codeeinschränkungen bedeuten, dass die Aktivierung von Tunneling
pro Dienst nicht unterstützt wird. Die Verwendung der Option -tunnel ermöglicht
ein global aktiviertes Layer-3-Tunneling mit einem einzigen Schema
(IP-in-IP, GRE, FOU oder GUE). In Zukunft wird der Code aktualisiert,
um Tunneling auf Dienstebene konfigurieren zu können.
Layer-2-Lastverteilung wird weiterhin unterstützt – der Hauptgrund für den Start des Projekts war das Fehlen von Layer-2-Unterstützung beim Lastverteiler von Facebook's Katran.
Eine Beispielkonfigurationsdatei für IPv6/L3 ist enthalten – bessere Dokumentation folgt.
VC5 ist ein Netzwerk-Lastverteiler, der als Ersatz für
legacy Hardware-Appliances entwickelt wurde. Er ermöglicht es, Dienste mit virtuellen
IP-Adressen (VIPs) auf Gruppen von Backend-("echten")
Servern zu verteilen. Echte Server können die Dienste selbst ausführen oder als
Proxys für eine weitere Serverebene fungieren (z. B. HAProxy als Layer-7-
HTTP-Router/SSL-Offload, wenn Entscheidungen auf Anwendungsebene getroffen werden
müssen). Die einzige Anforderung ist, dass VIPs auf einem
Loopback-Gerät auf jedem echten Server konfiguriert werden müssen, z. B.: ip addr add 192.168.101.1/32 dev lo
Dienste und echte Server werden in einer Konfigurationsdatei zusammen mit Health-Check-Definitionen angegeben. Wenn die Backend-Server die Prüfungen bestehen und genügend davon verfügbar sind, um einen Dienst bereitzustellen, werden die virtuellen IP-Adressen über BGP an Router angekündigt.
Die Verteilung von Datenverkehr auf sowohl Schicht 2 als auch Schicht 3 wird jetzt unterstützt. Die Verteilung auf Schicht 2 erfordert, dass echte Server ein VLAN mit dem Lastverteiler teilen; beim Empfang eines zu verteilenden Pakets aktualisiert der Lastverteiler die Ethernet-Hardwareadressen im Paket, um die MAC-Adresse des echten Servers als Ziel und seine eigene MAC-Adresse als Quelle zu verwenden, und leitet das Paket über die entsprechende Schnittstelle weiter, wobei die 802.1Q-VLAN-ID aktualisiert wird, wenn Pakete VLAN-getaggt sind.
Die Verteilung auf Schicht 3 erfordert, dass Pakete in einem Tunnelprotokoll gekapselt werden, das an die IP-Adresse des echten Servers adressiert ist, und über einen Router weitergeleitet wird (sofern Server und Lastverteiler kein VLAN teilen). Wenn ein gekapseltes Paket die maximale Netzwerkübertragungsgröße überschreitet, wird eine ICMP-Nachricht an die Quelle gesendet, mit einem Hinweis auf die geeignete MTU. Backend-Server müssen Pakete nur entkapseln – bidirektionales Tunneling mit Lastverteilern ist nicht erforderlich.
Ein Server mit einer 10-Gbit/s-Netzwerkschnittstelle sollte in der Lage sein, einen HTTP-Dienst mit einer Egress-Bandbreite von über 100 Gbit/s zu unterstützen, aufgrund der asymmetrischen Natur des meisten Internetverkehrs. Für kleinere Dienste dürften ein oder zwei bescheidene virtuelle Maschinen einen Dienst bewältigen, der einige Gigabit/s an Egress-Verkehr erzeugt.
Wenn eine Instanz nicht ausreicht, können weitere Server hinzugefügt werden, um die Kapazität horizontal zu skalieren (und Redundanz zu bieten), mithilfe der ECMP-Funktion Ihres Routers. 802.3ad-gebondete Schnittstellen und 802.1Q-VLAN- Trunking werden unterstützt (siehe Verzeichnis examples/).
Es werden keine Kernelmodule oder komplexen Einrichtungen benötigt, obwohl für beste Leistung ein Netzwerkkartentreiber mit nativer XDP-Modus-Unterstützung empfohlen wird (z. B.: mlx4, mlx5, i40e, ixgbe, ixgbevf, nfp, bnxt, thunder, dpaa2, qede). Eine vollständige Liste ist auf The XDP Project's driver support page verfügbar.
Für beste Ergebnisse sollten Sie irqbalance deaktivieren/deinstallieren.
Sie müssen eine primäre IP auswählen, die Sie dem Balancer übergeben. Diese wird für die BGP-Router-ID verwendet.
Ein einfaches Beispiel auf einem Server mit einer einzelnen, ungetaggten Ethernet-Schnittstelle:
apt-get install git make libelf-dev golang-1.20 libyaml-perl libjson-perl ethtool (oder das Äquivalent Ihrer Distribution)ln -s /usr/lib/go-1.20/bin/go /usr/local/bin/go (stellen Sie sicher, dass sich die Go-Binärdatei in Ihrem PATH befindet)git clone https://github.com/davidcoles/vc5.gitcd vc5/cmdcp config.sample.yaml config.yaml (bearbeiten Sie config.yaml entsprechend Ihren Anforderungen)make (lädt die libbpf-Bibliothek herunter, erstellt die Binärdatei und die JSON-Konfigurationsdatei)./vc5 10.1.10.100 config.json eth0 (passen Sie die IP-Adresse und Ethernet-Schnittstelle Ihres Servers an)ip addr add 192.168.101.1/32 dev lo)