haproxy: ऐप सेशन को किक किए बिना सर्वर मेंटेनेंस कैसे तैयार करें?


13

समस्या

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

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

haproxy व्यवहार

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

क्या आपको लगता है कि यह कुछ हाइप्रोक्सी विन्यास के साथ प्राप्त करने योग्य है? या यह करने के लिए एक चतुर तरीका है?

दूसरा तरीका

इस आवश्यकता को प्राप्त करने के अन्य तरीकों की गैर-विस्तृत सूची:

  • सर्वर के बीच सत्र फ़ाइलों को सिंक्रनाइज़ करें (कई सर्वरों या एक सामान्य एकल माउंटपॉइंट के बीच फ़ाइलों को सिंक्रनाइज़ करने का तरीका)
  • सत्र जानकारी संग्रहीत करने के लिए डेटाबेस का उपयोग करें (एप्लिकेशन व्यवहार को बदलने की आवश्यकता है)

अधिक जानकारी

मैं इस तरह के विन्यास का उपयोग करता हूं:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

यदि मैं SRV1 (haproxy cli कमांड के साथ) को अक्षम करता हूं, तो मुझे लगता है कि SRV1 पर खोले गए सभी एप्लिकेशन सत्र वर्तमान HTTP "सत्र" के अंत के बाद टूट जाएंगे। क्या वह सही है?


क्या आपका सर्वर HTTP मोड या टीसीपी मोड में चल रहा है?
ऑस्ट्रेलियाई जूल

1
@austinian; संभवतः http मोड यह देखते हुए कि कैसे वह कुकीज़ पर आधारित संतुलन और दृढ़ता के बारे में बात कर रहा है (टीसीपी मोड ऐसी सुविधाओं की पेशकश नहीं करता है)।
16

@Christophe, क्या आपने वास्तव में अपने 'हप्रोक्सी व्यवहार' अनुभाग में वर्णित कॉन्फ़िगरेशन की कोशिश की है, क्योंकि यह काम करना चाहिए।
16

@GregL, सही है, मैं भी यही सोच रहा हूँ। यदि वह HTTP मोड का उपयोग कर रहा है और सर्वर को रखरखाव मोड में सेट कर रहा है, तो यह नए सत्रों को स्वीकार करना बंद कर देगा, लेकिन वैध सत्रों को समाप्त होने तक जीवित रखेगा। आप अभी भी कुकीज़, आदि को टीसीपी मोड में रख सकते हैं, लेकिन तब इसका मतलब HAProxy के लिए कुछ भी नहीं होगा।
ऑस्ट्रेलियाई जूल

@Christophe, क्या आप अपने रखरखाव के समय को कम करने के लिए "एक अधिक चतुर तरीका" का उपयोग करने की कोशिश कर रहे हैं, या जब आप रखरखाव करने के लिए इंतजार कर रहे हैं, तो सत्र के अंत में एक रास्ता ढूंढ रहे हैं?
ऑस्ट्रेलियाई जूल

जवाबों:


6

वेब प्रबंधन इंटरफ़ेस का उपयोग करके सर्वर को ड्रेन मोड में रखें। वह सटीक कार्यक्षमता प्रदान करता है जिसे आप खोज रहे हैं।


3
यदि आप इसे Maint पर सेट करते हैं, तो इसे किसी भी ट्रैफ़िक को भेजना बंद कर दिया जाएगा, जैसा कि यहाँ उल्लिखित है । बल्कि, वह इसे ड्रेन मोड में डालना चाहते हैं, और stick-tableदृढ़ता प्रदान करने के लिए समाप्ति के साथ उपयोग करते हैं।
ग्रेग जूल 16'15

@GregL, उफ़, अब ठीक कर रहा है
ऑस्ट्रेलियाई जूल

आपके उत्तर के लिए धन्यवाद, austinian और @GredL। मैं कोशिश करूँगा कि मुश्किल हिस्सा स्टिक-टेबल के साथ होगा, मुझे लगता है। मुझे इस स्टिक-टेबल में कुकी क्लाइंट के साथ नाली मोड सर्वर पर स्टोर करने का तरीका खोजना होगा।
क्रिस्टोफ ड्रेवेट-ड्रोगेट

खैर, ऐसा लगता है कि मेरे मामले में नाली मोड पर्याप्त है, जिन सत्रों में पहले से ही कुकी सेट है वे अभी भी सूखा सर्वर का उपयोग करते हैं, और नए सत्र अन्य सर्वरों को निर्देशित किए जाते हैं।
क्रिस्टोफ ड्रेवेट-ड्रोगेट

1
आप वेब इंटरफ़ेस में मोड कैसे बदलते हैं? यह सिर्फ सूचनात्मक लग रहा है।
kagronick

9

आप का उपयोग करते हैं socat के लिए अपने haproxy विन्यास के साथ संवाद, तो आपको निम्न रास्ते से नाली राज्य में एक सर्वर डाल कर सकते हैं:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

यहाँ और आदेश ! Ubuntu में स्थापित समाज के लिए इस जवाब पर जाएं

मैं haproxy 1.6.3 संस्करण के साथ परीक्षण :)


1

दूसरा तरीका

सर्वर के बीच सत्र फ़ाइलों को सिंक्रनाइज़ करें (कई सर्वरों या एक सामान्य एकल माउंटपॉइंट के बीच फ़ाइलों को सिंक्रनाइज़ करने का तरीका)

यदि आपके बैकएंड सर्वर अनुप्रयोग के लिए PHP का उपयोग करते हैं, तो आप उन दोनों के बीच सत्र को सिंक करने के लिए Memcache का उपयोग कर सकते हैं।

इसके अलावा काउचबेस-सर्वर बॉक्स से मेमकेच प्रतिकृति कर सकता है।
बेशक यह सत्र प्रतिकृति के लिए काउचबेस-सर्वर का उपयोग करने के लिए ओवरकिल की तरह है :)


जबकि यह एक बेहतर तरीका होगा, इसके लिए कोड में बदलाव की जरूरत है, मुझे लगता है। इसलिए मैं हमारे वर्तमान अनुप्रयोगों के लिए ऑस्ट्रेलियाई, और ग्रेगेल का उपयोग करूँगा, जो सत्रों को सिंक नहीं करते हैं।
क्रिस्टोफ ड्रेवेट-ड्रोगेट

यदि आपका कोड कस्टम सत्र हैंडलर सेट नहीं करता है, तो आपको सत्रों के लिए PHP का उपयोग करने के लिए PHP के लिए किसी भी कोड को बदलने की आवश्यकता नहीं है। यह सब php.ini में कॉन्फ़िगर किया गया है, कोड में नहीं।
Cha0s

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