
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