2009-06-15 18 views
43

ठीक है, तो मुझे लोड संतुलित PHP वेबसाइट का यह एक दुर्लभ परिदृश्य मिला है। बमर है - यह संतुलित लोड नहीं किया गया था। अब हम मुद्दों को पाने के लिए शुरू कर रहे हैं ...लोड संतुलन क्लस्टर में PHP सत्र - कैसे?

वर्तमान में केवल मुद्दा पीएचपी सत्र के साथ है। स्वाभाविक रूप से किसी ने इस मुद्दे पर पहले सोचा नहीं था ताकि PHP सत्र कॉन्फ़िगरेशन को इसके डिफ़ॉल्ट पर छोड़ा जा सके। इस प्रकार दोनों सर्वरों में सत्र फ़ाइलों का अपना छोटा सा छिड़काव होता है, और दुःख वह उपयोगकर्ता होता है जो अगले सर्वर को अगले अनुरोध पर फेंक देता है, क्योंकि उसके पास पहले सत्र में सत्र नहीं होता है।

अब, मैं इस स्थिति को हल करने के तरीके पर PHP मैनुअल पढ़ रहा हूं। वहां मुझे session_set_save_handler() का अच्छा फ़ंक्शन मिला। (और, संयोग से, this topic एसओ पर) साफ। सिवाय इसके कि मुझे इस फ़ंक्शन को वेबसाइट के सभी पृष्ठों में कॉल करना होगा। और भविष्य के पृष्ठों के डेवलपर्स को हर समय इसे कॉल करना याद रखना होगा। लगता है कि शायद एक दर्जन सर्वश्रेष्ठ कोडिंग प्रथाओं का उल्लंघन करने का उल्लेख न करें। अगर मैं कुछ ग्लोबल कॉन्फ़िगरेशन विकल्प और वोला - सभी सत्रों को जादुई रूप से डीबी या मेमोरी कैश या कुछ में संग्रहीत कर सकता हूं तो यह बहुत अच्छा होगा।

यह कैसे करें इस पर कोई विचार है?


जोड़ा गया: स्पष्ट करने के लिए - मैं इस एक मानक समाधान के साथ एक मानक स्थिति होने की उम्मीद। एफवाईआई - मेरे पास एक MySQL डीबी उपलब्ध है। निश्चित रूप से वहाँ कुछ तैयार करने के लिए उपयोग कोड होना चाहिए जो हल करता है? मैं निश्चित रूप से, अपनी खुद की सत्र बचत सामग्री लिख सकता हूं और auto_prepend विकल्प Greg द्वारा इंगित किया गया विकल्प वादा करता है - लेकिन यह पहिया को फिर से शुरू करने जैसा महसूस करेगा। : पी
जोड़ा गया 2: लोड संतुलन डीएनएस आधारित है। मुझे यकीन नहीं है कि यह कैसे काम करता है, लेकिन मुझे लगता है कि यह this जैसा होना चाहिए।
जोड़ा गया 3: ठीक है, मुझे लगता है कि एक समाधान हर लिपि में session_set_save_handler() के लिए एक कॉल डाल सकते हैं और अपने खुद के डीबी persister लिखने के लिए, शायद बेहतर प्रदर्शन के लिए memcached के लिए कॉल में फेंक auto_prepend विकल्प का उपयोग करने के लिए है। काफी उचित।

क्या कोई तरीका भी है कि मैं इसे स्वयं कोडिंग से बच सकता हूं? कुछ प्रसिद्ध और अच्छी तरह से परीक्षण PHP प्लगइन की तरह?

जोड़ा बहुत, बहुत बाद में: How to properly implement a custom session persister in PHP + MySQL?

इसके अलावा, मैं बस सभी पृष्ठों में मैन्युअल रूप से सत्र हैंडलर शामिल: इस तरह से मैं अंत में चला गया है।

उत्तर

31

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

इसके लिए एक अच्छा ट्यूटोरियल found here हो सकता है।

+5

यह सही तरीका नहीं है। मुद्दा PHP सत्र है, डेटाबेस के बारे में भूल जाओ, हम PHP के बारे में बात कर रहे हैं। यह समाधान केवल एक काम है। – Daniel

+8

मैं असहमत हूं। डेटाबेस में PHP सत्र संग्रहीत करना इस समस्या का एक बिल्कुल अच्छा समाधान है। –

+3

@MattFletcher समस्या का एक खराब समाधान है। मेमोरी स्टोरेज में रेडिस, मेमकैच, या रैमफ इत्यादि जैसे – r3wt

3

करने के लिए सबसे आसान काम अपने लोड संतुलन कॉन्फ़िगर हमेशा एक ही सर्वर पर एक ही सत्र भेजने के लिए है।

आप अभी भी session_set_save_handler उपयोग करने के लिए तो शायद auto_prepend पर एक नज़र डालें चाहते हैं।

+0

पर सत्रों के बारे में चिंता करने की आवश्यकता नहीं होगी लोड संतुलन किसी भी तरह से DNS प्रविष्टियों के साथ किया जाता है। होस्टनाम दो अलग-अलग आईपी पतों का समाधान करता है और ब्राउजर एक यादृच्छिक रूप से चुनता है। या ऐसा कुछ - मुझे वास्तव में विवरण नहीं पता है। लेकिन AFAIK कोई लोड बैलेंसर नहीं है। "Auto_prepend" आशाजनक लग रहा है। –

+0

+1 प्रत्येक स्क्रिप्ट – Galen

+2

से पहले session_set_save_handler फ़ंक्शन को सम्मिलित करने के लिए auto_prepend का उपयोग करें जैसे लगता है कि आपके पास "राउंड रॉबिन DNS" है - http://en.wikipedia.org/wiki/Round_robin_DNS। मैं कहूंगा कि संतुलन को लोड करने के लिए कम से कम इस "समाधान" के बारे में कहा गया है, बेहतर। – Ian

1

जब हमारे पास यह स्थिति थी तो हमने कुछ कोड लागू किए जो एक सामान्य शीर्षलेख में रहते थे।

अनिवार्य रूप से प्रत्येक पृष्ठ के लिए हम जांचते हैं कि क्या हम सत्र आईडी जानते हैं। अगर हम जांच नहीं करते हैं कि हम स्थिति में हैं, तो क्या आप वर्णन करते हैं कि हमने डीबी में सेशन डेटा संग्रहीत किया है या नहीं। अन्यथा हम एक नया सत्र शुरू करते हैं।

जाहिर है इस सभी संबंधित डेटा डीबी में कॉपी किया जा करने की आवश्यकता है, लेकिन अगर आप एक अलग वर्ग में अपने सत्र डेटा को संपुटित तो यह ठीक काम करता है।

6

आपने यह नहीं बताया कि लोड संतुलन (सॉफ्टवेयर, हार्डवेयर इत्यादि) के लिए आप किस तकनीक का उपयोग कर रहे हैं; लेकिन किसी भी मामले में, आपकी समस्या का समाधान लोड बैलेंसर पर "चिपचिपा सत्र" को नियोजित करना है।

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

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

सॉफ़्टवेयर बैलेंसर्स के लिए, यह आपके द्वारा उपयोग किए जा रहे कार्यों के लिए आता है। अन्य टिप्पणी मूल प्रश्न के बाद पोस्ट से, यह अपने तरह लगता है: और बहुत सारे गूगल के माध्यम से लेख के इस php सत्र (for example)


संपादित के साथ काम कर पाने के लिए - अपाचे के लिए वहाँ mod_proxy पर stickysession संपत्ति है राउंड रॉबिन डीएनएस के माध्यम से "संतुलन" किया जाता है, इसलिए उपरोक्त शायद लागू नहीं होगा। मैं आगे टिप्पणी करने और राउंड रॉबिन डीएनएस के खिलाफ लौ शुरू करने से बचना होगा।

+0

मैंने इस समाधान का चयन नहीं किया और न ही मैं इसे बदल सकता हूं। –

1

आप भी सत्र हैंडलर के रूप में मेम्कैश का उपयोग कर

1

यदि आप PHP सत्र का उपयोग कर रहे हैं तो आप एनएफएस/tmp निर्देशिका के साथ साझा कर सकते हैं, जहां मुझे लगता है कि क्लस्टर में सभी सर्वरों के बीच सत्र संग्रहीत किए जाते हैं। इस तरह आपको डेटाबेस की आवश्यकता नहीं है।

संपादित: आप memcachedb (लगातार और तेज़) जैसी बाहरी सेवा का भी उपयोग कर सकते हैं और memcachedb अनुक्रमणिका में सत्र जानकारी संग्रहीत कर सकते हैं और सामग्री के हैश या यहां तक ​​कि सत्र आईडी के साथ इसे इंडेंट कर सकते हैं।

+0

यह वर्तमान "त्वरित कामकाज" है, लेकिन व्यवस्थापक इसे पसंद नहीं करता है। सुरक्षा और सामान के बारे में कुछ, मुझे विवरण नहीं पता है। –

+0

एमएमएम, तो आप सत्रों के लिए सूचकांक के रूप में कुंजी के हैश का उपयोग कर memcachedb जैसी बाहरी सेवा का उपयोग कर सकते हैं। Memcachedb सेवा बहुत तेज (विशेष रूप से लेखन) और उपयोग करने में आसान है, आप PHP से memcached कार्यों के एक विशेष और कम सेट का उपयोग कर सकते हैं। – Khriz

+2

क्या आपने आईडी की कोशिश की? जोखिम भरा और अस्थिर लगता है। – knoopx

17

जिस तरह से हम इसे संभालते हैं वह memcached के माध्यम से होता है। सभी यह लेता है php.ini निम्न के समान बदल रहा है:

session.save_handler = memcache 
session.save_path = "tcp://path.to.memcached.server:11211" 

हम एडब्ल्यूएस ElastiCache उपयोग करते हैं, तो सर्वर पथ एक डोमेन है, लेकिन मुझे यकीन है कि यह रूप में अच्छी तरह स्थानीय memcached के लिए समान होगा हूँ।

इस विधि को किसी भी एप्लिकेशन कोड में परिवर्तन की आवश्यकता नहीं है।

+4

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

+1

यहां अधिक जानकारी: http://php.net/manual/en/memcached.sessions.php नोट: अधिकांश दस्तावेज़ वास्तव में टिप्पणियों में हैं! –

1

आपके पास समय हो और आप अभी भी अधिक समाधान की जांच करने के http://redis4you.com/articles.php?id=01 पर एक नज़र डालें ..

redis आप दोष सहिष्णु हैं का उपयोग करना चाहते हैं। मेरे दृष्टिकोण से, यह इस मजबूती के कारण memcache समाधान से बेहतर हो सकता है।

0

बहुत देर हो चुकी है, लेकिन इस की जाँच: भूमि के ऊपर और एक SQL की जटिलता के बिना http://www.pureftpd.org/project/sharedance

Sharedance अल्पकालिक कुंजी/डेटा रिमोट होस्ट पर जोड़े को केंद्रीकृत करने एक उच्च प्रदर्शन सर्वर है, डेटाबेस।

यह मुख्य रूप से वेब सर्वर के पूल के बीच कैश और सत्र साझा करने के लिए डिज़ाइन किया गया था। एक साझा PHP सर्वर तक पहुंच एक साधारण PHP एपीआई और के माध्यम से तुच्छ है, यह PHP 4 और PHP 5 सत्र हैंडलर की अपेक्षाओं के अनुकूल है।

0

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

+0

ठीक है, चिपचिपा सत्रों के बिना आपको भी विफलता मिलती है। :) हालांकि, यह मूल प्रश्न है कि एक अलग शिकन है - लोड संतुलन "DNS राउंड-रॉबिन" प्रकार है। तो चिपचिपा सत्र वैसे भी सवाल से बाहर हैं। : पी –

+0

@ विल्क्स- हमें लोड बैलेंसर के साथ PHP में सत्र के लिए एक ही समस्या का सामना करना पड़ा, और यह हमारे लिए काम करता था। केवल एक चीज जिसे हमने किया था, हमारे डेटासेंटर से कॉन्फ़िगर किए गए डोमेन के चिपचिपा सत्र को सक्षम करने और केवल राउंड-रॉबिन में रूटिंग का अनुरोध करने के लिए कहा गया था – harigorana

संबंधित मुद्दे