BCC (XDP/BPF)를 사용한 UDP로드-밸런서 프로토 타입
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
이로드 밸런서는 IP 주소 만 수정하기 때문에 레이어 -4 NAT로드-발란 체로 간주 될 수 있습니다.
수입 교통 :
clientip:port/realserverip Association이 있는지 검색합니다.추방 트래픽의 경우 :
clientip:port/realserverip Association이 있는지 검색합니다.우리는이 연관성이 가능한 한 큰 LRU지도를 유지합니다. 즉, LRU지도가 가득 차 있고 새로운 연관성이 만들어 져야하는 경우에만 가장 오래된 연관성이 제거됩니다.
사용 된 알고리즘은 간단한 라운드 로빈입니다.
클러스터에서 일반적으로 모범 사례는 각 서버 인스턴스간에 상태를 공유하는 것이지만 때때로 일부 상태는 공유 할 수 없습니다 ...
예를 들어 DTLS 연결을 공유 할 수없는 서버 클러스터.이 경우 주어진 클라이언트에서 동일한 서버로 패킷을 보내어 핸드 셰이크 수를 제한하려고합니다.
그렇게하려면 클라이언트와 서버간에 오래 지속되는 연관성을 만들어야하지만 대부분의 UDP Loadbalancer는 Ephemere 연관성을 갖는 것이 좋습니다. 대부분의 경우이 협회 수명을 구성 할 수 있으며 큰 값을 설정할 수 있지만 LRU지도 덕분에 가능한 한 오랫동안 연관성을 유지할 수 있습니다.
다른 요점은 서버 시작 통신 입니다. 클라이언트가 통신을 시작한 것처럼 서버에서 통신을 시작할 수 있기를 원합니다. 동일한 연관성 테이블이 사용됩니다.
이것은 간단한 하중 밸런서이므로 몇 가지 제한 사항이 있습니다.
필요 :
SBULB는 SD_Notify (3) 메커니즘을 지원하지만 SystemD 또는 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
그것에 대해 Wiki 페이지를 참조하십시오.
단위 테스트를 시작하려면 :
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 : 독서 자료 목록으로 다이빙하십시오.
영감 :
문서 :
논문 :