HTTP लोड बैलेंसिंग लेयर को स्केल करने की कुंजी पहले निचले-स्तर (IP या TCP) लोड बैलेंसिंग की एक और परत जोड़ना है। यह परत पूरी तरह से ओपन-सोर्स सॉफ्टवेयर के साथ बनाई जा सकती है, हालांकि आधुनिक राउटर होने पर आपको बेहतर परिणाम मिलेंगे।
प्रवाह (टीसीपी सत्र) किया जाना चाहिए टुकड़ों में बांटा ऐसे स्रोत / गंतव्य आईपी और TCP पोर्ट के रूप में हेडर का उपयोग, जो दृश्यपटल वे करने के लिए जाने का फैसला करने के लिए। आपको यह सुनिश्चित करने के लिए एक तंत्र की भी आवश्यकता है कि जब एक फ्रंटेंड मर जाता है, तो इसका उपयोग बंद हो जाता है।
विभिन्न रणनीतियाँ हैं, मैं एक ऐसे जोड़े की रूपरेखा तैयार करने जा रहा हूँ जिसका उपयोग मैंने लाखों उपयोगकर्ताओं की सेवा करने वाली साइटों पर किया है, ताकि आप विचार प्राप्त कर सकें। विवरण में सब कुछ समझाना बहुत लंबा होगा लेकिन मुझे आशा है कि यह उत्तर आपको आरंभ करने के लिए पर्याप्त जानकारी / संकेत देगा। इन समाधानों को लागू करने के लिए आपको किसी ऐसे व्यक्ति की आवश्यकता होगी जो वास्तव में नेटवर्किंग के बारे में जानकार हो।
जाहिर है कि मैं यहाँ जो वर्णन कर रहा हूँ, वह अन्य उत्तरों में वर्णित की तुलना में लागू करने के लिए बहुत कठिन है, लेकिन यह वास्तव में अत्याधुनिक है यदि आपके पास बड़े पैमाने पर स्केलेबिलिटी के मुद्दों और 99.9% से अधिक उपलब्धता आवश्यकताओं के साथ एक उच्च तस्करी वाली वेबसाइट है । बशर्ते आपके पास पहले से ही एक नेटवर्क इंजीनियर थोड़ा आदमी ऑनबोर्ड है, यह लोड बैलेंसर उपकरणों की तुलना में सेटअप और रन (दोनों कैपेक्स और ओपेक्स में) कम खर्च करता है, और इसे लगभग बिना किसी अतिरिक्त लागत के बढ़ाया जा सकता है (बनाम एक नया, और भी अधिक खरीदना महंगे उपकरण जब आप अपने वर्तमान मॉडल को आगे बढ़ाते हैं)।
पहली रणनीति: एक फ़ायरवॉल के साथ
संभवतः आपके पास कुछ राउटर हैं, जिन पर आपके आईएसपी अपलिंक जुड़े हुए हैं। आपका ISP 2 लिंक (सक्रिय / निष्क्रिय, VRRP का उपयोग करके) प्रदान करता है। अपने राउटर पर, आप वीआरआरपी का भी उपयोग करते हैं, और आप अपने सार्वजनिक नेटवर्क पर जाने वाले ट्रैफ़िक को फ़ायरवॉल पर ले जाते हैं। फ़ायरवॉल ( FW 1
और FW 2
नीचे) भी सक्रिय / निष्क्रिय हैं और ट्रैफ़िक को फ़िल्टर करेंगे और प्रत्येक फ़्लो को एक स्वस्थ फ्रंटेंड सर्वर (आपके HTTP लोड बैलेंसर्स, FE 1
और FE 2
नीचे) भेजेंगे ।
+ -------------- + + -------------- +
| ISP राउटर A | | ISP राऊटर B |
+ -------------- + + -------------- +
| |
== # ====================== # == (सार्वजनिक नेटवर्क)
| |
+ --------------- + + --------------- +
| आपका राउटर A | | आपका राउटर B |
+ --------------- + + --------------- +
| |
== # ===== # ========== # ===== # == (RFC 1918 निजी नेटवर्क)
| | | |
+ ------ + + ------ + + ------ + + ------ +
| एफडब्ल्यू 1 | | एफए 1 | | एफए 2 | | एफडब्ल्यू 2 |
+ ------ + + ------ + + ------ + + ------ +
लक्ष्य इस तरह एक प्रवाह दिखना है:
- आईएसपी आपके सक्रिय राउटर के लिए आपके आईपी पर जाने वाले ट्रैफ़िक को रूट करता है।
- आपका राउटर एक वीआईपी के ट्रैफ़िक को रूट करता है जो RFC 1918 पते का उपयोग करता है । यह वीआईपी सक्रिय फ़ायरवॉल के स्वामित्व में है, जैसे कि VRRP। आप अपने फ़ायरवॉल की जरूरत के लिए OpenBSD का उपयोग करते हैं, तो आप उपयोग कर सकते हैं कार्प , VRRP / HSRP के लिए एक पेटेंट मुक्त विकल्प।
- आपका फ़ायरवॉल फ़िल्टर लागू करता है (उदाहरण के लिए "केवल 80 / tcp और 443 / tcp इस विशेष आईपी पते पर जा सकता है")।
- आपका फ़ायरवॉल एक राउटर के रूप में भी काम करता है और पैकेट को एक स्वस्थ सीमा तक आगे बढ़ाता है।
- आपका सीमांत TCP कनेक्शन को समाप्त करता है।
अब जादू चरण 4 और 5 में होता है, तो आइए अधिक विवरण में देखें कि वे क्या करते हैं।
आपका फ़ायरवॉल फ्रंटेंड्स ( FE 1
और FE 2
) की सूची को जानता है , और यह उनमें से एक को प्रवाह के एक विशेष पहलू (जैसे स्रोत आईपी और पोर्ट, अन्य हेडर के बीच हैशिंग) के आधार पर चुनेगा। लेकिन यह भी सुनिश्चित करने की आवश्यकता है कि यह एक स्वस्थ सीमा तक यातायात को आगे बढ़ा रहा है, अन्यथा आप ट्रैफ़िक को ब्लैकहोल करेंगे। यदि आप उदाहरण के लिए OpenBSD का उपयोग करते हैं, तो आप उपयोग कर सकते हैं relayd
। क्याrelayd
यह सरल है: यह आपके सभी फ़्रेंड्स (जैसे उन्हें HTTP रिक्वेस्ट भेजकर जांच करता है) को हेल्थ-चेक करता है, और जब भी कोई फ़्रंट स्वस्थ होता है, तो इसे एक टेबल पर जोड़ देता है, जो फ़ायरवॉल किसी दिए गए प्रवाह के पैकेट के अगले हॉप को चुनने के लिए उपयोग करता है । यदि कोई सीमा स्वास्थ्य जांच में विफल रहती है, तो इसे तालिका से हटा दिया जाता है और अब इसे कोई पैकेट नहीं भेजा जाता है। जब एक पैकेट को एक दृश्यपटल के लिए अग्रेषित किया जाता है, तो सभी फ़ायरवॉल पैकेट के गंतव्य मैक पते को स्वैप कर रहा होता है जो कि चयनित दृश्यपटल होता है।
चरण 5 में, उपयोगकर्ता से पैकेट आपके लोड बैलेंसर द्वारा प्राप्त किए जाते हैं (जैसा कि यह वार्निश, नग्नेक्स, या जो भी हो)। इस बिंदु पर, पैकेट अभी भी आपके सार्वजनिक आईपी पते पर नियत है ताकि आपको लूपबैक इंटरफेस पर अपने वीआईपी (ओं) को उर्फ करने की आवश्यकता हो। इसे डीएसआर (डायरेक्ट सर्वर रिटर्न) कहा जाता है , क्योंकि आपके सामने टीसीपी कनेक्शन समाप्त हो जाता है और बीच में फ़ायरवॉल केवल सिम्पलेक्स ट्रैफ़िक (केवल इनकमिंग पैकेट) को देखता है। आपका राउटर आउटगोइंग पैकेट्स को सीधे ISP के राउटर्स तक पहुंचाएगा। यह HTTP ट्रैफ़िक के लिए विशेष रूप से अच्छा है क्योंकि अनुरोध प्रतिक्रियाओं की तुलना में छोटे होते हैं, कभी-कभी ऐसा होता है। बस स्पष्ट होने के लिए: यह एक ओपनबीएसडी विशिष्ट चीज नहीं है और उच्च-ट्रैफ़िक वेबसाइटों में व्यापक रूप से उपयोग किया जाता है।
gotchas:
- अंतिम उपयोगकर्ता सीधे आपके फ्रंटेंड सर्वर से जुड़ेंगे क्योंकि आप DSR का उपयोग करते हैं। शायद यह पहले से ही मामला था, लेकिन अगर यह नहीं था, तो आपको यह सुनिश्चित करने की आवश्यकता है कि वे पर्याप्त रूप से सुरक्षित हैं।
- यदि आप OpenBSD का उपयोग करते हैं, तो सावधान रहें कि कर्नेल सिंगल थ्रेडेड है इसलिए एक एकल सीपीयू कोर का प्रदर्शन फ़ायरवॉल के थ्रूपुट को सीमित करेगा। यह आपके प्रकार के NIC और आपके द्वारा देखे जा रहे पैकेट दर के आधार पर एक समस्या हो सकती है। इस समस्या को हल करने के तरीके हैं (नीचे इस पर अधिक)।
दूसरी रणनीति: बिना फ़ायरवॉल के
यह रणनीति अधिक कुशल है लेकिन सेटअप करने में कठिन है क्योंकि यह आपके पास राउटर की बारीकियों पर अधिक निर्भर करता है। विचार ऊपर के फ़ायरवॉल को बायपास करने का है और राउटर सभी काम करते हैं जो फायरवॉल कर रहे थे।
आपको उन राउटरों की आवश्यकता होगी जो प्रति-पोर्ट L3 / L4 ACLs, BGP और ECMP और नीति आधारित रूटिंग (PBR) का समर्थन करते हैं। केवल हाई-एंड राउटर इन सुविधाओं का समर्थन करते हैं, और उनके पास अक्सर बीजीपी का उपयोग करने के लिए अतिरिक्त लाइसेंस फीस होती है। यह आमतौर पर हार्डवेयर लोड बैलेंसरों की तुलना में अभी भी सस्ता है, और पैमाने पर भी आसान है। इन हाई-एंड राउटर्स के बारे में अच्छी बात यह है कि वे लाइन-रेट (जैसे वे हमेशा लिंक को अधिकतम कर सकते हैं, यहां तक कि 10GbE इंटरफेस पर भी कर सकते हैं, क्योंकि वे सभी निर्णय ASIC द्वारा हार्डवेयर में किए जाते हैं)।
जिन बंदरगाहों पर आपके ISP अपलिंक हैं, उन ACL को लागू करें जो फ़ायरवॉल पर हुआ करते थे (उदाहरण के लिए "केवल 80 / tcp और 443 / tcp इस विशेष IP पते पर जा सकते हैं")। फिर आपके प्रत्येक सामने वाले ने आपके राउटर के साथ बीजीपी सत्र को बनाए रखा है। आप उत्कृष्ट OpenBGPD का उपयोग कर सकते हैं (यदि आपके फ्रंट ओपनबीएसडी पर हैं) या क्वागा । आपका राउटर उन ट्रैफ़िकों को ECMP करेगा जो स्वस्थ हैं (क्योंकि वे अपने बीजीपी सत्रों को बनाए रख रहे हैं)। रूटर PBR का उपयोग करके ट्रैफ़िक को उचित रूप से बाहर निकाल देगा।
शोधन
- फ़ायरवॉल जोड़ी समाधान के साथ, यह अच्छा है यदि आप फायरवॉल पर टीसीपी राज्यों को सिंक्रनाइज़ कर सकते हैं, ताकि जब एक फ़ायरवॉल विफल हो जाए, तो सब कुछ आसानी से दूसरे पर विफल हो जाए। आप इसे हासिल कर सकते हैं
pfsync
।
- यह ध्यान रखें कि
pfsync
आमतौर पर आपके फ़ायरवॉल पर पैकेट दर दोगुनी होगी।
- HTTP एक स्टेटलेस प्रोटोकॉल है, इसलिए यदि आप फायरवॉल फेलओवर के दौरान सभी कनेक्शन को रीसेट नहीं करते हैं तो यह दुनिया का अंत नहीं है क्योंकि आप इसका उपयोग नहीं करते हैं
pfsync
।
- यदि आप एक एकल फ़ायरवॉल को नष्ट कर देते हैं, तो आप अपने ट्रैफ़िक को फ़ायरवॉल की एक से अधिक जोड़ी में रूट करने के लिए अपने राउटर पर ECMP का उपयोग कर सकते हैं।
- यदि आप एक से अधिक जोड़ी फ़ायरवॉल का उपयोग करते हैं, तो आप उन्हें सक्रिय / सक्रिय बना सकते हैं। आप फ़ायरवॉल को रूटर्स के साथ एक बीजीपी सत्र बनाए रखने के द्वारा इसे प्राप्त कर सकते हैं, जैसे कि फ़ायरवॉल के बिना 2 डी डिज़ाइन में एक को बनाए रखने के लिए फ्रंटेंड की आवश्यकता होती है।
नमूना relayd
विन्यास
Https://calomel.org/relayd.html पर HOWTO भी देखें
vip = "1.2.3.4" # आपका सार्वजनिक आईपी पता
# (आप एक से अधिक हो सकते हैं, लेकिन इसकी आवश्यकता नहीं है)
FE1 = "10.1.2.101"
Fe2 = "10.1.2.102"
Fe3 = "10.1.2.103"
fe4 = "10.1.2.104" # आपके सामने कोई भी संख्या हो सकती है।
int_if = "em0"
तालिका <fe> {$ fe1 पुन: प्रयास 2, $ fe2 पुन: प्रयास 2, $ fe3 पुन: प्रयास 2, $ fe4 पुन: प्रयास करें 2}
तालिका <fallback> {127.0.0.1}
पुनर्निर्देशित वेबट्रैफ़िक {
$ vip पोर्ट 80 पर सुनें
सत्र का समय 60
<fe> चेक http "/healthcheck.html" डाइजेस्ट "(healthcheck.html का sha1sum)" इंटरफ़ेस $ int_if
}