Ein UDP-Load-Balancer-Prototyp mit BCC (XDP/BPF)
usage: sbulb [-h] -vs VIRTUAL_SERVER
(-rs REAL_SERVER [REAL_SERVER ...] | -cfg CONFIG_FILE) -p PORT
[PORT ...] [-d {0,1,2,3,4}]
[-l {CRITICAL,ERROR,WARNING,INFO,DEBUG,TRACE}] [-mp MAX_PORTS]
[-mrs MAX_REALSERVERS] [-ma MAX_ASSOCIATIONS]
ifnet
positional arguments:
ifnet network interface to load balance (e.g. eth0)
optional arguments:
-h, --help show this help message and exit
-vs VIRTUAL_SERVER, --virtual_server VIRTUAL_SERVER
<Required> Virtual server address (e.g. 10.40.0.1)
-rs REAL_SERVER [REAL_SERVER ...], --real_server REAL_SERVER [REAL_SERVER ...]
<Required> Real server address(es) (e.g. 10.40.0.2 10.40.0.3)
-cfg CONFIG_FILE, --config_file CONFIG_FILE
<Required> a path to a file containing real server address(es).
File will be polled each second for modification and configuration
updated dynamically. A file content example :
[Real Servers]
10.0.0.4
10.0.0.2
10.0.0.6
-p PORT [PORT ...], --port PORT [PORT ...]
<Required> UDP port(s) to load balance
-d {0,1,2,3,4}, --debug {0,1,2,3,4}
Use to set bpf verbosity, 0 is minimal. (default: 0)
-l {CRITICAL,ERROR,WARNING,INFO,DEBUG,TRACE}, --loglevel {CRITICAL,ERROR,WARNING,INFO,DEBUG,TRACE}
Use to set logging verbosity. (default: ERROR)
-mp MAX_PORTS, --max_ports MAX_PORTS
Set the maximum number of port to load balance. (default: 16)
-mrs MAX_REALSERVERS, --max_realservers MAX_REALSERVERS
Set the maximum number of real servers. (default: 32)
-ma MAX_ASSOCIATIONS, --max_associations MAX_ASSOCIATIONS
Set the maximum number of associations. (default: 1048576)
This defined the maximum number of foreign peers supported at the same time.
EG: sudo python3 -m sbulb eth0 -vs 10.188.7.99 -rs 10.188.100.163 10.188.100.230 -p 5683 5684
Dieser Lastausgleich kann als Layer-4-NAT-Belastungsbalancer betrachtet werden, da er nur die IP-Adresse modifiziert.
Zum Eindringen von Verkehr:
clientip:port/realserverip Association.Für den Ausstiegsverkehr:
clientip:port/realserverip Association.Wir behalten, dass diese Assoziation so lange wie möglich eine große LRU -Karte ist, was bedeutet, dass die älteste Assoziation nur entfernt wird, wenn die LRU -Karte voll ist und eine neue Assoziation erstellt werden muss.
Der verwendete Algorithmus ist ein einfaches Round-Robin.
In einem Cluster besteht die gute Praxis im Allgemeinen darin, Zustände zwischen den einzelnen Serverinstanzen zu teilen, aber manchmal können einige Staaten nicht geteilt werden ...
ZB eine Cluster von Servern, die die DTLS -Verbindung nicht freigeben können. In diesem Fall möchten Sie Paket immer von einem bestimmten Client an denselben Server senden, um die Anzahl der Handshakes zu begrenzen.
Dazu müssen Sie eine langlebige Assoziation zwischen dem Client und dem Server erstellen, aber der größte Teil des UDP-Lastballers ist eine ephemere-Assoziation. Meistens kann diese Assoziationsdauer konfiguriert werden und Sie können einen großen Wert festlegen. Dank der LRU -Karte können wir die Assoziation so lange wie möglich aufbewahren.
Der andere Punkt ist die Server initiierte Kommunikation . Wir möchten in der Lage sein, die Kommunikation von einem Server genau so zu initiieren, als ob die Kommunikation von einem Client initiiert wurde. Das heißt die gleiche Assoziationstabelle wird verwendet.
Dies ist ein einfacher Ladeballer und hat daher einige Einschränkungen:
Sie brauchen:
SBULB unterstützt den SD_NOTIFY (3) -Mechanismus, erfordert jedoch keine SYSTEMD- oder eine SYSTEMD -Bibliothek. Auf diese Weise kann SBULB Systemd benachrichtigen, wenn es bereit ist, Verbindungen zu akzeptieren. Um diese Funktion zu verwenden, können Sie einen solchen Dienst schreiben:
[Unit]
Description=UDP Load Balancer
Wants=network-online.target
[Service]
Type=notify
NotifyAccess=all
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 -m slulb args...
[Install]
WantedBy=multi-user.target
Sehen Sie sich unsere Wiki -Seite dazu an.
Um Unit -Tests zu starten:
sudo python3 -m unittest # all tests
sudo python3 -m unittest sbulb.tests.IPv4TestCase # only 1 test case
sudo python3 -m unittest sbulb.tests.IPv4TestCase.test_lru # only 1 test
Die Tests benötigen BCC V0.14 (Python3-BPFCC) und SCApy (Python3-Scapy).
Warum XDP/BPF? Warum ersetzt die Kernel -Community Iptables durch BPF?.
Lesen Sie mehr über XDP/BPF: Tauchen Sie in BPF: Eine Liste von Lesematerial.
Inspirationen:
Dokumentationen:
These: