PostgreSQL HAProxy और PGBouncer का उपयोग करके उच्च उपलब्धता / स्केलेबिलिटी


18

मैं एक वेब अनुप्रयोग के लिए कई PostgreSQL सर्वर है। आमतौर पर हॉट स्टैंडबाई मोड (अतुल्यकालिक स्ट्रीमिंग प्रतिकृति) में एक मास्टर और कई दास।

मैं कनेक्शन पूलिंग के लिए PGBouncer का उपयोग करता हूं: लोकलहोस्ट पर डेटाबेस से कनेक्ट होने वाले प्रत्येक पीजी सर्वर (पोर्ट 6432) पर स्थापित एक उदाहरण। मैं लेनदेन पूल मोड का उपयोग करता हूं।

गुलामों पर मेरे रीड-ओनली कनेक्शनों को लोड-बैलेंस करने के लिए, मैं HAProxy (v1.5) का उपयोग इस से कम या ज्यादा करता हूं:

listen pgsql_pool 0.0.0.0:10001
        mode tcp
        option pgsql-check user ha
        balance roundrobin
        server master 10.0.0.1:6432 check backup
        server slave1 10.0.0.2:6432 check
        server slave2 10.0.0.3:6432 check
        server slave3 10.0.0.4:6432 check

इसलिए, मेरा वेब एप्लिकेशन haproxy (पोर्ट 10001) से जुड़ता है, जो कि प्रत्येक पीजी ब्वॉय पर कॉन्फ़िगर किए गए मल्टीपल पेगॉन्सर पर लोड-बैलेंस कनेक्शन है।

यहाँ मेरी वर्तमान वास्तुकला का प्रतिनिधित्व ग्राफ है:

haproxy> pgbouncer> postgresql

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

pgbouncer> haproxy> postgresql

सबसे अच्छा तरीका क्या है? पहला वाला (मेरा वर्तमान वाला) या दूसरा वाला? क्या दूसरे पर एक समाधान के कोई लाभ हैं?

धन्यवाद

जवाबों:


10

HAProxy का आपका मौजूदा कॉन्फ़िगरेशन -> PGBouncer -> PGServer approch बेहतर है। और वह केवल काम करता है। यहाँ कारण है: HAProxy विभिन्न सर्वरों से कनेक्शन को पुनर्निर्देशित करता है। डेटाबेस कनेक्शन में मैक पते में यह परिणाम बदलता है। इसलिए यदि PGBouncer HAProxy से ऊपर है, तो हर बार मैक पते में बदलाव के कारण पूल में कनेक्शन अमान्य हो जाते हैं।


7

pgbouncer एक पोस्टग्रेज सर्वर के साथ एक पूल में कनेक्शन बनाए रखता है। उच्च-मात्रा वाले वातावरण में टीसीपी कनेक्शन स्थापना समय महत्वपूर्ण हैं।

बड़ी संख्या में DB अनुरोध करने वाले ग्राहकों को प्रत्येक अनुरोध के लिए दूरस्थ PGBouncer के साथ कनेक्शन स्थापित करना होगा। यह PgBouncer को स्थानीय रूप से चलाने की तुलना में अधिक महंगा है (इसलिए एप्लिकेशन स्थानीय रूप से pgbouncer से कनेक्ट होता है) और pgBouncer दूरस्थ PG सर्वर के साथ कनेक्शन का एक पूल बनाए रखता है।

तो, IMO, PGBouncer -> HAProxy -> PGServer, HAProxy -> PGBouncer -> PGServer से बेहतर लगता है, खासकर जब PGBouncer क्लाइंट एप्लिकेशन के लिए स्थानीय हो।


2

मुझे डोनटेलो द्वारा दिए गए जवाब से असहमत होना होगा।

आप देखते हैं, यदि आपका एप्लिकेशन स्थानीय पूल का उपयोग करके DB कनेक्शन का प्रबंधन नहीं करता है, तो यह DB को क्वेरी करने के लिए हर बार एक नया कनेक्शन बनाएगा; PgBouncer का उपयोग करते समय ठीक वैसा ही होता है, इसलिए इसका उपयोग करके आप बहुत अच्छा सुधार करेंगे।

जब PgBouncer उन्हें पूल करके PostgreSQL कनेक्शन का प्रबंधन कर रहा होता है, तो जब कनेक्शन सीधे DB में खोला जाता है, तो आपकी ऐप एक कनेक्शन ड्रॉप करने में काफी समय लगाती है। ऐसा इसलिए है क्योंकि पीजी क्रेडेंशियल्स की जांच और सत्यापन के लिए काफी धीमा है और हर बार कनेक्शन के लिए अनुरोध किया जाता है।

तो, दृष्टिकोण ऐप -> HAProxy -> [PgBouncer -> PostgreSQL] बेहतर है, क्योंकि PgBouncer PG को कनेक्शन समय बचाता है। पूलिंग मोड भी महत्वपूर्ण है। आपको अपने ऐप के व्यवहार के तरीके के बारे में पता होना चाहिए। क्या यह ज्यादातर लेन-देन है? या, यह एक उच्च संगामिति के साथ छोटे एसक्यूएल वाक्यों का एक गुच्छा निष्पादित करने के लिए अधिक है? उन सभी मापदंडों का प्रदर्शन पर असर पड़ता है।

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