पोस्टग्रेएसक्यूएल, एक आधुनिक और बहुमुखी आरडीबीएमएस होने के बावजूद, किसी एप्लिकेशन को विकसित करने के लिए सेटअप करने और जाने के लिए जानवरों का सबसे आसान नहीं है। यह जानने के लिए पढ़ें कि आप एलटीएस संस्करण पर पोस्टग्रेएसक्यूएल के नवीनतम संस्करण के साथ कैसे शुरुआत कर सकते हैं। उबंटू।
इंस्टॉलेशन
Ubuntu 18.04 PostgreSQL 10 के साथ आता है, लेकिन हम इसके बजाय नवीनतम संस्करण, PostgreSQL 11 को स्थापित करने के लिए PostgreSQL टीम द्वारा होस्ट किए गए APT रिपॉजिटरी का उपयोग कर सकते हैं।
आप इन आदेशों का उपयोग करके भंडार स्थापित कर सकते हैं:
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
और फिर सॉफ्टवेयर का उपयोग करके स्वयं इंस्टॉल करें:
sudo apt-get install postgresql-11
स्थापना कुछ चीजें करती है:
- यह PostgreSQL सर्वर, उपयोगिताओं और एक कमांड-लाइन क्लाइंट को स्थापित करता है जिसेpsql . कहा जाता है ।
- यह एक Linux सिस्टम उपयोगकर्ता बनाता है जिसे पोस्टग्रेज . कहा जाता है . सभी डेटा फ़ाइलें इस उपयोगकर्ता के स्वामित्व में हैं, और सभी प्रक्रियाएं इस उपयोगकर्ता के रूप में चलती हैं।
- यह एक डेटाबेस बनाता है, जिसे पोस्टग्रेज . भी कहा जाता है ।
- यह एक PostgreSQL उपयोगकर्ता बनाता है (नहीं Linux सिस्टम उपयोगकर्ता), जिसेपोस्टग्रेज़ . भी कहा जाता है ।
आप देख सकते हैं कि यह भ्रमित होने लगा है!
डेटाबेस क्लस्टर
आपके नए स्थापित PostgreSQL सर्वर में प्रक्रियाओं का एक सेट होता है जो "डेटाबेस क्लस्टर" के रूप में जाना जाता है। आप यहां प्रक्रियाएं देख सकते हैं:
alice@devbox:~$ ps axfww | grep postgres
4737 ? S 0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
4749 ? Ss 0:00 \_ postgres: 11/main: checkpointer
4750 ? Ss 0:00 \_ postgres: 11/main: background writer
4751 ? Ss 0:00 \_ postgres: 11/main: walwriter
4752 ? Ss 0:00 \_ postgres: 11/main: autovacuum launcher
4753 ? Ss 0:00 \_ postgres: 11/main: stats collector
4754 ? Ss 0:00 \_ postgres: 11/main: logical replication launcher
मुख्य प्रक्रिया (यहां पीआईडी 4737 के साथ) मुख्य प्रक्रिया है जो आगे चलकर बच्चे की प्रक्रियाओं को जन्म देती है - इसे पारंपरिक रूप से "पोस्टमास्टर" प्रक्रिया कहा जाता है।
"क्लस्टर" शब्द का PostgreSQL का उपयोग आधुनिक-दिन के फैंसी डिस्ट्रीब्यूटेडक्लस्टरिंग शब्दजाल से पहले का है - यहाँ इसका मतलब सिर्फ एक पोस्टमास्टर द्वारा एकल मशीन पर डेटाबेस का एक सेट है। क्लस्टर के बारे में यहाँ और पढ़ें।
क्लस्टर में डेटाबेस होते हैं (अभी के लिए हमारे पास सिर्फ एक है, "पोस्टग्रेज") और पोस्टग्रेएसक्यूएल उपयोगकर्ता (फिर से, अभी के लिए सिर्फ एक, जिसे "पोस्टग्रेज" भी कहा जाता है) अन्य बातों के अलावा। जैसा कि आप जानते हैं, क्लस्टर डेटाफ़ाइलों के एक पूरे समूह से जुड़ा है, जो सभी एक ही निर्देशिका के अंतर्गत रहते हैं - इस मामले में /var/lib/postgresql/11/main के अंतर्गत . क्या आपने उपरोक्त पोस्टमास्टर कमांडलाइन में यह पथ देखा है?
जब आपका ऐप, या psql, Postgres से जुड़ता है, तो उसे PostgreSQL उपयोगकर्ता के संदर्भ में ऐसा करना होता है। वहाँ हमेशा है एक कनेक्शन के साथ जुड़ा एक PostgreSQL उपयोगकर्ता। लेकिन, जैसा कि आपने अब तक अनुमान लगाया होगा, एक PostgreSQL उपयोगकर्ता सिस्टम उपयोगकर्ता के अनुरूप हो भी सकता है और नहीं भी।
सिस्टम उपयोगकर्ता और PostgreSQL उपयोगकर्ता
PostgreSQL उपयोगकर्ता SQL कमांड जैसे CREATE ROLE या बंडल किए गए टूल जैसे createb का उपयोग करके बनाए जा सकते हैं।
जब कोई एप्लिकेशन पोस्टग्रेज़ से कनेक्ट करने का प्रयास करता है, तो उसे पोस्टग्रेएसक्यूएल उपयोगकर्ता नाम की आपूर्ति करने की आवश्यकता होती है। आइए देखें कि जब आप psql जैसा PostgreSQL क्लाइंट लॉन्च करते हैं तो क्या होता है:
alice@devbox:~$ psql
psql: FATAL: role "alice" does not exist
यहां, "ऐलिस" आपका लिनक्स सिस्टम उपयोगकर्ता नाम है। psql इस नाम को लेता है और इसे पोस्टग्रेज उपयोगकर्ता नाम के रूप में उपयोग करता है। उस नाम से एक भूमिका (भूमिकाएं "उपयोगकर्ता" या "समूह", BTW के लिए एक प्रकार का सामान्य नाम है) मौजूद नहीं है, जिसके बारे में Postgres शिकायत कर रहा है।
हम जानते हैं कि "पोस्टग्रेज" नाम से एक भूमिका होती है, तो चलिए इसे आजमाते हैं। हम उपयोगकर्ता नाम निर्दिष्ट करने के लिए psql के "-U" पैरामीटर का उपयोग कर सकते हैं:
alice@devbox:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
ठीक है, हम करीब आ रहे हैं - भूमिका / उपयोगकर्ता "पोस्टग्रेज" मौजूद है, लेकिन "पीयरऑथेंटिकेशन" विफल हो गया है। यह "सहकर्मी प्रमाणीकरण" क्या है?
पीयर एंड पासवर्ड ऑथेंटिकेशन
PostgreSQL क्लाइंट जैसे psql या आपका ऐप इन IPC तंत्रों में से किसी एक पर PostgreSQL सर्वर से जुड़ सकता है:
- यूनिक्स डोमेन सॉकेट
- टीसीपी सॉकेट
टीसीपी सॉकेट के विपरीत, यूनिक्स डोमेन सॉकेट क्लाइंट कनेक्शन के सिस्टम यूजर आईडी को मान्य करने की संभावना प्रदान करते हैं। पोस्टग्रेज सर्वर यूनिक्स डोमेन सॉकेट पर आने वाले कनेक्शन की जांच कर सकता है और क्लाइंट के सिस्टम यूजर आईडी को निर्धारित कर सकता है और फिर तय कर सकता है कि इसे एक्सेस देना है या नहीं।
डिफ़ॉल्ट रूप से, आपका सर्वर केवल यूनिक्स डोमेन सॉकेट पर कनेक्शन के लिए सुनता है, टीसीपी/आईपी नहीं।
आइए देखें कि क्या होता है यदि हम psql को सिस्टम उपयोगकर्ता . के रूप में प्रारंभ करने का प्रयास करते हैं पोस्टग्रेज:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=#
वह काम किया! ("\q", "\quit" या ^D
. का प्रयोग करें psql, BTW से बाहर निकलने के लिए।)
सहकर्मी प्रमाणीकरण में, यदि क्लाइंट कनेक्शन यूनिक्स डोमेन सॉकेट का उपयोग करके बनाया गया है और क्लाइंट प्रक्रिया में वही सिस्टम उपयोगकर्ता नाम है जो PostgreSQLuser के रूप में कनेक्ट करने का प्रयास कर रहा है, तो प्रमाणीकरण सफल माना जाता है।
PostgreSQL उपयोगकर्ताओं को वैकल्पिक रूप से एक पासवर्ड भी सौंपा जा सकता है, और आप पासवर्ड का उपयोग करके आने वाले कनेक्शनों को मान्य करने के लिए PostgreSQL से पूछ सकते हैं। पर कैसे? वह पहेली का अगला भाग है।
pg_hba.conf
अब /etc/postgresql/11/main/pg_hba.conf
पर स्थित (इन) प्रसिद्ध pg_hba.conf कॉन्फ़िगरेशन फ़ाइल को खोलने का समय आ गया है :
sudo vim /etc/postgresql/11/main/pg_hba.conf
HBA,होस्ट-आधारित प्रमाणीकरण के लिए खड़ा है। मूल रूप से, इस फ़ाइल का उपयोग यह नियंत्रित करने के लिए किया जाता है कि PostgreSQL उपयोगकर्ता कैसे प्रमाणित होते हैं। यह फ़ाइल संभवतः PostgreSQL सीखने की अवस्था का सबसे गैर-सहज हिस्सा है। संदर्भ दस्तावेज यहाँ है, आपको इसे बाद में पढ़ना चाहिए।
यहां पहली (गैर-टिप्पणी) पंक्ति है:
local all postgres peer
जो पोस्टग्रेज को "सभी" डेटाबेस से "स्थानीय" (यूनिक्स डोमेन) कनेक्शन स्वीकार करने के लिए कहता है, "सहकर्मी" प्रमाणीकरण का उपयोग करके उपयोगकर्ता "पोस्टग्रेज" के रूप में प्रमाणित करता है। यही कारण है कि सिस्टम उपयोगकर्ता के रूप में कनेक्ट करना "पोस्टग्रेज" बॉक्स से बाहर काम करता है।
इस फ़ाइल में पंक्तियों का क्रम महत्वपूर्ण है, पहली मिलान पंक्ति जीत जाती है। आइए दूसरी पंक्ति देखें:
host all all 127.0.0.1/32 md5
यह लाइन "सभी" उपयोगकर्ताओं को स्थानीयहोस्ट ("127.0.0.1/32") से "सभी" डेटाबेस में टीसीपी/आईपी ("होस्ट") का उपयोग करके लॉगिन करने की अनुमति देती है, अगर वे "एमडी 5" विधि का उपयोग करके पासवर्ड प्रमाणीकरण में सफल होते हैं।पी>
हम जितना कवर कर सकते हैं उससे कहीं अधिक पासवर्ड प्रमाणीकरण विधियां (md5, scram-sha-256, gss,ldap,…) हैं, तो चलिए सरल उदाहरणों पर वापस आते हैं।
लेकिन पहले, हमें यह सुनिश्चित करने की आवश्यकता है कि PostgreSQL TCP/IP कनेक्शन भी स्वीकार कर रहा है। उसके लिए, हमें मुख्य कॉन्फ़िगरेशन फ़ाइल को संपादित करने की आवश्यकता है।
postgresql.conf
फ़ाइल /etc/postgresql/11/main/postgresql.conf आपके PostgreSQL क्लस्टर के लिए मुख्य कॉन्फ़िगरेशन फ़ाइल है। इस फ़ाइल में एक बहुत कुछ है सेटिंग्स का, और उन सभी का क्या मतलब है, यह समझना कोई आसान काम नहीं है। अभी के लिए, आइए सबसे पहले सेटिंग देखें:
#listen_addresses = 'localhost'
यह पंक्ति डिफ़ॉल्ट रूप से टिप्पणी की गई है, आइए इसे पढ़ने के लिए इसे अनकमेंट करें:
listen_addresses = 'localhost'
यह PostgreSQL को लोकलहोस्ट, पोर्ट 5432 (डिफ़ॉल्ट) पर आने वाले टीसीपी/आईपी कनेक्शन के लिए सुनने देगा। परिवर्तनों को सहेजें (ऐसा करने के लिए आपको "रूट" होना होगा), और परिवर्तनों को प्रभावी करने के लिए पोस्टग्रेज सर्वर को पुनरारंभ करें:
sudo systemctl restart postgresql
(ध्यान दें कि अधिकांश सेटिंग्स में कुछ बदलाव के लिए आपको बस "पुनः लोड" करना होगा, न कि "पुनरारंभ करना", लेकिन इसके लिए "पुनरारंभ करना" आवश्यक है)।
अब हम पोस्टग्रेज़ को पोर्ट 5432 पर सुनते हुए देख सकते हैं, जो 127.0.0.1 के लिए बाध्य है:
alice@devbox:~$ sudo netstat -tnlp | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 8408/postgres
आइए अब एक ऐप द्वारा उपयोग के लिए एक नया उपयोगकर्ता और डेटाबेस सेट करें।
ऐप्लिकेशन सेटअप
आइए परिवर्तन करने के लिए सुपरयुसर "पोस्टग्रेज" के रूप में जुड़ें:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=# create user myapp_user password 's3cr3t';
CREATE ROLE
postgres=# create database myapp owner myapp_user;
CREATE DATABASE
postgres=#
हमने अब myapp
. नामक एक डेटाबेस बनाया है और एक उपयोगकर्ता जिसे myapp_user
. कहा जाता है , पासवर्ड के साथ s3cr3t
. डेटाबेस खाली है, और उपयोगकर्ता के पास होगाmyapp_user
, जिसका अर्थ है कि myapp_user
. के रूप में कनेक्ट करके क्लाइंट अधिकांश डीडीएल/डीएमएल कमांड निष्पादित करने में सक्षम होगा।
आइए अब इस ऐप उपयोगकर्ता के रूप में ऐप डेटाबेस से कनेक्ट करें:
alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
Password for user myapp_user:
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
myapp=>
वो कर गया काम! अब आप 127.0.0.1 पर aTCP/IP कनेक्शन पर SSL का उपयोग करके "myapp" (प्रॉम्प्ट देखें) से कनेक्ट हैं। ध्यान दें कि हमने डेटाबेस नाम को psql के लिए कमांड-लाइन पर भी निर्दिष्ट किया है। ऐतिहासिक कारणों से, यदि इसे छोड़ दिया जाता है, तो डेटाबेस नाम को सिस्टम उपयोगकर्ता नाम ("एलिस" यहां) के समान माना जाता है, जो कि हम नहीं चाहते हैं। PostgreSQL उपयोगकर्ता नाम भी निर्दिष्ट किया गया है ("-U myapp_user")।
यदि आपको अन्य मशीनों से कनेक्ट करने की आवश्यकता है, तो आपको pg_hba.conf
संपादित करना होगा इस तरह की पंक्तियाँ जोड़ने के लिए:
# existing entry, allows connections from localhost
host all all 127.0.0.1/32 md5
# new entry to allow connections from 10.1.2.0/24 subnet,
# only to myapp database for myapp_user
host myapp myapp_user 10.1.2.0/24 md5
और प्रभावी परिवर्तन के लिए PostgreSQL ("sudo systemctl reload postgresql") को पुनः लोड करें।
इसके साथ, अब आप अपने ऐप्स में डेटाबेस कनेक्शन स्ट्रिंग्स का उपयोग कर सकते हैं:
# URL format
postgresql://myapp_user:[email protected]/myapp
# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
तैयार!
यह आपको आपके ऐप के लिए एक समर्पित डेटाबेस और उपयोगकर्ता के साथ सेटअप करना चाहिए। आपका ऐप डेवलपमेंट फ्रेमवर्क (जैसे Django, Drupal आदि) इस डेटाबेस में ऑब्जेक्ट (जैसे टेबल, व्यू) बनाने और डेटा को प्रबंधित करने में सक्षम होना चाहिए।