haproxy: उच्च लोड के तहत मौजूदा सत्रों को बनाए रखें, नए आगमन के लिए '503' की सेवा करें


12

शीर्षक में यह कहने की कोशिश कर रहा है: उच्च लोड के तहत मौजूदा सत्रों को बनाए रखें, और नए आने वाले आगंतुकों को 503-संदेश परोसें।

समस्या: यह काम करता है, लेकिन सत्र लगभग 90 सेकंड से आगे नहीं बढ़ता है।

वर्तमान परिणाम ने मुझे आश्चर्यचकित किया है कि क्या कोई समय-समय पर सेटिंग मुझे याद आ रही है।

उद्देश्य

मैं कोशिश कर रहा हूँ:

  • नए सत्रों के लिए बैकएंड -001 के लिए अनुरोध भेजें जब सीमा पर सत्रों की कुल संख्या एक निश्चित सीमा से नीचे हो।
  • नए सत्र में 503 त्रुटि परोसें जब सीमा पर सत्रों की कुल संख्या उस सीमा से ऊपर हो
  • मौजूदा सत्रों के लिए अनुरोध की अनुमति दें, भले ही सत्रों की संख्या सीमा से अधिक हो

इस तरह, एक बहु-चरणीय फॉर्म भरने के बीच में आने वाले आगंतुक 503-त्रुटि से आश्चर्यचकित नहीं होंगे, और नए आगंतुकों को "कृपया बाद में वापस आने के लिए कहा जा सकता है क्योंकि हम वास्तव में अभी व्यस्त हैं"।

सेट अप

सेटअप निम्नानुसार है:

            {visitors}
                ↓ 
            [haproxy]
                ↓ 
[rails app on unicorn served by nginx]   (right now just one 
                                            backend: 'backend-001')

वर्तमान दृष्टिकोण

उपरोक्त प्राप्त करने के लिए, मैं नीचे कॉन्फ़िगरेशन का उपयोग कर रहा हूं।

यह परीक्षण के लिए है, बहुत कम सीमा के साथ (फ्रंट-एंड पर 10 कनेक्शन (fe_conn gt 10)), परीक्षण को आसान बनाने के लिए।

सर्वर को कुछ लोड के तहत रखने के लिए, मैं निम्नांकित का उपयोग कर रहा हूँ:

कैंटरफ़्फ़ - हॉग - ऑवररेज स्टैन्जिंग.एम्चाइन.ल्ड - यूरी / डू_सोम_थिंग्स - सेस = ५००,१०,३० - २

global
    daemon
    maxconn 10000

defaults
    mode        http
    timeout connect 6s
    timeout client  60s
    timeout server  60s
    balance roundrobin
    option http-server-close

frontend http-in
    bind [PUBLIC_IP]:80

    default_backend backend-001

    acl too_many fe_conn gt 10
    use_backend b_too_many if too_many

backend backend-001
    fullconn 10
    appsession _session_id len 128 timeout 7200s

    cookie SERVERID insert maxidle 7200s
    server Server1 127.0.10.1:80 cookie backend-001 check

backend b_too_many
    errorfile 503 /var/www/50x.html

संकट

जैसा कि ऊपर उल्लेख किया गया है, समस्या यह है: यह लगभग काम करता है, लेकिन सत्र लगभग 90 सेकंड से आगे नहीं बढ़ते हैं।

यदि आप इसके बारे में क्लिक करते रहते हैं, तो आपको अपना सत्र 10 सत्रों में व्यस्त होने के बावजूद भी रखना है।

एक अलग ब्राउज़र उदाहरण के साथ सर्वर पर एक पृष्ठ खोलने की कोशिश करने से आपको 503-त्रुटि मिलती है।

तो, ऐसा लगता है कि मैं लगभग वहाँ हूँ। क्या किसी को इस बात का अंदाजा है कि छोटे सत्र के समय क्या हो सकता है?

और विशेष रूप से मैं इसे कैसे ठीक कर सकता हूं :)

(संपादित करें: 'सर्वर-लाइन से' वज़न 1 अधिकतम 10 'को हटा दिया गया, प्रासंगिक नहीं और भ्रमित हो सकता है) (दूसरे को संपादित करें: फ्रंट-एंड पर '10 सत्रों को ठीक किया' 'फ्रंट-एंड पर '10 कनेक्शनों के लिए')


एक मूर्खतापूर्ण सवाल हो सकता है - क्या nginx में keep_alive सेटिंग है? जाहिर है यह डिफ़ॉल्ट रूप से 75s है - क्या यह मुद्दा हो सकता है?
ऐदन केन

जवाबों:


4

दुर्भाग्य से, आप एप्लिकेशन-स्तरीय सत्रों के साथ पूरी तरह से भ्रमित कनेक्शन प्रतीत होते हैं। साइट पर जाने वाले उपयोगकर्ता के पास एक कुकी हो सकती है जो आपको लगता है कि वह एक कनेक्शन का मालिक है, जबकि यह जरूरी नहीं है। वह वस्तुओं को लाने और पृष्ठों को नेविगेट करने के लिए आवश्यकतानुसार कई कनेक्शन खोल सकता है।

निश्चित रूप से आपके द्वारा देखे जा रहे 90 सेकंड निष्क्रिय कनेक्शन के लिए ब्राउज़र के जीवित रहने का समय है।

आप जो चाहते हैं उसे हासिल करना संभव है, लेकिन यह उससे थोड़ा अधिक जटिल है, क्योंकि आपको यह जानने के लिए दृढ़ता कुकी की उपस्थिति पर भी विचार करना होगा कि आगंतुक नया है या नहीं।

सामान्य तौर पर यह भी अधिक कुशल है कि फ्रंटएंड कनेक्शन काउंट की तुलना में औसत प्रति-सर्वर कनेक्शन काउंट पर भरोसा किया जाए। कारण यह है कि जब कोई सर्वर मर जाता है, तो आपको इस नंबर को फिर से पढ़ना होगा। ऐसा करने का सबसे कुशल तरीका है कि कतार को सक्षम करने के लिए, और avg_queue का उपयोग करने के लिए सर्वर मैक्सकॉन मान सेट करना ताकि यह सीमा सर्वर पर कतारबद्ध अनुरोधों की औसत संख्या पर लागू हो। मौजूदा उपयोगकर्ताओं के कारण लोड बढ़ने पर नए उपयोगकर्ताओं को किसी अन्य बैकएंड पर ले जाने के दौरान यह आपको ज्ञात आगंतुकों को सही ढंग से संभालने की अनुमति देता है।


1
शुक्रिया शुक्रिया! इससे काफी कुछ साफ हो गया। अब मैं इसे (अन्य बातों के अलावा) hdr_sub (इसलिए, "hdr_sub (कुकी) SERVERID = backend-001") के साथ बैकएंड-कुकी की जाँच कर रहा हूँ। जब यह समाप्त हो जाएगा तो मैं एक कार्यशील विन्यास पोस्ट करूँगा।
अपेनूटजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.