PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PgBouncer के साथ PostgreSQL कनेक्शन पूलिंग

कनेक्शन पूलिंग आपके ऐप्स के प्रदर्शन को बेहतर बनाने और आपके PostgreSQL सर्वर पर लोड को कम करने का एक सरल लेकिन प्रभावी तरीका है। PostgreSQL कनेक्शन को पूल करने के लिए PgBouncer का उपयोग करने के बारे में अधिक जानने के लिए पढ़ें।

कनेक्शन पूलिंग क्यों?

PostgreSQL में हैवीवेट कनेक्शन हैंडलिंग आर्किटेक्चर है। प्रत्येक आने वाले कनेक्शन के लिए, पोस्टमास्टर (मुख्य पोस्टग्रेज डेमॉन) एक नई प्रक्रिया (पारंपरिक रूप से बैकएंड कहा जाता है) को फोर्क करता है ) इसे संभालने के लिए। हालांकि यह डिज़ाइन बेहतर स्थिरता और अलगाव प्रदान करता है, लेकिन यह इसे अल्पकालिक कनेक्शन को संभालने में विशेष रूप से कुशल नहीं बनाता है। एक नए पोस्टग्रेज क्लाइंट कनेक्शन में टीसीपी सेटअप, प्रोसेस क्रिएशन और बैकएंड इनिशियलाइज़ेशन शामिल है - ये सभी समय और सिस्टम संसाधनों के मामले में महंगे हैं।

यह निश्चित रूप से केवल एक समस्या है यदि कनेक्शन बहुत बार बनाए जाते हैं और पुन:उपयोग किए बिना त्याग दिए जाते हैं। दुर्भाग्य से, PHP या अन्य ऐसी भाषाओं में लिखे गए वेब नोड्स चलाने वाले अनुप्रयोगों का एक समूह होना असामान्य नहीं है, जिन्हें प्रति पृष्ठ लोड एक बार डेटाबेस से कनेक्ट करने की आवश्यकता होती है। बैच जॉब जो तेजी से एक के बाद एक कई कनेक्शन बनाते हैं, वे भी आम हैं। कनेक्शनपूलिंगको नियोजित करना ऐसे परिदृश्यों में आपके PostgreSQL सर्वर पर लोड को काफी कम कर सकता है और क्वेरी विलंबता में नाटकीय रूप से सुधार कर सकता है।

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

PgBouncer क्या है?

PgBouncer PostgreSQL के लिए एक ओपन-सोर्स, लाइटवेट, सिंगल-बाइनरी कनेक्शन पूलर है। यह एक या अधिक डेटाबेस (संभवतः विभिन्न सर्वरों पर) से कनेक्शन पूल कर सकता है और टीसीपी और यूनिक्स डोमेन सॉकेट पर क्लाइंट की सेवा कर सकता है।

PgBouncer प्रत्येक अद्वितीय उपयोगकर्ता, डेटाबेस जोड़ी के लिए कनेक्शन का एक पूल रखता है। यह आमतौर पर इन कनेक्शनों में से एक को एक नए आने वाले क्लाइंट कनेक्शन को सौंपने के लिए कॉन्फ़िगर किया गया है, और क्लाइंट के डिस्कनेक्ट होने पर इसे वापस पूल में वापस कर देता है। आप PgBouncer को अधिक आक्रामक रूप से पूल करने के लिए कॉन्फ़िगर कर सकते हैं, ताकि यह कनेक्शन सीमाओं के बजाय लेनदेन या स्टेटमेंट सीमा पर पूल में कनेक्शन उठा सके और वापस कर सके। हालांकि, इसके कुछ संभावित अवांछित परिणाम हैं।

आपको अपने डिस्ट्रो के पैकेज मैनेजर के साथ PgBouncer स्थापित करने में सक्षम होना चाहिए:

# RedHat/CentOS/..
$ sudo yum install pgbouncer

# Debian/Ubuntu/..
$ sudo apt-get install pgbouncer

यह मानक पोस्टग्रेज APTऔर YUM रेपो से भी उपलब्ध है, जिसका उपयोग तब किया जा सकता है जब आपके डिस्ट्रो के पैकेज पुराने या टूटे हुए हों।

PgBouncer एक मुख्य कॉन्फ़िगरेशन फ़ाइल पर निर्भर करता है, जिसे आमतौर पर /etc/pgbouncer/pgbouncer.ini के रूप में संग्रहीत किया जाता है। . आप pgbouncer को सिस्टमड सेवा के रूप में लागू कर सकते हैं, या इस कॉन्फ़िगरेशन फ़ाइल के पथ के साथ सुपरयूज़र विशेषाधिकारों के बिना भी इसे चला सकते हैं।

इसे एक स्पिन देने के लिए, आइए हमारे सर्वर पर एक डेटाबेस db1 और एक उपयोगकर्ता user1 बनाएं:

$ sudo -u postgres psql
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

postgres=# create user user1 password 'user1pass';
CREATE ROLE
postgres=# create database db1 owner user1;
CREATE DATABASE
postgres=#

ग्राहक डेटाबेस से जुड़ेंगे db1 उपयोगकर्ता नाम के साथ user1 और पासवर्ड user1pass . हमारा लक्ष्य क्लाइंट को PgBouncer से कनेक्ट करना है जो वास्तविक सर्वर से कनेक्शन को प्रॉक्सी और पूल करेगा।

आइए अब इन सामग्रियों के साथ एक फ़ाइल (कहीं भी) बनाएं:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt

हमें उसी निर्देशिका में एक "userlist.txt" फ़ाइल बनाने की भी आवश्यकता है, जिसमें उपयोगकर्ताओं के उपयोगकर्ता नाम और (हैशेड) पासवर्ड हों, जिन्हें PgBouncer कनेक्ट करने की अनुमति देगा। निम्नलिखित सामग्री के साथ "userlist.txt" बनाएं:

"user1" "md5638b81c77071ea624d1ad4adb1433540"

दूसरा मान "user1passuser1" का MD5 है, जो "md5" के साथ उपसर्ग करता है। यह सामान्य पोस्टग्रेज सम्मेलन है।

अब अग्रभूमि में PgBouncer शुरू करते हैं:

$ /usr/sbin/pgbouncer pgbouncer.ini
2019-02-05 11:46:18.011 10033 LOG file descriptor limit: 1024 (H:1048576), max_client_conn: 100, max fds possible: 130
2019-02-05 11:46:18.012 10033 LOG listening on 127.0.0.1:16432
2019-02-05 11:46:18.013 10033 LOG listening on unix:/tmp/.s.PGSQL.16432
2019-02-05 11:46:18.014 10033 LOG process up: pgbouncer 1.9.0, libevent 2.0.21-stable (epoll), adns: c-ares 1.12.0, tls: OpenSSL 1.1.0j  20 Nov 2018

हमने अब एक PgBouncer शुरू किया है जो 127.0.0.1 TCP पोर्ट 16432 और साथ ही यूनिक्स डोमेन सॉकेट /tmp/.s.PGSQL.16432 पर सुन रहा है। . इस प्रॉक्सी सर्वर पर उपलब्ध एकमात्र "डेटाबेस" db1 है . एकमात्र उपयोगकर्ता जो इस सर्वर से जुड़ सकता है वह है user1 . आइए psql से जुड़ने की कोशिश करें :

$ psql -U user1 -p 16432 -h localhost db1
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

db1=> select inet_server_addr(), inet_server_port();
 inet_server_addr | inet_server_port
------------------+------------------
 127.0.0.1        |             5432
(1 row)

db1=>

क्लाइंट (psql) लोकलहोस्ट से सफलतापूर्वक जुड़ता है:16432, लेकिन आप देख सकते हैं कि कनेक्शन वास्तव में लोकलहोस्ट के लिए प्रॉक्सी किया जा रहा है:5432।

आप कुछ बार डिस्कनेक्ट और फिर से कनेक्ट करने का प्रयास कर सकते हैं, फिर जांचें कि वास्तविक सर्वर पर कितने कनेक्शन अभी भी आसपास हैं:

postgres=# select count(*) from pg_stat_activity
postgres-#   where datname='db1' and usename='user1';
 count
-------
     1
(1 row)

क्लाइंट के डिस्कनेक्ट होने पर PgBouncer वास्तविक कनेक्शन को डिस्कनेक्ट नहीं करेगा। आप न्यूनतम, अधिकतम और आरक्षित कनेक्शन कॉन्फ़िगर कर सकते हैं जो PgBouncer कॉन्फ़िगरेशन फ़ाइल में प्रत्येक पूल के लिए बनाए रखेगा।

PgBouncer परिनियोजित करना

आप PgBouncer कहाँ स्थापित और चलाते हैं? अलग-अलग फायदे के साथ अलग-अलग जवाब हैं:

  • पोस्टग्रेज सर्वर नोड पर :आप इसे उसी नोड पर PostgreSQLserver के साथ ही स्थापित कर सकते हैं। क्लाइंट पोस्टग्रेज पोर्ट के बजाय PgBouncer से कनेक्ट होते हैं। यह एक "उन्नत" पोस्टग्रेज का प्रभाव है जो आंतरिक रूप से कनेक्शन पूलिंग करता है। आपको PgBouncer के लिए केवल कॉन्फ़िगरेशन फ़ाइलों की एक प्रति बनाए रखनी होगी। दूसरी ओर, इसमें वास्तव में PostgreSQL सर्वर नोड पर कुछ और चलाना शामिल है, जो आसान या अनुमत (फ़ायरवॉल, नीतियां) या यहां तक ​​कि संभव (AWSRDS) नहीं हो सकता है।
  • क्लाइंट नोड्स पर :आप प्रत्येक क्लाइंट नोड में PgBouncer स्थापित कर सकते हैं, उदाहरण के लिए प्रत्येक वेब नोड Apache और PHP चलाता है, और PHP स्क्रिप्ट स्थानीयPgBouncer से जुड़ती है। यह सर्वर सेटअप को परेशान नहीं करने का लाभ है, और पूल कॉन्फ़िगरेशन का उपयोग सर्वर लोड को अनुमानित रखने के लिए किया जा सकता है। दूसरी तरफ, यदि क्लाइंट नोड्स की संख्या बहुत बड़ी है, या लोड के आधार पर बहुत भिन्न हो सकती है/ ट्रैफ़िक, सर्वर को जल्दी से ओवरलोड किया जा सकता है।
  • एक स्टैंडअलोन क्लस्टर के रूप में :तीसरा विकल्प स्वतंत्र, स्टेटलेस PgBouncer नोड्स का एक क्लस्टर है, जो HAProxy जैसे TCP लोड बैलेंसर के सामने है। यह सेटअप, अन्य दो विकल्पों की तुलना में अधिक जटिल होने के बावजूद, अधिकतम नियंत्रण और विन्यास क्षमता प्रदान करता है।

प्रशासन

PgBouncer उपयोगकर्ताओं को "pgbouncer" नामक वर्चुअल डेटाबेस से कनेक्ट करने के लिए व्यवस्थापक के रूप में चिह्नित उपयोगकर्ताओं को सर्वर को नियंत्रित करने और आंकड़े देखने के लिए आदेश जारी करने की अनुमति देता है। इसे आज़माने के लिए, आइए पहले "user1" को एक व्यवस्थापक के रूप में pgbouncer.ini फ़ाइल को संशोधित करके चिह्नित करें:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt
admin_users = user1

अब user1 "pgbouncer" नाम के डेटाबेस से जुड़ सकता है:

$ psql -U user1 -p 16432 -h localhost pgbouncer
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1), server 1.9.0/bouncer)
Type "help" for help.

pgbouncer=#

यहां से, आप किसी विशेष डेटाबेस को सक्षम या अक्षम करने, कॉन्फ़िगरेशन का निरीक्षण और पुनः लोड करने, और बहुत कुछ करने जैसे विभिन्न कार्य कर सकते हैं:

pgbouncer=# RELOAD;
RELOAD
pgbouncer=# DISABLE db1;
DISABLE
pgbouncer=# ENABLE db1;
ENABLE
pgbouncer=# SHOW FDS;
 fd |  task  | user  | database |   addr    | port  |     cancel     | link | client_encoding | std_strings | datestyle | timezone  | pa
----+--------+-------+----------+-----------+-------+----------------+------+-----------------+-------------+-----------+-----------+---
  6 | pooler |       |          | 127.0.0.1 | 16432 |              0 |    0 |                 |             |           |           |
  7 | pooler |       |          | unix      | 16432 |              0 |    0 |                 |             |           |           |
  9 | server | user1 | db1      | 127.0.0.1 |  5432 | 45404395804679 |    0 | UTF8            | on          | ISO, MDY  | localtime |
(3 rows)

निगरानी

PgBouncer के बारे में विभिन्न आँकड़े दिखाने के लिए कमांड भी हैं, जिनमें शामिल हैं:

  • क्वेरी अवधि, क्लाइंट प्रतीक्षा समय, नेटवर्क उपयोग, लेन-देन की संख्या के बारे में प्रति-डेटाबेस आँकड़े
  • सक्रिय और प्रतीक्षारत ग्राहकों की संख्या, निष्क्रिय और उपयोग किए गए सर्वर कनेक्शन के बारे में प्रति-पूल आँकड़े

आंकड़े "SHOW xyz" शैली आदेशों के साथ पुनर्प्राप्त किए जाते हैं, जैसे कि यह फ़ेचपूल-संबंधित आँकड़ों के लिए:

pgbouncer=# SHOW POOLS;
-[ RECORD 1 ]---------
database   | db1
user       | user1
cl_active  | 0
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 1
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | session
-[ RECORD 2 ]---------
database   | pgbouncer
user       | pgbouncer
cl_active  | 1
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 0
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | statement

आगे पढ़ना

PgBouncer होम पेज में PgBouncer की सभी विभिन्न विशेषताओं और कॉन्फ़िगरेशन विकल्पों के बारे में अधिक जानकारी है।

  • पीजीबाउंसर होम पेज
  • PgBouncer GitHub रिपोजिटरी
  • विकिहास कनेक्शन पूलिंग के बारे में जानकारी पोस्ट करता है
  • कनेक्शन पूलिंग के लिए Pgpool एक और विकल्प है

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite3 LIKE या PostgreSQL ILIKE के लिए सामान्य रूबी समाधान?

  2. एक कॉलम में सरणी या एकाधिक मान कैसे स्टोर करें

  3. अजगर के साथ परेशानी manage.py माइग्रेट -> psycopg2 नाम का कोई मॉड्यूल नहीं है

  4. पोस्टग्रेज़ यूयूआईडी जेडीबीसी काम नहीं कर रहा है

  5. उन पंक्तियों को खोजें जहाँ टेक्स्ट सरणी में इनपुट के समान मान होता है