क्षैतिज स्केलेबल सॉफ्टवेयर लोड बैलेंसर्स ssl को संतुलित करने का कोई उदाहरण क्यों नहीं?


9

मेरे पास ssl, स्थानीय सत्रों और लोड संतुलन के संबंध में प्रश्नों का एक समूह है, जो परस्पर जुड़े हुए प्रतीत होते हैं, इसलिए मैं इस प्रश्न की लंबाई के लिए अग्रिम में माफी माँगता हूँ।

मेरे पास एक वेबसाइट है जो फ़ाइल-आधारित सत्रों का उपयोग करती है। साइट की प्रकृति यह है कि इसमें से अधिकांश http है, लेकिन कुछ अनुभाग एसएसएल हैं। वर्तमान में, फ़ाइल आधारित सत्रों के कारण, किसी भी ssl अनुरोधों के लिए उसी सर्वर को हिट करने के लिए आवश्यक है जो पिछले HTTP अनुरोधों के समान है।

समय की कमी के कारण, मैं HTTP और एसएसएल ट्रैफ़िक को संतुलित करने के लिए सबसे आसान संभव काम करना चाहता हूं।

चिपचिपा भार संतुलन एल्गोरिदम के लिए 2 विकल्प प्रतीत होते हैं:

  • आईपी ​​आधारित
  • कुकी आधारित

आईपी ​​आधारित समाधान शायद काम करेगा, लेकिन हैशिंग एल्गोरिथ्म संभावित रूप से सर्वर को बदल देगा जब कोई उपयोगकर्ता सर्वर पर जाता है या जोड़ा जाता है जो वर्तमान फ़ाइल-आधारित सत्र सेटअप के साथ अवांछनीय है। मुझे यह भी लगता है कि किसी उपयोगकर्ता के लिए वेबसाइट ब्राउज़ करते समय ips को वैध रूप से बदलना संभव है।

कुकी आधारित एल्गोरिथ्म बेहतर लगता है, लेकिन एसएसएल द्वारा एन्क्रिप्ट किए जाने पर कुकी का निरीक्षण करने में असमर्थता अपनी समस्याओं को प्रस्तुत करती है।

मैं शेष ssl को लोड करने के तरीके के उदाहरणों के लिए गुगली कर रहा हूं, और मुझे सेटअप के कोई स्पष्ट उदाहरण नहीं मिल सकते हैं जो कुकी आधारित लोड संतुलन साध सकते हैं और जो एक और ssl डिकोडर जोड़कर बढ़े हुए ssl लोड से निपट सकते हैं।

मैंने जो स्पष्ट उदाहरण देखे हैं उनमें से अधिकांश में ssl डिकोडर (आमतौर पर हार्डवेयर, Apache_mod_ssl, या nginx) ब्राउज़र क्लाइंट और लोड बैलेंसर के बीच बैठा होता है। उदाहरणों में आमतौर पर ऐसा कुछ लगता है ( http://haproxy.1wt.eu/download/1.3/doc/ RGBecture.txt से संशोधित ):

      192.168.1.1 192.168.1.11-192.168.1.14
 ------- + ----------- + ----- + ----- + ----- +
        | | | | |       
     + - + - + + - + - + - + - + - + - + - + - + - + + - + + + + + + + + +    
     | LB1 | | ए | | B | | सी | | डी |    
     + ----- + + --- + + --- + + --- + + --- +    
     Apache 4 सस्ते वेब सर्वर
     mod_ssl
     haproxy 

उपरोक्त उदाहरण में ssl डिकोडिंग भाग एक संभावित अड़चन है जो क्षैतिज रूप से स्केलेबल नहीं है।

मैंने haproxy को देखा है, और ऐसा लगता है कि एक 'मोड tcp' विकल्प है जो कुछ इस तरह की अनुमति देगा, जो आपको कई ssl decoders रखने की अनुमति देगा:

              haproxy
                 |
            -------------
            | |
ssl-decoder-1 ssl-decoder2
            | |
        -------------------
        | | |  
      web1 web2 web3

हालाँकि, इस तरह के एक सेटअप में, ऐसा प्रतीत होता है कि आप क्लाइंट आईपी खो देंगे क्योंकि haproxy ssl को डिकोड नहीं कर रहा है: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -के लिये

मैंने nginx को भी देखा है, और मुझे क्षैतिज रूप से स्केलेबल ssl-decoders का कोई स्पष्ट उदाहरण भी नहीं दिखता है। लोगों को संभावित अड़चन के रूप में nginx होने के कई उदाहरण प्रतीत होते हैं। और कम से कम इस लिंक से लगता है कि nginx के पास haproxy जैसी सेटअप का विकल्प भी नहीं है, जहाँ आप यह कहकर ip खो देंगे कि nginx "पारदर्शी रूप से एक backend को TCP कनेक्शन पास करने का समर्थन नहीं करता है" अपाचे कैसे पास करें एसएसएल ट्रैफिक गर्त नगीनक्स प्रॉक्सी?

प्रशन:

  • बढ़ते ट्रैफ़िक से निपटने के लिए अधिक ssl डिकोडर्स को जोड़ने के सेटअप के अधिक उदाहरण क्यों नहीं प्रतीत होते हैं?
  • क्या यह इसलिए है क्योंकि ssl डिकोडिंग कदम केवल एक सैद्धांतिक अड़चन है, और व्यावहारिक रूप से, एक डिकोडर अनिवार्य रूप से हास्यास्पद यातायात वाली साइटों को छोड़कर पर्याप्त होगा?
  • एक और संभावित समाधान जो दिमाग में आता है, शायद कोई भी ऐसी बढ़ी हुई ssl जरूरतों के साथ एक केंद्रीकृत सत्र स्टोर भी है, इसलिए यह कोई फर्क नहीं पड़ता कि ग्राहक किस वेबवार्ता को अनुक्रमिक अनुरोधों पर हिट करता है। तब आप प्रत्येक वेबसर्वर पर mod_ssl या समकक्ष सक्षम कर सकते थे।
  • ऊपर उल्लिखित हाइप्रोक्सी समाधान काम करने लगता है (क्लाइंट आईपी समस्या के अलावा), लेकिन क्या किसी के पास एक चिपचिपा कुकी आधारित सॉफ़्टवेयर लोड बैलेंसर समाधान है जो क्लाइंट आईपी रखते हुए डिकोडरों की संख्या में वृद्धि करके काम करेगा, या यह है कि तकनीकी रूप से नहीं है संभव है (क्योंकि आपको क्लाइंट आईपी प्राप्त करने के लिए अनुरोध को डीकोड करना होगा, जिस स्थिति में, हमारे पास एक डिकोडर अड़चन है)।

यह मानते हुए कि मैंने जो कुछ कहा है वह सच है, ये मेरे विकल्प प्रतीत होते हैं:

  • IP हैशिंग का उपयोग करें (उन उपयोगकर्ताओं के लिए बुरा जो संभावित रूप से ips को बदल देते हैं, और सर्वर को जोड़ने और छोड़ने के परिदृश्य के लिए)
  • nsx या mod_ssl को ssl अनुरोध को छूने वाले 1 प्रोग्राम के रूप में उपयोग करें, यह एक संभावित ssl डिकोडिंग टोंटी होगा
  • ssl रिक्वेस्ट को छूने वाले, क्षैतिज ssl स्केलेबिलिटी को प्राप्त करने वाले 1 प्रोग्राम के रूप में haproxy का उपयोग करें, लेकिन ssl रिक्वेस्ट के लिए वेबसर्वर स्तर पर लॉग किए गए ips के साथ नहीं रहते (शायद अस्थायी रूप से ठीक है)
  • लंबे समय तक, एक मोबाइल या केंद्रीकृत सत्र स्टोर की ओर बढ़ना, जिससे चिपचिपा सत्र अनावश्यक हो जाता है

मुझे लगता है कि womble अनिवार्य रूप से सही है कि सबसे सरल बात एक केंद्रीकृत सत्र स्टोर में स्थानांतरित करना है। संभवतः मैं उनके उत्तर को सही मानूंगा, हालांकि मैं अभी भी किसी भी अन्य यादृच्छिक विचारों में दिलचस्पी रखता हूं।
फुफेरे जफ

जवाबों:


8

"सबसे सरल बात", सभी गंभीरता में, एक केंद्रीकृत सत्र स्टोर में स्थानांतरित करना है। आपको लोड बैलेंसर्स, हप्रोक्सी, एसएसएल और बाकी के सभी प्लंबिंग के साथ सेटअप करना होगा, जब मैंने देखा गया सत्र-हैंडलिंग कोड के प्रत्येक बिट को अलग-अलग स्टोरेज इंजन में प्लग करने के लिए लगभग तुच्छ बना देता है, इसलिए ए कोड के बिट और बहुत, बहुत कम अतिरिक्त जटिलता आपकी सभी समस्याओं को हल करती है।


8

साझा सत्र स्टोर के बारे में वोमबेल सही है जो चीजों को बहुत आसान बना देता है। उनके जवाब के अलावा, मैं प्रश्न के लोड संतुलन वाले भागों पर थोड़ा विस्तार कर सकता हूं:

बढ़ते ट्रैफ़िक से निपटने के लिए अधिक ssl डिकोडर्स को जोड़ने के सेटअप के अधिक उदाहरण क्यों नहीं प्रतीत होते हैं?

आधुनिक मल्टी-कोर पीसी प्रति सेकंड कई हजार एसएसएल लेनदेन कर सकता है । और अगर वह अड़चन बन जाता है तो F5 , Citrix, सिस्को या इस तरह का एक समर्पित उपकरण और भी तेज हो सकता है। इसलिए अधिकांश साइटें कभी भी एक एकल सिंगल-डिवाइस एसएसएल और लोड बैलेंसिंग समाधान को आगे नहीं बढ़ाती हैं।

यह मानते हुए कि मैंने जो कुछ कहा है वह सच है, ये मेरे विकल्प प्रतीत होते हैं:

SSL डिक्रिप्शन को क्षैतिज रूप से स्केल करने के विकल्प हैं, यदि आपको इसकी आवश्यकता है।

सामान्य दृष्टिकोण DNS राउंड रॉबिन का उपयोग अत्यधिक उपलब्ध एसएसएल त्वरक जोड़े के लिए होता है, अर्थात डोमेन के लिए कई आईपी पते प्रकाशित करते हैं, प्रत्येक आईपी पते एसएसएल त्वरक की एक जोड़ी की ओर इशारा करते हैं।

इस मामले में आप एक उपयोगकर्ता सत्र के बीच में DNS TTL टाइमिंग के बारे में चिंता कर सकते हैं, उपयोगकर्ता को किसी अन्य एप्लिकेशन सर्वर से टकरा सकते हैं। यह एक सामान्य घटना नहीं होनी चाहिए, लेकिन ऐसा हो सकता है। एक साझा सत्र स्टोर आम समाधान है, लेकिन इसे अन्य तरीकों से नियंत्रित किया जा सकता है।

एक उदाहरण के रूप में आप एसएसएल डिक्रिप्शन को एप्लिकेशन सर्वर बैलेंसिंग से अलग कर सकते हैं। एसएसएल हैंडलिंग बुनियादी लोड संतुलन की तुलना में अधिक सीपीयू गहन है, इस प्रकार एक लोड लोडर को एसएसएल त्वरक के एक जोड़े को संतृप्त करने में सक्षम होना चाहिए। ऐशे ही:

Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers

जैसा कि शुरुआत में उल्लेख किया गया है, एक साझा सत्र स्टोर कई चीजों को सरल करता है, और निश्चित रूप से आपके एसएसएल / लोड बैलेंसिंग परत में बहुत सारी जटिलता डालने की तुलना में बेहतर दीर्घकालिक समाधान है।


DNS राउंड रॉबिन के लिए +1। उदाहरण के लिए यह AWS इलास्टिक लोड बैलेंसिंग का उपयोग करता है।
एलेक्स

3

जब उत्पादों का विकास हुआ है तो इस तरह के 2 साल पुराने सवालों का जवाब देना मजेदार है। अभी haproxy PROXY प्रोटोकॉल का समर्थन करता है, जो क्लाइंट के IP को अगले TCP तक भी शुद्ध TCP मोड में पास करने की अनुमति देता है। यह मूल SSL का भी समर्थन करता है, साथ ही एसएसएल स्टिकनेस भी यदि आप इसे एसएसएल फार्म के सामने पहली परत के रूप में उपयोग करना चाहते हैं (संभवतः हैप्रोक्सी सर्वर से बनाया गया है)। तो ऐसा लगता है कि आपका अनुरोध समय से थोड़ा आगे था और कार्यान्वयन को पकड़ लिया गया है :-)


1

मैं यहां वोमबल और जेस्पर से सहमत हूं। कोड को ठीक करने के लिए सबसे आसान / सबसे अच्छा मार्ग है। बेशक सिसडीमिन के रूप में हमारे पास अक्सर वह विकल्प नहीं होता है, लेकिन उस मामले में भी पर्याप्त तरकीबें हैं जिनसे आप अपेक्षाकृत सस्ते आधुनिक हार्डवेयर प्राप्त कर सकते हैं, भले ही वे वास्तव में क्षैतिज रूप से बहुत दूर हों।

मैं सिर्फ टिप्पणी करने के लिए पोस्ट करना चाहता था जहां आप क्लाइंट-आईपी को खोने के बारे में चिंतित हैं। किसी भी प्रमुख L7 / प्रॉक्सी समाधान में आप अनुरोध में एक्स-फॉरवर्ड-फॉर (या जो भी आप चाहते हैं) हेडर डाल सकते हैं। उसके बाद बैकएंड वेबसर्वर से अनुरोध प्राप्त करने के लिए आप लॉगफ़ाइल प्रारूप को बदल सकते हैं, उस मूल्य को लॉग में बदल सकते हैं जिस फ़ाइल में वह लेयर 3 क्लाइंट आईपी लॉग करता था। इस तरह से किसी भी लॉग पार्सिंग सॉफ्टवेयर में अंतर नहीं दिखता है (और न ही टेलिंग के दौरान)।

वहाँ सब कुछ के लिए tradeoffs है और हमने आपके सेटअप के बारे में जानने के लिए पर्याप्त नहीं सुना है, लेकिन आपके साथ ha -xy, nginx, और वार्निश की गलत-तिकड़ी के साथ, और वहाँ बाहर वार्निश अपने लोड करने के लिए एक अच्छा विचार है एक छद्म परत उपकरण के लिए। यह आपकी ssl समस्या को हल करने के साथ-साथ आपको कैशिंग, कंटेंट स्विचिंग और हेडर हेरफेर जैसे नए विकल्पों की मेजबानी भी प्रदान करेगा।


1

कुछ यादृच्छिक विचार;)

सबसे पहले, उस व्यक्ति को गोली मार दें जिसने फ़ाइल आधारित सत्र डेटा का उपयोग करने का निर्णय लिया है। ऐसा कोई तरीका नहीं है कि किसी फ़ाइल सिस्टम से डेटा पढ़ना / लिखना आपकी ज़रूरत के डेटा को खींचने के लिए स्रोत पर वापस जाने की तुलना में तेज़ होना है। यह इसके बारे में जाने के काम के तरीके के बारे में है।

मैंने व्यक्तिगत रूप से कभी भी ऐसी स्थिति नहीं देखी है जहां एक सत्र में डेटा संग्रहीत करना डेटाबेस से आवश्यक रूप से सीधे खींचने से बेहतर था। उस ने कहा, मैंने देखा है कि मेमेचे या समान कैशिंग रणनीतियों का उपयोग करने से लाखों उपयोगकर्ताओं को साइट स्केल मिल सकता है, लेकिन सत्रों का उपयोग करने के समान बॉल पार्क में भी नहीं है।

दूसरा, आपको सिर्फ सत्र का उपयोग करने के लिए नंबर एक कारण मिला है: लोड संतुलन। FYI करें - स्टिकी का मतलब अटक नहीं है। यहां तक ​​कि स्टिकी सत्र चालू होने के बाद भी आप उपयोगकर्ता द्वारा अपने ऐप का उपयोग करने के बीच में किसी अन्य सर्वर से दूर जाने की बहुत वास्तविक संभावना को चलाते हैं। यह सबसे inopportune बार में होगा। स्टिकी का मतलब है कि लोड बैलेंसर उपयोगकर्ता को उनके द्वारा शुरू किए गए सर्वर पर वापस धकेलने की कोशिश करेगा , लेकिन यह बिना किसी गारंटी के है।

यह बिंदु आमतौर पर लोगों को डेटाबेस में सत्र को संग्रहीत करने की ओर ले जाता है ... जो मुझे लगता है कि एक पूर्ण विफल है । सत्र के लिए काम करने के लिए इसे लोड करना होगा और प्रत्येक पृष्ठ अनुरोध पर लिखा जाना चाहिए। जब इसे डेटाबेस में संग्रहीत किया जाता है (लोड संतुलित सर्वर के लिए आवश्यक) तो इसके लिए दो सर्वर क्वेरी की आवश्यकता होती है: पहला डेटा प्राप्त करने के लिए, दूसरा किसी भी अपडेट को लिखने के लिए।

असफल हिस्सा यह है कि लोग आमतौर पर सत्रों का उपयोग करते हैं, इसलिए उन्हें उपयोगकर्ताओं के नाम जैसी चीजों को खींचने के लिए डेटाबेस में वापस जाने की ज़रूरत नहीं है ... लेकिन यदि पृष्ठ को सत्र को लोड करने के लिए डेटाबेस को क्वेरी करना है तो ... ठीक है, आपको यहाँ तर्क समस्या देखने में सक्षम होना चाहिए।

केवल यह सत्रों के साथ बदतर है ... क्योंकि वे पृष्ठ प्रोसेसर को पृष्ठ जीवन चक्र के अंत में डेटाबेस में सत्र डेटा वापस लिखना है .. मामले में कुछ भी नहीं बदला है। जिसका अर्थ है कि उस उपयोगकर्ता के नाम को खींचने के लिए एक क्वेरी के बजाय आप दो के साथ समाप्त होते हैं। हर एक पेज लोड के लिए। इसके अलावा इसका मतलब यह है कि डेटा को क्रमबद्ध करना और उसकी जांच करना इसका अपना प्रभाव है।

मेरा कहना है: सत्र बुराई है और आप आमतौर पर इसके बिना बेहतर होते हैं। कम ट्रैफ़िक साइटें जो केवल एक वेब सर्वर पर चलती हैं उन्हें प्रदर्शन को बढ़ावा देने की आवश्यकता नहीं होती है; और एक वेब फ़ार्म पर चलने वाले उच्च ट्रैफ़िक साइट इसके कारण स्केलिंग में सीमित हैं।


0

मोर्चे पर हाप्रोसी का उपयोग करने के बजाय आप राउंड रॉबिन डीएनएस का उपयोग कर सकते हैं कई एसएसएल डिकोडर्स के बीच मोटे संतुलन बनाने के लिए, फिर इसे उचित लोडबैलेंसिंग के लिए हैप्रोक्सी को पास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.