pgBouncer बढ़िया काम करता है लेकिन कभी-कभी यह अनुपलब्ध हो जाता है


9

मैं एक व्यस्त postgres 9 डेटाबेस के सामने pgBouncer चला रहा हूं। अधिकांश समय यह ठीक काम करता है। लेकिन हर कुछ घंटों में मुझे psycopg2 के अपवाद के साथ अपने आवेदन से एक त्रुटि ईमेल मिलेगा:

OperationalError ('सर्वर से कनेक्ट नहीं हो सका: अनुरोधित पता असाइन नहीं किया जा सकता है क्या सर्वर होस्ट "नव-हॉक" पर चल रहा है और पोर्ट 6432 पर टीसीपी / आईपी कनेक्शन स्वीकार कर रहा है?')

यह अजवाइन कार्यकर्ताओं के झुंड के साथ एक पायथन ऐप है जो चल रहे कार्य करता है। जब वे त्रुटियाँ आती हैं तो मैं pgbouncer db की जाँच करता हूँ और पूल का आकार सीमा के भीतर होता है। कुछ प्रयोग के बाद मैंने पूल का अधिकतम आकार 400 और पूल आकार को 200 पर सेट किया है। पूल मोड "सत्र" है (अनुरोध ज्यादातर ऑटो-कमिट हैं, लगभग कोई लेनदेन नहीं है)।

क्या pgBouncer उस तरह से गायब हो जाता है? इसकी केवल कुछ समय की अवधि के लिए (और कुल मिलाकर हम अनुरोधों की एक छोटी राशि के बारे में बात कर रहे हैं जो इसके सौंपने के अनुरोधों की तुलना में बहुत कम हैं) लेकिन जो अनुरोध विफल होते हैं वे महत्वपूर्ण हैं।

धन्यवाद!


ऑपरेटिंग सिस्टम और संस्करण? लिनक्स अगर कर्नेल संस्करण? सटीक PostgreSQL और PgBouncer संस्करण? क्या आपने डिबग लॉग लेवल में PgBouncer चलाया है और देखा है कि क्या यह कुछ उपयोगी रिपोर्ट करता है?
क्रेग रिंगर

डेबियन 6. लिनक्स संस्करण 2.6.32-5-amd64 (डेबियन 2.6.32-48squeeze1) pgbouncer संस्करण 1.5.4 पोस्टगार्ट 9.1। लॉग कनेक्ट कनेक्ट / डिस्कनेक्ट नहीं करता है क्योंकि मैंने सोचा था कि यह बहुत अधिक था, लेकिन उन ऐप त्रुटियों को फेंकने पर कोई त्रुटि मौजूद नहीं है। त्रुटि psycopg2 सोच से आती है, जिसमें बात करने के लिए कोई db सर्वर नहीं है, हालांकि यह समस्या पूर्व pgbouncer मौजूद नहीं थी
Harel

1
हम्म, इसलिए वर्तमान PgBouncer, और कर्नेल प्राचीन लेकिन बहुत स्थिर है। मुझे लगता है कि आपको PgBouncer में अधिक विस्तृत लॉगिंग को सक्षम करने -vvvऔर यह देखने की आवश्यकता है कि क्या आप समय में अपनी त्रुटियों के साथ विषम लॉग आउटपुट का मिलान कर सकते हैं।
क्रेग रिंगर

मैंने "सेट वर्बोस = 1; पुनः लोड किया?" pgbouncer खोल में और लॉग में साधारण से बाहर कुछ भी नहीं मिल सकता है। यह एक उत्पादन प्रणाली है, इसलिए सेवा को गैर-डेमॉन -vv के रूप में चलाने के लिए नहीं रोका जा सकता है। उम्मीद है कि मुझे वही परिणाम मिला है। ध्यान दें कि त्रुटि यह बताती है कि यह pgbouncer से बिल्कुल भी कनेक्ट नहीं हो सकता है, अर्थात, यह उस पोर्ट में सुन नहीं पा रहा है। हर समय हज़ारों कनेक्शन किए जाते हैं और यह अजीब होता है कि उनमें से छोटी संख्या उस तरह से विफल हो जाती है।
हरेल

मुश्किल; यह एक संभावित दौड़ की स्थिति की तरह लगता है, लेकिन क्या / कहाँ ...
क्रेग रिंगर

जवाबों:


15

" आवंटित नहीं किया जा सकता का अनुरोध किया पते त्रुटि संदेश में" भाग गिरी टीसीपी ढेर से आता है। जब रुक-रुक कर सामना किया जाता है, तो इसका आमतौर पर मतलब होता है कि प्रतीक्षा की स्थिति में बहुत अधिक सॉकेट ( TIME_WAITया कम शायद FIN_WAIT_1या FIN_WAIT_2) के कारण उपलब्ध सॉकेट्स का स्थान समाप्त हो जाता है।

सॉकेट पोर्ट की रेंज आउटपुट हो सकती है cat /proc/sys/net/ipv4/ip_local_port_range। एक शेयर लिनक्स कर्नेल पर डिफ़ॉल्ट मान आम तौर पर है 32768 61000

आप netstat -ton|grep WAITक्लाइंट (नों) और pgBouncer के मेजबान पर परिणाम की जाँच कर सकते हैं जब सिस्टम व्यस्त हो। -oझंडा प्रतीक्षा राज्यों से संबंधित टाइमआउट काउंटरों दिखाएगा।

यदि टीसीपी सॉकेट्स की कुल संख्या 61000-32768=28232इस सीमा के करीब है, तो इस सीमा के समाप्त होने की संभावना है। चूंकि एक बंद सॉकेट TIME_WAITसामान्य स्थिति में 60 सेकंड राज्य में खर्च करता है , अगर एक क्लाइंट होस्ट एक मिनट में 28232 से अधिक बार कनेक्ट करता है, तो नए कनेक्शन उल्लिखित त्रुटि के साथ विफल हो जाएंगे जब तक कि बंदरगाहों को मुक्त नहीं किया जाता है।

पहले वर्कअराउंड के रूप में, TCP पोर्ट रेंज को बढ़ाया जा सकता है:

 # echo "1025 65535" >/proc/sys/net/ipv4/ip_local_port_range

अगर यह संतोषजनक नहीं है, झंडे tcp_tw_recycleऔर tcp_tw_reuseझंडे की जाँच करें , के माध्यम से भी /proc/sys/net/ipv4और sysctl

वे (से man tcp) के रूप में परिभाषित कर रहे हैं :

       tcp_tw_recycle (बूलियन; डिफ़ॉल्ट: अक्षम; चूंकि लिनक्स 2.4)
              TIME_WAIT सॉकेट्स की तेज़ रीसाइक्लिंग सक्षम करें। इसे सक्षम करना
              विकल्प की सिफारिश नहीं की जाती है क्योंकि इससे काम करने में समस्या होती है
              NAT (नेटवर्क एड्रेस ट्रांसलेशन) के साथ आईएनजी।

       tcp_tw_reuse (बूलियन; डिफ़ॉल्ट: अक्षम; चूंकि लिनक्स 2.4.19 / 2.6)
              नए कनेक्शन के लिए TIME_WAIT सॉकेट को फिर से उपयोग करने की अनुमति दें
              प्रोटोकॉल के दृष्टिकोण से सुरक्षित है। इसे बिना बदले नहीं होना चाहिए
              तकनीकी विशेषज्ञों की सलाह / अनुरोध।

व्यक्तिगत रूप से मुझे tcp_tw_recycleएक MySQL ग्राहक ऐप के साथ इस समस्या का सामना करने पर सफलता मिली , लेकिन इसे अनुशंसा के रूप में नहीं लेना चाहिए, टीसीपी की मेरी समझ सबसे अच्छा है।


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

मुझे लगता है कि पोर्ट वृद्धि ने इसे पूरा किया है। अब तक मुझे कोई त्रुटि नहीं मिली है। नेटस्टैट लाइनों की एक मोटी गणना क्लाइंट में 20K के करीब दिखाई देती है, इसलिए वहां से 28K डिफ़ॉल्ट सीमा लंबी नहीं है। उसके लिए धन्यवाद!
हरेल

1
अच्छा! आप सेटिंग को रीबूट के /etc/sysctl.confरूप में net.ipv4.ip_local_port_range = 1025 65535जारी रखना चाहते हैं ।
डैनियल वेरिटा

धन्यवाद। मैंने तब से त्रुटियां प्राप्त की हैं, लेकिन ऐसा नहीं है जो अभी भी अच्छा है। इसे कुछ दिनों तक चलने दें और परमिट में बदलाव कर देगा। मुझे खुशी है कि यह अब तक काम कर रहा है क्योंकि अन्य बदलाव मुझे डराते हैं :)
हरेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.