
Linux के लिए XDP/eBPF का उपयोग करने वाला एक क्षैतिज रूप से स्केलेबल Direct Server Return लेयर 4 लोड बैलेंसर
यह README हाल के बदलावों को दर्शाने के लिए अभी अद्यतन किया जा रहा है - कुछ जानकारी वर्तमान कोडबेस को प्रतिबिंबित नहीं कर सकती है। कोड का यह संस्करण अभी उत्पादन-तैयार नहीं है - उत्पादन के लिए v0.2 रिलीज़ का उपयोग करें
Linux के लिए एक क्षैतिज रूप से स्केलेबल Direct Server Return (DSR) लेयर 4 लोड बैलेंसर (L4LB) जो XDP/eBPF का उपयोग करता है।
यदि आपको लगता है कि यह उपयोगी हो सकता है या आपके कोई प्रश्न/सुझाव हैं, तो बेझिझक मुझसे [email protected] पर संपर्क करें या GitHub issue खोलें।
अब IPv6 और लेयर 3 पर वितरण (यानी टनलिंग) का समर्थन करता है! XVS लाइब्रेरी को इन सुविधाओं को शामिल करने के लिए अद्यतन किया गया है, और नेटवर्क नेमस्पेस से हेल्थ चेक चलाने की आवश्यकता को भी समाप्त करता है, जिससे कोड काफी सरल हो जाता है। इससे यह आवश्यकता समाप्त हो जाएगी कि सभी बैकएंड लोड बैलेंसर के साथ एक VLAN साझा करें।
कोड की वर्तमान सीमाओं के कारण प्रति-सेवा आधार पर टनलिंग सक्षम करना समर्थित नहीं है। -tunnel विकल्प का उपयोग करके एक ही योजना (IP-in-IP, GRE, FOU या GUE) के साथ लेयर 3 टनलिंग को वैश्विक रूप से सक्षम किया जा सकता है। आगे चलकर, कोड को अद्यतन किया जाएगा ताकि टनलिंग को सेवा स्तर पर कॉन्फ़िगर किया जा सके।
लेयर 2 लोड बैलेंसिंग का समर्थन जारी रहेगा - परियोजना शुरू करने का प्राथमिक कारण Facebook के Katran लोड बैलेंसर द्वारा लेयर 2 समर्थन की कमी थी।
एक नमूना IPv6/L3 कॉन्फ़िगरेशन फ़ाइल शामिल है - बेहतर दस्तावेज़ीकरण बाद में आएगा।
VC5 एक नेटवर्क लोड बैलेंसर है जिसे पुराने हार्डवेयर उपकरणों के प्रतिस्थापन के रूप में काम करने के लिए डिज़ाइन किया गया है। यह वर्चुअल IP पते (VIP) वाली सेवाओं को बैकएंड ("वास्तविक") सर्वरों के समूहों में वितरित करने की अनुमति देता है। वास्तविक सर्वर स्वयं सेवाएँ चला सकते हैं या सर्वरों की दूसरी परत के लिए प्रॉक्सी के रूप में कार्य कर सकते हैं (जैसे HAProxy लेयर 7 HTTP राउटर/SSL ऑफलोड के रूप में काम करता है जब एप्लिकेशन-लेयर निर्णय लेने की आवश्यकता होती है)। एकमात्र आवश्यकता यह है कि VIP को प्रत्येक वास्तविक सर्वर पर लूपबैक डिवाइस पर कॉन्फ़िगर किया जाना चाहिए, जैसे: ip addr add 192.168.101.1/32 dev lo
सेवाएँ और वास्तविक सर्वर एक कॉन्फ़िगरेशन फ़ाइल में हेल्थ चेक परिभाषाओं के साथ निर्दिष्ट किए जाते हैं। जब बैकएंड सर्वर जाँच पास कर लेते हैं और कोई सेवा प्रदान करने के लिए पर्याप्त सर्वर उपलब्ध होते हैं, तो वर्चुअल IP पते BGP के माध्यम से राउटरों को विज्ञापित किए जाते हैं।
अब लेयर 2 और लेयर 3 दोनों पर ट्रैफ़िक वितरण समर्थित है। लेयर 2 वितरण के लिए आवश्यक है कि वास्तविक सर्वर लोड बैलेंसर के साथ एक VLAN साझा करें; वितरित किए जाने वाले पैकेट को प्राप्त करने पर, लोड बैलेंसर पैकेट में ईथरनेट हार्डवेयर पते अद्यतन करता है ताकि गंतव्य के रूप में वास्तविक सर्वर का MAC पता और स्रोत के रूप में अपना MAC पता उपयोग करे, और उचित इंटरफ़ेस के माध्यम से पैकेट को आगे भेजता है; यदि पैकेट VLAN टैग किए गए हैं तो 802.1Q VLAN ID भी अद्यतन करता है।
लेयर 3 वितरण के लिए पैकेटों को वास्तविक सर्वर IP पर संबोधित एक टनलिंग प्रोटोकॉल में एनकैप्सुलेट करने और एक राउटर के माध्यम से आगे भेजने की आवश्यकता होती है (जब तक कि सर्वर और लोड बैलेंसर एक VLAN साझा नहीं करते)। यदि एनकैप्सुलेट करने पर कोई पैकेट नेटवर्क के अधिकतम ट्रांसमिशन आकार से अधिक हो जाता है, तो स्रोत को उपयुक्त MTU के बारे में सलाह के साथ एक ICMP संदेश भेजा जाता है। बैकएंड सर्वरों को केवल पैकेट डीकैप्सुलेट करने की आवश्यकता होती है - लोड बैलेंसर के साथ द्विदिश टनलिंग आवश्यक नहीं है।
10Gbit/s नेटवर्क इंटरफ़ेस वाला एक सर्वर अधिकांश इंटरनेट ट्रैफ़िक की असममित प्रकृति के कारण 100Gbit/s से अधिक की egress बैंडविड्थ वाली HTTP सेवा का समर्थन करने में सक्षम होना चाहिए। छोटी सेवाओं के लिए, एक या दो साधारण वर्चुअल मशीनें संभवतः कुछ गीगाबिट/सेकंड egress ट्रैफ़िक उत्पन्न करने वाली सेवा को संभाल लेंगी।
यदि एक इंस्टेंस पर्याप्त नहीं है, तो आपके राउटर की ECMP सुविधा का उपयोग करके क्षमता को क्षैतिज रूप से स्केल करने (और अतिरेक प्रदान करने) के लिए अधिक सर्वर जोड़े जा सकते हैं। 802.3ad बॉन्डेड इंटरफ़ेस और 802.1Q VLAN ट्रंकिंग समर्थित है (examples/ निर्देशिका देखें)।
किसी कर्नेल मॉड्यूल या जटिल सेटअप की आवश्यकता नहीं है, हालाँकि सर्वोत्तम प्रदर्शन के लिए XDP नेटिव मोड समर्थन वाले नेटवर्क कार्ड ड्राइवर की अनुशंसा की जाती है (जैसे: mlx4, mlx5, i40e, ixgbe, ixgbevf, nfp, bnxt, thunder, dpaa2, qede)। पूरी सूची XDP प्रोजेक्ट के ड्राइवर समर्थन पृष्ठ पर उपलब्ध है।
सर्वोत्तम परिणामों के लिए आपको irqbalance को अक्षम/अनइंस्टॉल करना चाहिए।
आपको बैलेंसर को देने के लिए एक प्राथमिक IP चुनना होगा। इसका उपयोग BGP राउटर ID के रूप में किया जाता है।
एकल, बिना टैग वाले ईथरनेट इंटरफ़ेस वाले सर्वर पर एक सरल उदाहरण:
apt-get install git make libelf-dev golang-1.20 libyaml-perl libjson-perl ethtool (या आपके डिस्ट्रो का समकक्ष)ln -s /usr/lib/go-1.20/bin/go /usr/local/bin/go (सुनिश्चित करें कि Go बाइनरी आपके PATH में है)git clone https://github.com/davidcoles/vc5.gitcd vc5/cmdcp config.sample.yaml config.yaml (अपनी आवश्यकताओं के अनुसार config.yaml को संपादित करें)make (libbpf लाइब्रेरी को डाउनलोड करता है, बाइनरी और JSON कॉन्फ़िगरेशन फ़ाइल बनाता है)./vc5 10.1.10.100 config.json eth0 (अपने सर्वर के IP पते और ईथरनेट इंटरफ़ेस के अनुसार संशोधित करें)ip addr add 192.168.101.1/32 dev lo)लगभग निश्चित रूप से नवीनतम GitHub रिलीज़ (x86-64 के लिए संकलित) से बाइनरी का उपयोग करना आसान है। यह उत्पादन में परीक्षण किया गया होगा इसलिए विश्वसनीय होना चाहिए। सुनिश्चित करें कि आपका कॉन्फ़िगरेशन इस संस्करण के साथ संगत है, इसके लिए टैग की गई रिलीज़ से config.pl स्क्रिप्ट का उपयोग करें (या, निश्चित रूप से, आप अपनी पसंद के अनुसार अपना स्वयं का JSON कॉन्फ़िगरेशन बना सकते हैं)।
यदि आप YAML कॉन्फ़िगरेशन फ़ाइल को अद्यतन करते हैं और JSON को पुनः उत्पन्न करते हैं (make config.json), तो आप प्रक्रिया को SIGINT (Ctrl-C) या SIGUSR2 भेजकर नए कॉन्फ़िगरेशन को पुनः लोड कर सकते हैं। SIGQUIT (Ctrl-\) या SIGTERM प्रक्रिया को BGP कनेक्शन को सुचारू रूप से बंद करके बाहर निकलने का कारण बनेगा।
LACP बॉन्डेड ईथरनेट डिवाइस के साथ एक अधिक जटिल उदाहरण, जिसमें दो इंटरफ़ेस (मेरे परीक्षण सर्वर पर 10Gbps Intel X520) शामिल हैं, नेटिव XDP ड्राइवर मोड सक्षम और टैग किए गए VLAN के साथ:
config.yaml में vlans प्रविष्टि:
vlans:
10: 10.1.10.0/24
20: 10.1.20.0/24
30: 10.1.30.0/24
कमांड लाइन:
./vc5 -n 10.1.10.100 config.json enp130s0f0 enp130s0f1
बाइनरी आपके VLAN इंटरफ़ेस का पता उन डिवाइसों को देखकर लगाएगा जिनके IP पते कॉन्फ़िगरेशन फ़ाइल में VLAN प्रीफ़िक्स के अंतर्गत आते हैं। यदि आप अलग-अलग बिना टैग वाले फ़िज़िकल इंटरफ़ेस का उपयोग करते हैं, तो यह अब बिना किसी अतिरिक्त कॉन्फ़िगरेशन के पारदर्शी रूप से काम करना चाहिए; बस सभी इंटरफ़ेस को कमांड लाइन पर सूचीबद्ध करें ताकि eBPF कोड उनमें से प्रत्येक में लोड हो सके।
चूँकि कनेक्शन स्थिति प्रति-कोर आधार पर ट्रैक की जाती है (BPF_MAP_TYPE_LRU_PERCPU_HASH), आपको यह सुनिश्चित करना चाहिए कि LACP टोपोलॉजी बदलने पर आपका स्विच एक अलग इंटरफ़ेस चुनने की स्थिति में RSS (Receive Side Scaling) किसी फ़्लो के पैकेटों को लगातार उसी CPU कोर तक रूट करे। irqbalance को अक्षम करें, सुनिश्चित करें कि प्रत्येक इंटरफ़ेस पर चैनल सेटिंग्स समान हों (ethtool -l/-L) और RSS फ़्लो हैश इंडायरेक्शन मेल खाता हो (ethtool -x/-X)।
सेटअप का परीक्षण बैकएंड सर्वरों के एक समूह के लिए एक लंबे समय तक चलने वाला कनेक्शन शुरू करके किया जा सकता है (जैसे iperf का उपयोग -t विकल्प के साथ), फिर कॉन्फ़िगरेशन फ़ाइल में IP पते के बाद तारांकन लगाकर चुने गए बैकएंड को अक्षम करना, यह निर्धारित करना कि लोड बैलेंसर पर कौन सा इंटरफ़ेस फ़्लो प्राप्त कर रहा है (जैसे, watch -d 'cat /proc/interrupts | grep enp130s0f' और तेज़ी से बढ़ते IRQ काउंटर को देखें) और फिर इस इंटरफ़ेस को LACP से बाहर निकालना (ifenslave -d bond0 enp130s0f0)। आपको फ़्लो को दूसरे नेटवर्क इंटरफ़ेस पर स्थानांतरित होते हुए देखना चाहिए, लेकिन फिर भी उसी कोर पर आना चाहिए।
एकाधिक सबनेट में बैकएंड का उपयोग करते समय, सर्वोत्तम प्रदर्शन के लिए आपको यह सुनिश्चित करना चाहिए कि सभी VLAN एक ही ट्रंक इंटरफ़ेस पर टैग किए गए हों (यदि आपके पास एक से अधिक फ़िज़िकल इंटरफ़ेस हैं तो LACP बॉन्डेड), कॉन्फ़िगरेशन फ़ाइल के vlans अनुभाग में subnet/VLAN ID मैपिंग निर्दिष्ट हो।
यदि यह संभव नहीं है (उदाहरण के लिए vSphere पर ट्रंक्ड इंटरफ़ेस बनाना सरल नहीं है), तो आप प्रत्येक सबनेट को एक अलग बिना टैग वाले इंटरफ़ेस पर निर्दिष्ट कर सकते हैं:
./vc5 10.1.10.100 config.json eth0 eth1 eth2
उपयोग में आने वाली अवधारणाओं का एक अच्छा सारांश Patrick Shuff का "Building a Billion User Load Balancer" वार्ता और Nitika Shirokov की Katran वार्ता में चर्चा किया गया है।
एक बुनियादी वेब कंसोल और Prometheus मेट्रिक्स सर्वर शामिल है: 
लॉगिंग के लिए प्रायोगिक Elasticsearch समर्थन (सीधे आपके क्लस्टर में, सिस्टम लॉग को स्क्रेप करने की आवश्यकता नहीं) अब शामिल किया गया है। बैकएंड सर्वरों पर हर प्रोब लॉग किया जाता है, इसलिए यदि कोई सर्वर डाउन हो जाता है, तो आप ठीक से देख सकते हैं कि कौन सी त्रुटि लौटाई गई थी, साथ ही अन्य सभी प्रकार की स्थितियाँ भी। इसके लिए बहुत अधिक परिशोधन और लॉग मापदंडों के अधिक उपयुक्त नामकरण आदि की आवश्यकता होगी (यदि आपके पास कोई जानकारी/सुझाव है तो कृपया संपर्क करें), लेकिन इससे सिस्टम में क्या हो रहा है, इसके बारे में अच्छी जानकारी प्राप्त करने में मदद मिलनी चाहिए - एक उदाहरण के रूप में Kibana डैशबोर्ड बनाने का मेरा बहुत ही अयोग्य पहला प्रयास: 
इसका अधिकांश परीक्षण Icecast बैकएंड सर्वरों के साथ किया गया है, जहाँ क्लाइंट निम्न और उच्च बिटरेट स्ट्रीम (48kbps - 192kbps) का मिश्रण खींच रहे थे।
ऐसा प्रतीत होता है कि XDP जेनेरिक ड्राइवर का उपयोग करने वाला एक VMWare गेस्ट (4 कोर, 8GB) 100K समवर्ती क्लाइंट, लोड बैलेंसर के माध्यम से 380Mbps/700Kpps और बैकएंड से सीधे क्लाइंट तक 8Gbps ट्रैफ़िक का समर्थन करेगा।
एकल (गैर-वर्चुअलाइज़्ड) Intel Xeon Gold 6314U CPU (2.30GHz, 32 फ़िज़िकल कोर, 64 लॉजिकल कोर के लिए हाइपरथ्रेडिंग सक्षम) और Intel 10G 4P X710-T4L-t ईथरनेट कार्ड पर, मैं 2Gbps/3.8Mpps इनग्रेस ट्रैफ़िक और 46.5Gbps egress पर 700K स्ट्रीम चलाने में सक्षम था। सर्वर 90% से अधिक निष्क्रिय (idle) था। दुर्भाग्य से, मेरे पास अधिक क्लाइंट/सर्वर बनाने के लिए संसाधन उपलब्ध नहीं थे।
संचालन के तीन तरीके हैं: सरल (simple), VLAN, और मल्टी-NIC आधारित। सरल मोड में सभी होस्ट लोड बैलेंसर के प्राथमिक पते के समान सबनेट पर होने चाहिए। VLAN मोड में (YAML/JSON कॉन्फ़िगरेशन फ़ाइल के "vlans" अनुभाग के अंतर्गत प्रविष्टियाँ घोषित करके सक्षम), सर्वर प्रविष्टियाँ एक VLAN/CIDR सबनेट प्रविष्टि से मेल खानी चाहिए। VLAN टैग किए गए इंटरफ़ेस को OS में बनाने और सबनेट के भीतर एक IP पता निर्दिष्ट होने की आवश्यकता है। मल्टी-NIC मोड में सबनेट को VLAN की तरह ही ID दी जाती हैं, लेकिन ट्रैफ़िक को उचित रूप से कॉन्फ़िगर किए गए इंटरफ़ेस से बाहर भेजने के लिए bpf_redirect() का उपयोग किया जाता है (VLAN ID बदलने और XDP_TX का उपयोग करने के बजाय)।
VLAN मोड में, लोड बैलेंसर के लिए सभी ट्रैफ़िक एक टैग किए गए VLAN पर होना चाहिए (802.1Q का पुशिंग या पॉपिंग नहीं किया जाता - अभी तक)।