Um protótipo de carga 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 exemplo: sudo python3 -m sbulb eth0 -vs 10.188.7.99 -rs 10.188.100.163 10.188.100.230 -p 5683 5684
Esse balanceador de carga pode ser considerado como um balanceador de carga da camada-4, pois apenas modifica o endereço IP.
Para entrada de tráfego:
clientip:port/realserverip Association.Para o tráfego de saída:
clientip:port/realserverip Association.Mantemos essa associação é um grande mapa da LRU o maior tempo possível, o que significa que a associação mais antiga é removida apenas se o mapa da LRU estiver cheio e a nova associação deverá ser criada.
O algoritmo usado é um simples-robin redondo.
Em um cluster, geralmente a boa prática é compartilhar estados entre as instâncias de cada servidor, mas em algum momento alguns estados não podem ser compartilhados ...
Por exemplo, um cluster de servidores que não podem compartilhar a conexão DTLS, neste caso você deseja sempre enviar o pacote de um determinado cliente para o mesmo servidor para limitar o número de apertos de mão.
Para fazer isso, você precisa criar uma associação de longa duração entre o cliente e o servidor, mas a maior parte do UDP LoadBalancer é a Associação Ephemere. Na maioria das vezes, essa vida útil pode ser configurada e você pode definir um grande valor, mas aqui graças ao mapa da LRU podemos manter a associação o máximo que pudermos.
O outro ponto é a comunicação iniciada pelo servidor . Queremos poder iniciar a comunicação de um servidor exatamente como se a comunicação fosse iniciada por um cliente. Significado A mesma tabela de associação é usada.
Este é um simples balanceador de carga e, portanto, possui algumas limitações:
Você precisa:
O SBULB suporta o mecanismo SD_Notify (3), mas não requer Systemd ou qualquer biblioteca Systemd para executar. Isso permite que o SBULB notifique o SystemD quando estiver pronto para aceitar conexões. Para usar esse recurso, você pode escrever um serviço 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
Veja nossa página do Wiki sobre isso.
Para iniciar testes de unidade:
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
Os testes precisam de BCC v0.14 (Python3-BPFCC) e SCAPY (Python3-Scapy).
Por que xdp/bpf? Por que a comunidade do kernel está substituindo iptables por BPF?.
Leia sobre xdp/bpf: mergulhe no bpf: uma lista de material de leitura.
Inspirações:
Documentações:
Tese: