Прототип UDP-нагрузки-балансера с использованием 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.
Например: sudo python3 -m sbulb eth0 -vs 10.188.7.99 -rs 10.188.100.163 10.188.100.230 -p 5683 5684
Этот балансировщик нагрузки может рассматриваться как балансир Layer-4 Nat Load Balancer, поскольку он только изменяет IP-адрес.
Для проникновения трафика:
clientip:port/realserverip .Для выходного трафика:
clientip:port/realserverip .Мы сохраняем эту связь, является большой картой LRU как можно дольше, то есть самая старая ассоциация удаляется только в том случае, если карта LRU заполнена, а новая ассоциация должна быть создана.
Используемый алгоритм-это простой круглый робин.
В кластере, как правило, надлежащая практика - делиться состояниями между каждыми экземплярами сервера, но иногда некоторые штаты не могут быть переданы ...
Например, кластер серверов, которые не могут делиться подключением DTLS, в этом случае вы хотите всегда отправлять пакет из данного клиента на тот же сервер, чтобы ограничить количество рукопожатий.
Для этого вам нужно создать долгоживущую связь между клиентом и сервером, но большинство UDP Loadbalancer-это эфемерская ассоциация. Большую часть времени может быть настроена срок службы этой ассоциации, и вы можете установить большое значение, но здесь, благодаря карте LRU, мы можем сохранить ассоциацию как можно дольше.
Другим пунктом является инициативная связь с сервером . Мы хотим иметь возможность инициировать связь с сервера точно так же, как если бы клиент была инициирована. Используется такая таблица ассоциации.
Это простой балансер нагрузки, и он имеет некоторые ограничения:
Вам нужно:
SBULB поддерживает механизм SD_NOTIFY (3), но не требует системы SystemD или какой -либо системной библиотеки для запуска. Это позволяет SBULB уведомлять SystemD, когда он готов принять соединения. Чтобы использовать эту функцию, вы можете написать сервис как это:
[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
Смотрите нашу страницу вики об этом.
Чтобы запустить модульные тесты:
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
Тесты нуждаются в BCC V0.14 (Python3-BPFCC) и Scapy (Python3-Scapy).
Почему XDP/BPF? Почему сообщество ядра заменяет iptables на BPF?.
Прочитайте о XDP/BPF: погрузитесь в BPF: список материалов для чтения.
Вдохновение:
Документации:
Тезис: