2011-10-05 20 views
23

से एडब्ल्यूएस उदाहरणों को गहराई से बंद या निकालने के लिए मेरे पास ट्रैफ़िक वितरित करने के लिए अमेज़ॅन में चल रहे सर्वर इंस्टेंस का क्लाउड है। अब मैं ब्राउज़र के पक्ष में कनेक्शन त्रुटियों के बिना, नेटवर्क को गहराई से स्केल करने का एक अच्छा तरीका ढूंढ रहा हूं।ईएलबी समूह

जहां तक ​​मुझे पता है, लोड बैलेंसर से हटाए जाने पर किसी इंस्टेंस के किसी भी कनेक्शन को कड़ाई से समाप्त कर दिया जाएगा।

मैं अपने उदाहरण को सूचित करने का एक तरीका चाहूंगा कि इसे बंद करने से एक मिनट पहले या लोड बैलेंसर मरने वाले उदाहरण में यातायात भेजना बंद कर दे, लेकिन इसके मौजूदा कनेक्शन को समाप्त किए बिना।

मेरा ऐप node.js उबंटू पर चल रहा है। मेरे पास कुछ विशेष सॉफ्टवेयर भी चल रहा है, इसलिए मैं कई पीएएएस नोड.जेएस होस्टिंग की पेशकश नहीं करना पसंद करता हूं।

किसी भी संकेत के लिए धन्यवाद।

+0

क्या आप उपयोगकर्ता सत्रों को बनाए रखने के लिए ईएलबी का उपयोग कर रहे हैं जो केवल विशिष्ट ईसी 2 उदाहरणों पर मान्य हैं? और यदि हां, तो ये सत्र कितने समय तक चलते हैं? –

+0

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

+6

ईएलबी के बारे में धागा एक उदाहरण हटा दिए जाने पर लाइव कनेक्शन को कमजोर छोड़ देता है: https://forums.aws.amazon.com/thread.jspa?threadID=61278 अमेज़ॅन ने फीडबैक के लिए कहा, इसलिए फिक्सिंग के लिए अपना +1 जोड़ने के लिए स्वतंत्र महसूस करें इस। –

उत्तर

16

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

प्रक्रिया अवलोकन

निम्नलिखित तर्क लपेटा जा सकता है और समय नोड शट डाउन होने की जरूरत है पर चलाते हैं।

  1. ब्लॉक नया HTTP nodeX के लिए कनेक्शन लेकिन मौजूदा कनेक्शन मौजूदा कनेक्शन के निकास के लिए, या तो अपने आवेदन करने के लिए मौजूदा कनेक्शन की निगरानी के द्वारा या समय की एक "सुरक्षित" राशि के लिए अनुमति देकर
  2. प्रतीक्षा अनुमति देने के लिए जारी है।
  3. ईसी 2 एपीआई सीधे या सारणीबद्ध स्क्रिप्ट का उपयोग करके नोडेक्स ईसी 2 इंस्टेंस पर शट डाउन शुरू करें।

आपके आवेदन के अनुसार "सुरक्षित", जो कुछ अनुप्रयोगों के लिए निर्धारित करना संभव नहीं हो सकता है।

अनुमान की जरूरत है कि

हम जानते हैं कि ईएलबी removes unhealthy instances from it's pool मैं इस सुंदर होने की अपेक्षा करेंगे परीक्षण किया जाना है, ताकि:

  1. हाल ही में बंद बंदरगाह के लिए एक नया कनेक्शन शान से पुनः निर्देशित किया जाएगा पूल में अगले नोड में
  2. जब कोई नोड खराब चिह्नित होता है, तो उस नोड के पहले से स्थापित कनेक्शन अप्रभावित होते हैं।

संभव परीक्षण मामलों: ईएलबी पर

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

1. HTTP कनेक्शन

nodeX पर एक स्थानीय फ़ायरवॉल नए सत्र ब्लॉक लेकिन स्थापित सत्र अनुमति देने के लिए जारी रखने के लिए उपयोग ब्लॉक करने के लिए कैसे।

उदाहरण आईपी तालिकाओं के लिए:

iptables -A INPUT -j DROP -p tcp --syn --destination-port <web service port> 
+0

विचारों के लिए धन्यवाद! दुर्भाग्यवश, धारणा संख्या 2 महत्वपूर्ण है जो गायब है। जहां तक ​​मुझे पता है, बीमार के रूप में पता लगाने के बाद 40-60 सेकेंड में कोई नोड मौजूद नहीं है, बिना गारंटी के।लेकिन अफसोस की बात है, ईएलबी से किसी भी चेतावनी के बिना इसे तुरंत हटा दिया जा रहा है और किसी मौजूदा कनेक्शन को समाप्त कर दिया गया है और किसी अन्य नोड को अग्रेषित नहीं किया गया है। यह मुझे पता है, लेकिन मैं इसके साथ प्रयोग करने की कोशिश कर सकता हूं ... –

+0

यह अच्छा है कि यह इसे नीचे के रूप में पहचानता है और इसे हटा देता है, यही वही है जो हम चाहते हैं। लेकिन मौजूदा कनेक्शन को हटाने से हमें निश्चित रूप से समस्याएं मिलेंगी, मैं परीक्षण के बिना इसे बाहर नहीं करूँगा क्योंकि मैंने अन्य लोडबेलिंग सॉफ्टवेयर को इस तरह से काम किया है ... अन्यथा, क्या आप लोड बैलेंसर के साथ उप डोमेन का उपयोग करने में सक्षम हैं कि यह केवल प्रारंभिक कनेक्शन स्थापित करता है? जैसे balance.domain.com nodeX.domain.com पर जाता है? जहां नोडएक्स एक राउंड-रॉबिन पूल आदि में अगला है। –

+0

ईएलबी स्वयं उप-डोमेन का उपयोग करने का समर्थन नहीं करता है - लेकिन एक मशीन अपने नाम के बारे में जान सकती है। मैं डीएनएस प्रविष्टियों के माध्यम से डोमेन नामों में मैप किए गए मशीनों का एक सेट भी रख सकता था - हालांकि यह नहीं जानता कि इसे स्वचालित रूप से कैसे किया जाए। चूंकि मैं चलने वाले उदाहरणों के लिए अधिकांश धन का भुगतान करता हूं, और रोके गए उदाहरण बहुत सस्ते हैं, यह एक विकल्प हो सकता है। इसलिए मैं प्रारंभिक वितरण के लिए ईएलबी का उपयोग करता हूं, और तब से उस नोड का उपयोग कर सकता हूं जिसे उपयोगकर्ता को असाइन किया गया है। यह काम कर सकता है! एडब्ल्यूएस मशीन यूआरएल के बजाय सबडोमेन का सबसे अच्छा उपयोग करने के बारे में कोई विचार? (मैं एक डोमेन के लिए वाइल्डकार्ड-एसएसएल का उपयोग करना चाहता हूं)। –

7

अपने ईएलबी से यातायात के वितरण के लिए सुझाया गया तरीका एकाधिक उपलब्धता क्षेत्रों में उदाहरणों की संख्या बराबर है। उदाहरण के लिए:

ईएलबी

  • उदाहरण 1 (हमें पूर्व-एक)
  • उदाहरण 2 (हमें पूर्व-एक)
  • उदाहरण 3 (हमें पूर्व-ख)
  • उदाहरण 4 (हमें पूर्व-ख)

अब ब्याज की दो ईएलबी एपीआई प्रदान की है कि आप प्रोग्राम (या नियंत्रण कक्ष के माध्यम से) उदाहरणों को अलग करने की अनुमति कर रहे हैं:

  1. अपंजीकृत कर एक उदाहरण
  2. एक उपलब्धता क्षेत्र (जो बाद में उस क्षेत्र के भीतर उदाहरणों को निष्क्रिय)

ELB Developer Guide अक्षम एक वर्ग है कि एक उपलब्धता क्षेत्र को निष्क्रिय करने के प्रभावों का वर्णन है। उस खंड में एक नोट विशेष रुचि है:

आपका लोड बैलेंसर हमेशा सभी सक्षम उपलब्धता क्षेत्र में यातायात वितरित करता है। यदि उपलब्धता क्षेत्र में सभी उदाहरण लोड किए गए हैं या अस्वस्थ हैं, तो उपलब्धता क्षेत्र ज़ोन को लोड बैलेंसर के लिए अक्षम कर दिया गया है, उस उपलब्धता क्षेत्र पर भेजे गए सभी अनुरोध अक्षम हो जाएंगे जब तक अक्षमता उपलब्ध नहीं है FofLoadBalancer उस उपलब्धता क्षेत्र के लिए कॉल करता है। संभवतः एक 0 डाउनटाइम अनुभव में जिसके परिणामस्वरूप, जबकि आप में सर्वर पर रखरखाव -

ऊपर टिप्पणी के बारे में क्या दिलचस्प इसका अर्थ यह है कि है कि यदि आप DisableAvailabilityZonesForLoadBalancer फोन, ईएलबी तुरन्त ही उपलब्ध क्षेत्रों के लिए अनुरोध भेजने शुरू कर सकता है है अक्षम उपलब्धता क्षेत्र।

उपरोक्त 'सिद्धांत' को अमेज़ॅन क्लाउड इंजीनियर से विस्तृत परीक्षण या पावती की आवश्यकता है।

+0

वादा करता है लगता है, मैंने इसके बारे में नहीं सोचा था! मैं निश्चित रूप से यह जांच लेंगे! धन्यवाद। –

1

एक चेतावनी है कि मौजूदा जवाब में चर्चा नहीं कर रहा था कि ELBs भी 60 सेकंड TTLs साथ DNS रिकॉर्ड का उपयोग करके कई ईएलबी नोड्स के बीच लोड संतुलन की है (हर एक या अपने उदाहरणों इसे से जुड़े के अधिक होने)।

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

एक और बार ईएलबी एकाधिक आईपी पहनते हैं और एक ही समस्या है, जब एक ही उपलब्धता क्षेत्र में आपके पास एक बड़ी संख्या में उदाहरण हैं जो एक ईएलबी सर्वर को संभालने के लिए बहुत अधिक है। उस मामले में ईएलबी एक और सर्वर भी बनाएगा और 60 सेकंड टीटीएल के साथ एक रिकॉर्ड की सूची में अपना आईपी जोड़ देगा।

+0

जैसा कि मैंने इसे समझ लिया है, यह कहा गया है कि यातायात को एक एजेड में घुमाया गया है (बिना किसी डीएनएस के कारण) कोई स्वस्थ उदाहरण ईएलबी द्वारा एजेड में भेजा जाएगा जिसमें स्वस्थ उदाहरण हैं। आप विभिन्न एजेड में 2 उदाहरण स्थापित करके, एक बंद कर सकते हैं, फिर एजेड को बंद करने के लिए ईएलबी आईपी पर यातायात को मजबूर कर सकते हैं और देख सकते हैं कि यह अभी भी स्वस्थ प्रतिक्रिया प्रदान करता है या नहीं। –

4

लगता है जैसे वहाँ पहले से ही प्रतिक्रियाओं के एक नंबर यहाँ किया गया है और उनमें से कुछ अच्छी सलाह है। लेकिन मुझे लगता है कि सामान्य रूप से आपका डिजाइन त्रुटिपूर्ण है। कोई फर्क नहीं पड़ता कि आप अपनी शटडाउन प्रक्रिया को कितना सही तरीके से डिज़ाइन करते हैं ताकि यह सुनिश्चित किया जा सके कि एक सर्वर को बंद करने से पहले क्लाइंट कनेक्शन बंद हो गया है जो आप अभी भी कमजोर हैं।

  1. सर्वर शक्ति खो सकता है।
  2. हार्डवेयर विफलता सर्वर विफल होने का कारण बनती है।
  3. कनेक्शन एक नेटवर्क समस्या द्वारा बंद कर दिया जा सकता है।
  4. ग्राहक इंटरनेट या वाईफ़ाई खो देता है।

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

+2

आप सही हैं, ऐसे कई परिदृश्य हैं जो कनेक्शन के तत्काल नुकसान का कारण बन सकते हैं, लेकिन मुझे लगता है कि यह डिग्री का सवाल है। ऑटो स्केलिंग को आम जगह बनाने के लिए डिज़ाइन किया गया है; उदाहरणों को बिल पर बिल किया जाता है, इसलिए आप हर घंटे ऊपर या नीचे स्केल कर सकते हैं ... यह बहुत सारे खोए गए कनेक्शन हैं। – Stephen

15

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यह ध्यान दिया जाना चाहिए कि अमेज़ॅन ने हाल ही में connection draining के लिए समर्थन जोड़ा है, जिसका अर्थ है कि जब लोडबैंसर से एक उदाहरण हटा दिया जाता है, तो उदाहरण उदाहरण से पहले प्रगति पर पूरा हो जाएगा loadbalancer से हटा दिया गया था। हटाए गए उदाहरण के लिए कोई नया अनुरोध नहीं भेजा जाएगा। आप इन अनुरोधों के लिए टाइमआउट भी प्रदान कर सकते हैं, जिसका अर्थ है कि टाइमआउट विंडो से अधिक समय तक चलने वाले किसी भी अनुरोध को समाप्त कर दिया जाएगा।

इस व्यवहार को सक्षम करने के लिए, अपने लोडबैंसर के Instances टैब पर जाएं और Connection Draining व्यवहार बदलें।

2

मैं अपने कम प्रतिष्ठा के कारण टिप्पणी नहीं कर सकता। यहां कुछ स्निपेट हैं जिन्हें मैंने तैयार किया है जो किसी के लिए बहुत उपयोगी हो सकता है। कनेक्शन के एक उदाहरण को निकालने के दौरान यह aws cli टूल का उपयोग करता है।

आप एक ईएलबी के पीछे प्रदान की अजगर सर्वर के साथ एक EC2-उदाहरण की जरूरत है।

from flask import Flask 
import time 

app = Flask(__name__) 

@app.route("/") 
def index(): 
    return "ok\n" 

@app.route("/wait/<int:secs>") 
def wait(secs): 
    time.sleep(secs) 
    return str(secs) + "\n" 

if __name__ == "__main__": 
    app.run(
     host='0.0.0.0', 
     debug=True) 

फिर स्थानीय वर्कस्टेशन से ईएलबी की ओर निम्नलिखित स्क्रिप्ट चलाएं।

#!/bin/bash 

which jq >> /dev/null || { 
    echo "Get jq from http://stedolan.github.com/jq" 
} 

# Fill in following vars 
lbname="ELBNAME" 
lburl="http://ELBURL.REGION.elb.amazonaws.com/wait/30" 
instanceid="i-XXXXXXX" 

getState() { 
    aws elb describe-instance-health \ 
     --load-balancer-name $lbname \ 
     --instance $instanceid | jq '.InstanceStates[0].State' -r 
} 

register() { 
    aws elb register-instances-with-load-balancer \ 
     --load-balancer-name $lbname \ 
     --instance $instanceid | jq . 
} 

deregister() { 
    aws elb deregister-instances-from-load-balancer \ 
     --load-balancer-name $lbname \ 
     --instance $instanceid | jq . 
} 

waitUntil() { 
    echo -n "Wait until state is $1" 
    while [ "$(getState)" != "$1" ]; do 
     echo -n "." 
     sleep 1 
    done 
    echo 
} 

# Actual Dance 
# Make sure instance is registered. Check latency until node is deregistered 

if [ "$(getState)" == "OutOfService" ]; then 
    register >> /dev/null 
fi 

waitUntil "InService" 

curl $lburl & 
sleep 1 

deregister >> /dev/null 

waitUntil "OutOfService" 
+0

देखें http://docs.aws.amazon.com/autoscaling/latest/userguide/as-enter-exit-standby.html#standby-instance-health-status - मुझे लगता है कि इसमें एक बेहतर दृष्टिकोण है और जल्दी होना चाहिए। जैसा कि मैं इसे समझता हूं, उपर्युक्त दृष्टिकोण शायद ऑटोस्केलिंग समूह को एक नया नोड बना देगा क्योंकि आप अपडेट करने के लिए एक पंजीकरण कर सकते हैं ... –