डेटाबेस की दुनिया में, उच्च उपलब्धता, विफलता और कनेक्शन पूलिंग जैसी कई सामान्य अवधारणाएं हैं। ये सभी किसी भी सिस्टम पर लागू करने के लिए उपयोगी चीजें हैं, और कुछ मामलों में जरूरी भी हैं।
कनेक्शन पूलिंग कनेक्शनों का एक पूल बनाने और डेटाबेस में हर समय नए कनेक्शन खोलने से बचने के लिए उनका पुन:उपयोग करने का एक तरीका है, जो आपके अनुप्रयोगों के प्रदर्शन को काफी बढ़ा देगा। PgBouncer PostgreSQL के लिए डिज़ाइन किया गया एक लोकप्रिय कनेक्शन पूलर है, लेकिन यह अपने आप PostgreSQL उच्च उपलब्धता प्राप्त करने के लिए पर्याप्त नहीं है क्योंकि इसमें मल्टी-होस्ट कॉन्फ़िगरेशन, फ़ेलओवर या डिटेक्शन नहीं है।
लोड बैलेंसर का उपयोग करना आपके डेटाबेस टोपोलॉजी में उच्च उपलब्धता रखने का एक तरीका है। यह ट्रैफ़िक को स्वस्थ डेटाबेस नोड्स पर पुनर्निर्देशित करने, प्रदर्शन को बेहतर बनाने के लिए कई सर्वरों में ट्रैफ़िक वितरित करने, या आसान कॉन्फ़िगरेशन और फ़ेलओवर प्रक्रिया के लिए आपके एप्लिकेशन में केवल एक एंडपॉइंट कॉन्फ़िगर करने के लिए उपयोगी हो सकता है। इसके लिए, HAProxy आपके कनेक्शन पूलर के पूरक के लिए एक अच्छा विकल्प है, क्योंकि यह एक ओपन-सोर्स प्रॉक्सी है जिसका उपयोग टीसीपी और एचटीटीपी आधारित अनुप्रयोगों के लिए उच्च उपलब्धता, लोड संतुलन और प्रॉक्सीइंग को लागू करने के लिए किया जा सकता है।
इस ब्लॉग में, हम आपके PostgreSQL डेटाबेस के लिए एक उच्च उपलब्धता वातावरण को परिनियोजित करने के लिए, लोड बैलेंसर और कनेक्शन पूलिंग (HAProxy + PgBouncer) दोनों अवधारणाओं का उपयोग करेंगे।
पीजी बाउंसर कैसे काम करता है
PgBouncer PostgreSQL सर्वर के रूप में कार्य करता है, इसलिए आपको केवल PgBouncer जानकारी (IP पता/होस्टनाम और पोर्ट) का उपयोग करके अपने डेटाबेस तक पहुंचने की आवश्यकता है, और PgBouncer PostgreSQL सर्वर से एक कनेक्शन बनाएगा, या यह होगा यदि मौजूद है तो उसका पुन:उपयोग करें।
जब PgBouncer एक कनेक्शन प्राप्त करता है, तो यह प्रमाणीकरण करता है, जो कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट विधि पर निर्भर करता है। PgBouncer उन सभी प्रमाणीकरण तंत्रों का समर्थन करता है जो PostgreSQL सर्वर समर्थन करता है। इसके बाद, PgBouncer एक ही उपयोगकर्ता नाम + डेटाबेस संयोजन के साथ कैश्ड कनेक्शन की जांच करता है। यदि कोई कैश्ड कनेक्शन पाया जाता है, तो यह क्लाइंट को कनेक्शन लौटाता है, यदि नहीं, तो यह एक नया कनेक्शन बनाता है। PgBouncer कॉन्फ़िगरेशन और सक्रिय कनेक्शनों की संख्या के आधार पर, यह संभव हो सकता है कि नया कनेक्शन तब तक कतारबद्ध हो जब तक कि इसे बनाया नहीं जा सकता, या यहां तक कि निरस्त नहीं किया जा सकता।
PgBouncer व्यवहार कॉन्फ़िगर किए गए पूलिंग मोड पर निर्भर करता है:
- सत्र पूलिंग (डिफ़ॉल्ट):जब कोई क्लाइंट कनेक्ट होता है, तो क्लाइंट के कनेक्ट रहने की पूरी अवधि के लिए उसे एक सर्वर कनेक्शन असाइन किया जाएगा। जब क्लाइंट डिस्कनेक्ट हो जाता है, तो सर्वर कनेक्शन वापस पूल में डाल दिया जाएगा।
- लेन-देन पूलिंग :एक सर्वर कनेक्शन क्लाइंट को केवल लेनदेन के दौरान ही सौंपा जाता है। जब PgBouncer ने नोटिस किया कि लेनदेन समाप्त हो गया है, तो सर्वर कनेक्शन वापस पूल में डाल दिया जाएगा।
- स्टेटमेंट पूलिंग :क्वेरी पूरी होने के तुरंत बाद सर्वर कनेक्शन वापस पूल में डाल दिया जाएगा। इस मोड में मल्टी-स्टेटमेंट लेनदेन की अनुमति नहीं है क्योंकि वे टूट जाएंगे।
कई सर्वरों के बीच प्रश्नों को संतुलित करने के लिए, PgBouncer की तरफ, सर्वर_लाइफटाइम को छोटा बनाना और सर्वर_राउंड_रॉबिन को चालू करना भी एक अच्छा विचार हो सकता है। डिफ़ॉल्ट रूप से, निष्क्रिय कनेक्शन का LIFO एल्गोरिथ्म द्वारा पुन:उपयोग किया जाता है, जो लोड-बैलेंसर का उपयोग करने पर शायद इतना अच्छा काम न करे।
पीजी बाउंसर कैसे स्थापित करें
हम मान लेंगे कि आपके पास आपका PostgreSQL क्लस्टर और HAProxy परिनियोजित है, और यह चालू है और चल रहा है, अन्यथा, आप उच्च उपलब्धता के लिए PostgreSQL को आसानी से परिनियोजित करने के लिए इस ब्लॉग पोस्ट का अनुसरण कर सकते हैं।
आप प्रत्येक डेटाबेस नोड पर या किसी बाहरी मशीन पर PgBouncer स्थापित कर सकते हैं, किसी भी स्थिति में, आपके पास कुछ ऐसा होगा:
PgBouncer सॉफ्टवेयर प्राप्त करने के लिए आप PgBouncer डाउनलोड सेक्शन में जा सकते हैं, या RPM या DEB रिपॉजिटरी का उपयोग करें। इस उदाहरण के लिए, हम CentOS 8 का उपयोग करेंगे और इसे आधिकारिक PostgreSQL रिपॉजिटरी से स्थापित करेंगे।
सबसे पहले, PostgreSQL साइट से संबंधित रिपॉजिटरी को डाउनलोड और इंस्टॉल करें (यदि आपके पास यह अभी तक नहीं है):
$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm
फिर, PgBouncer पैकेज इंस्टाल करें:
$ yum install pgbouncer
इंस्टॉलेशन सत्यापित करें:
$ pgbouncer --version
PgBouncer 1.14.0
libevent 2.1.8-stable
adns: c-ares 1.13.0
tls: OpenSSL 1.1.1c FIPS 28 May 2019
जब यह पूरा हो जाएगा, तो आपके पास /etc/pgbouncer/pgbouncer.ini में स्थित एक नई कॉन्फ़िगरेशन फ़ाइल होगी:
[databases]
[users]
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, postgres
आइए इन मापदंडों को एक-एक करके देखें:
- डेटाबेस अनुभाग [डेटाबेस]: इसमें कुंजी =मान जोड़े शामिल हैं जहां कुंजी को डेटाबेस नाम के रूप में लिया जाएगा और मान एक libpq कनेक्शन स्ट्रिंग शैली सूची के रूप में कुंजी =मान जोड़े के रूप में लिया जाएगा।
- उपयोगकर्ता अनुभाग [उपयोगकर्ता]: इसमें कुंजी =मान जोड़े शामिल हैं जहां कुंजी को उपयोगकर्ता नाम के रूप में लिया जाएगा और मान एक libpq कनेक्शन स्ट्रिंग शैली सूची के रूप में कुंजी =इस उपयोगकर्ता के लिए विशिष्ट कॉन्फ़िगरेशन सेटिंग्स के मान जोड़े।
- लॉगफाइल :लॉग फ़ाइल निर्दिष्ट करता है। लॉग फ़ाइल को खुला रखा जाता है, इसलिए रोटेशन के बाद किल-एचयूपी या कंसोल रीलोड पर; किया जाना चाहिए।
- पिडफाइल :PID फ़ाइल निर्दिष्ट करता है। पिडफाइल सेट के बिना, डेमॉन की अनुमति नहीं है।
- सुनें_जोड़ें :उन पतों की सूची निर्दिष्ट करता है जहां TCP कनेक्शन को सुनना है। आप * का अर्थ "सभी पतों पर सुनें" का भी उपयोग कर सकते हैं। जब सेट नहीं किया जाता है, तो केवल यूनिक्स सॉकेट कनेक्शन स्वीकार किए जाते हैं।
- सुनो_पोर्ट: किस पोर्ट पर सुनना है। टीसीपी और यूनिक्स सॉकेट दोनों पर लागू होता है। डिफ़ॉल्ट पोर्ट 6432 है।
- auth_type: उपयोगकर्ताओं को प्रमाणित कैसे करें।
- auth_file :फ़ाइल का नाम जिससे उपयोगकर्ता नाम और पासवर्ड लोड करना है।
- admin_users :डेटाबेस उपयोगकर्ताओं की अल्पविराम से अलग की गई सूची जिन्हें कंसोल पर सभी कमांड को जोड़ने और चलाने की अनुमति है।
- stats_users :डेटाबेस उपयोगकर्ताओं की अल्पविराम से अलग की गई सूची जिन्हें कंसोल पर केवल-पढ़ने के लिए क्वेरी को जोड़ने और चलाने की अनुमति है।
यह केवल डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल का एक नमूना है, क्योंकि मूल में 359 पंक्तियाँ हैं, लेकिन शेष पंक्तियों पर डिफ़ॉल्ट रूप से टिप्पणी की जाती है। सभी उपलब्ध पैरामीटर प्राप्त करने के लिए, आप आधिकारिक दस्तावेज़ीकरण देख सकते हैं।
पीजी बाउंसर का उपयोग कैसे करें
अब, आइए इसे काम करने के लिए एक बुनियादी कॉन्फ़िगरेशन देखें।
pgbouncer.ini कॉन्फ़िगरेशन फ़ाइल:
$ cat /etc/pgbouncer/pgbouncer.ini
[databases]
world = host=127.0.0.1 port=5432 dbname=world
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admindb
और प्रमाणीकरण फ़ाइल:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
इसलिए, इस मामले में, मैंने एक ही डेटाबेस नोड में PgBouncer स्थापित किया है, सभी IP पतों को सुन रहा है, और यह "world" नामक एक PostgreSQL डेटाबेस से जुड़ता है। मैं एक सादे-पाठ पासवर्ड के साथ userlist.txt फ़ाइल में अनुमत उपयोगकर्ताओं का प्रबंधन भी कर रहा हूं जिसे जरूरत पड़ने पर एन्क्रिप्ट किया जा सकता है।
PgBouncer सेवा शुरू करने के लिए, आपको बस निम्नलिखित कमांड चलाने की जरूरत है:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
कहां -d का अर्थ है "डेमन", इसलिए यह बैकग्राउंड में चलेगा।
$ netstat -pltn
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6432 0.0.0.0:* LISTEN 4274/pgbouncer
tcp6 0 0 :::6432 :::* LISTEN 4274/pgbouncer
जैसा कि आप देख सकते हैं, PgBouncer ऊपर है और पोर्ट 6432 में कनेक्शन की प्रतीक्षा कर रहा है। PostgreSQL डेटाबेस तक पहुँचने के लिए, अपनी स्थानीय जानकारी (पोर्ट, होस्ट, उपयोगकर्ता नाम और डेटाबेस नाम) का उपयोग करके निम्न कमांड चलाएँ। :
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
ध्यान रखें कि डेटाबेस का नाम (दुनिया) आपकी PgBouncer कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगर किया गया डेटाबेस है:
[databases]
world = host=127.0.0.1 port=5432 dbname=world
पीजी बाउंसर की निगरानी और प्रबंधन
अपने PostgreSQL डेटाबेस तक पहुँचने के बजाय, आप इसे प्रबंधित या मॉनिटर करने के लिए सीधे PgBouncer से जुड़ सकते हैं। इसके लिए उसी कमांड का उपयोग करें जो आपने पहले इस्तेमाल किया था, लेकिन डेटाबेस को "pgbouncer" में बदलें:
$ psql -p 6432 -h 127.0.0.1 -U admindb pgbouncer
Password for user admindb:
psql (12.4, server 1.14.0/bouncer)
Type "help" for help.
pgbouncer=# SHOW HELP;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW DNS_HOSTS|DNS_ZONES
SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
DISABLE <db>
ENABLE <db>
RECONNECT [<db>]
KILL <db>
SUSPEND
SHUTDOWN
SHOW
अब, आप इसकी निगरानी के लिए विभिन्न PgBouncer कमांड चला सकते हैं:
STATS_TOTALS दिखाएं:
pgbouncer=# SHOW STATS_TOTALS;
database | xact_count | query_count | bytes_received | bytes_sent | xact_time | query_time | wait_time
-----------+------------+-------------+----------------+------------+-----------+------------+-----------
pgbouncer | 1 | 1 | 0 | 0 | 0 | 0 | 0
world | 2 | 2 | 59 | 234205 | 8351 | 8351 | 4828
(2 rows)
सर्वर दिखाएं:
pgbouncer=# SHOW SERVERS;
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time
| wait | wait_us | close_needed | ptr | link | remote_pid | tls
------+---------+----------+--------+-----------+------+------------+------------+-------------------------+-------------------------
+------+---------+--------------+----------------+----------------+------------+-----
S | admindb | world | active | 127.0.0.1 | 5432 | 127.0.0.1 | 45052 | 2020-09-09 18:31:57 UTC | 2020-09-09 18:32:04 UTC
| 0 | 0 | 0 | 0x55b04a51b3d0 | 0x55b04a514810 | 5738 |
(1 row)
ग्राहकों को दिखाएं:
pgbouncer=# SHOW CLIENTS;
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time
| wait | wait_us | close_needed | ptr | link | remote_pid | tls
------+---------+-----------+--------+-----------+-------+------------+------------+-------------------------+-----------------------
--+------+---------+--------------+----------------+----------------+------------+-----
C | admindb | pgbouncer | active | 127.0.0.1 | 46950 | 127.0.0.1 | 6432 | 2020-09-09 18:29:46 UTC | 2020-09-09 18:55:11 UT
C | 1441 | 855140 | 0 | 0x55b04a5145e0 | | 0 |
C | admindb | world | active | 127.0.0.1 | 47710 | 127.0.0.1 | 6432 | 2020-09-09 18:31:41 UTC | 2020-09-09 18:32:04 UT
C | 0 | 0 | 0 | 0x55b04a514810 | 0x55b04a51b3d0 | 0 |
(2 rows)
पूल दिखाएं:
pgbouncer=# SHOW POOLS;
database | user | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_
mode
-----------+-----------+-----------+------------+-----------+---------+---------+-----------+----------+---------+------------+------
-----
pgbouncer | pgbouncer | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | state
ment
world | admindb | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | sessi
on
(2 rows)
और इसे प्रबंधित करने के लिए...
फिर से लोड करें:
pgbouncer=# RELOAD;
RELOAD
रोकें:
pgbouncer=# PAUSE world;
PAUSE
रिज्यूमे:
pgbouncer=# RESUME world;
RESUME
वे आदेश केवल एक उदाहरण हैं। आदेशों की पूरी सूची के लिए, कृपया आधिकारिक दस्तावेज देखें।
निष्कर्ष
PgBouncer + HAProxy + PostgreSQL के संयोजन का उपयोग करना आपके PostgreSQL क्लस्टर के लिए उच्च उपलब्धता प्राप्त करने का एक अच्छा तरीका है जो आपके डेटाबेस के प्रदर्शन को एक ही समय में सुधारता है।
जैसा कि आप देख सकते हैं, यदि आपके पास अपना PostgreSQL वातावरण है, जिसे आप कुछ ही क्लिक में ClusterControl का उपयोग करके परिनियोजित कर सकते हैं, तो आप अपने सिस्टम के लिए कनेक्शन पूलर होने का लाभ उठाने के लिए आसानी से PgBouncer जोड़ सकते हैं।