Un prototipo de equilibrio de carga UDP usando 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.
Por ejemplo: sudo python3 -m sbulb eth0 -vs 10.188.7.99 -rs 10.188.100.163 10.188.100.230 -p 5683 5684
Este equilibrador de carga puede considerarse como un balancer de carga NAT de capa 4, ya que solo modifica la dirección IP.
Para el tráfico de ingreso:
clientip:port/realserverip Association.Para el tráfico de salida:
clientip:port/realserverip Association.Mantenemos que esta asociación es un gran mapa de LRU el mayor tiempo posible, lo que significa que la asociación más antigua solo se elimina si el mapa LRU está completo y se debe crear una nueva asociación.
El algoritmo utilizado es un simple robín redondo.
En un clúster, generalmente la buena práctica es compartir estados entre cada instancia de servidor, pero en algún momento algunos estados no se pueden compartir ...
Por ejemplo, un clúster de servidores que no pueden compartir la conexión DTLS, en este caso, siempre desea enviar el paquete de un cliente determinado al mismo servidor para limitar el número de apretones de manos.
Para hacer eso, debe crear una asociación de larga duración entre el cliente y el servidor, pero la mayoría del UDP LoadBalancer es siempre que tenga la asociación Ephemere. La mayoría de las veces se puede configurar la vida útil de esta asociación y puede establecer un gran valor, pero aquí gracias al mapa LRU podemos mantener la asociación el mayor tiempo que podamos.
El otro punto es la comunicación iniciada por el servidor . Queremos poder iniciar la comunicación desde un servidor exactamente como si un cliente iniciara la comunicación. Lo que significa que se utiliza la misma tabla de asociación.
Este es un simple balanceador de carga y, por lo tanto, tiene algunas limitaciones:
Necesitas:
SBULB admite el mecanismo SD_NOTIFY (3), pero no requiere que se ejecute Systemd o ninguna biblioteca de Systemd. Esto permite que SBULB notifique a Systemd cuando esté listo para aceptar conexiones. Para usar esta función, puede escribir un servicio como este:
[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
Vea nuestra página Wiki sobre eso.
Para lanzar pruebas unitarias:
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
Las pruebas necesitan BCC V0.14 (Python3-BPFCC) y Scapy (Python3-Scapy).
¿Por qué XDP/BPF? ¿Por qué la comunidad del núcleo está reemplazando iptables con BPF?
Lea sobre XDP/BPF: sumergir en BPF: una lista de material de lectura.
Inspiraciones:
Documentación:
Tesis: