ต้นแบบโหลดบาลานซ์ 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 เต็มและต้องสร้างความสัมพันธ์ใหม่
อัลกอริทึมที่ใช้เป็น Round-Robin อย่างง่าย
ในคลัสเตอร์โดยทั่วไปการปฏิบัติที่ดีคือการแบ่งปันสถานะระหว่างแต่ละอินสแตนซ์เซิร์ฟเวอร์ แต่บางครั้งไม่สามารถแบ่งปันบางรัฐได้ ...
เช่นคลัสเตอร์ของเซิร์ฟเวอร์ที่ไม่สามารถแชร์การเชื่อมต่อ DTLS ในกรณีนี้คุณต้องการส่งแพ็กเก็ตจากไคลเอนต์ที่กำหนดไปยังเซิร์ฟเวอร์เดียวกันเสมอเพื่อ จำกัด จำนวนการจับมือกัน
ในการทำเช่นนั้นคุณต้องสร้าง ความสัมพันธ์ที่ยาวนาน ระหว่างไคลเอนต์และเซิร์ฟเวอร์ แต่ส่วนใหญ่ของ UDP loadbalancer นั้นมีความสัมพันธ์กับ Ephemere เวลาส่วนใหญ่อายุการเชื่อมโยงนี้สามารถกำหนดค่าได้และคุณสามารถตั้งค่าได้มาก แต่ที่นี่ต้องขอบคุณแผนที่ LRU ที่เราสามารถรักษาความสัมพันธ์ได้นานที่สุดเท่าที่จะทำได้
อีกจุดหนึ่งคือ การสื่อสารที่เริ่มต้นจากเซิร์ฟเวอร์ เราต้องการที่จะสามารถเริ่มต้นการสื่อสารจากเซิร์ฟเวอร์ราวกับว่าการสื่อสารถูกเริ่มต้นโดยไคลเอนต์ หมายถึงตารางการเชื่อมโยงเดียวกันใช้
นี่คือโหลดบัลแลนซ์แบบง่ายและมีข้อ จำกัด บางประการ:
คุณต้องการ:
SBULB รองรับกลไก SD_Notify (3) แต่ไม่จำเป็นต้องใช้ SystemD หรือ SystemD Library ใด ๆ ที่จะเรียกใช้ สิ่งนี้ช่วยให้ 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: รายการวัสดุการอ่าน
แรงบันดาลใจ:
เอกสาร:
วิทยานิพนธ์: