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

PostgreSQL में भौतिक प्रतिकृति तंत्र

Postgres भौतिक और तार्किक प्रतिकृति सुविधाओं के साथ आता है। भौतिक प्रतिकृति के विभिन्न पहलुओं के बारे में अधिक जानने के लिए पढ़ें।

भौतिक प्रतिकृति

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

हॉट, वार्म और "कोल्ड" स्टैंडबाय

एक स्टैंडबाय सर्वर जिसे प्राथमिक वास्तविक समय के साथ यथासंभव अद्यतित रखा जाता है और क्लाइंट को केवल-पढ़ने के लिए लेनदेन निष्पादित करने की अनुमति देता है, उसे हॉट कहा जाता है। स्टैंडबाय, या अधिक लोकप्रिय रूप से एक प्रतिकृति पढ़ें . संस्करण 9 में पोस्टग्रेज़ में हॉट स्टैंडबाय जोड़े गए थे, जिसके पहले केवल गर्म . थे स्टैंडबाय। एक वार्मस्टैंडबाय एक हॉट स्टैंडबाय के समान है, सिवाय इसके कि यह क्लाइंट को इससे कनेक्ट नहीं होने देता।

(इसके अलावा:हॉट स्टैंडबाय अस्थायी टेबल बनाने वाले प्रश्नों को निष्पादित नहीं कर सकते हैं। यह एक पोस्टग्रेस सीमा है।)

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

WAL फ़ाइलें

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

WAL रिकॉर्ड को समान आकार की (आमतौर पर 16MB) फाइलों में विभाजित किया जाता है, जिन्हेंWAL सेगमेंट . कहा जाता है या केवल WAL फ़ाइलें . ये फ़ाइलें pg_wal . नामक निर्देशिका में बनाई गई हैं क्लस्टर डेटा निर्देशिका के अंतर्गत (pg_wal pg_xlog . कहा जाता था 10 से पहले के पोस्टग्रेज संस्करणों में)। पुरानी WAL फ़ाइलों को तब छोड़ दिया जाता है जब उनकी आवश्यकता नहीं रह जाती है (और कुछ कॉन्फ़िगरेशन मापदंडों के आधार पर भी)।

रिकवरी मोड

पोस्टमास्टर को पुनर्प्राप्ति मोड . नामक मोड में प्रारंभ किया जा सकता है , recovery.conf . नामक एक मान्य कॉन्फ़िगरेशन फ़ाइल रखकर क्लस्टर डेटा निर्देशिका में। पुनर्प्राप्ति मोड में, Postgres केवल प्राथमिक सर्वर द्वारा उत्पन्न WAL फ़ाइलों को आयात और लागू करेगा, और स्वयं कोई भी WAL फ़ाइलें उत्पन्न नहीं करेगा। वार्म और हॉटस्टैंडबाय सर्वर रिकवरी मोड में चलते हैं।

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

लॉग शिपिंग

एक ट्रिगर होने की कल्पना करें जिसे प्राथमिक सर्वर पर लागू किया जाएगा जब भी नई WAL फ़ाइल बनाई जाएगी। यह ट्रिगर तब rsync . का उपयोग करके नई WAL फ़ाइल को दूसरी मशीन पर कॉपी कर सकता है , और इसे pg_wal . में रखें पुनर्प्राप्ति मोड में चल रहे पोस्टमास्टर की निर्देशिका। क्या आप इस तरह स्टैंडबाय बना सकते हैं?

इसका उत्तर हां है, और वास्तव में पोस्टग्रेज v9 में स्ट्रीमिंग प्रतिकृति को जोड़ने से पहले यह मानक अभ्यास था। इस अभ्यास को लॉग शिपिंग . कहा जाता है ।

ट्रिगर एक शेल स्क्रिप्ट है, जिसे आर्काइव_कमांड का उपयोग करके कॉन्फ़िगर किया जा सकता है। WAL फ़ाइल का नाम और पथ स्क्रिप्ट को दिया जा सकता है।

WAL संग्रह करना

WAL फ़ाइल पर rsync-ing के बजाय, मान लें कि हम इसे S3 बकेट या NFS-माउंटेड निर्देशिका में कॉपी करते हैं जो स्टैंडबाय मशीन से भी पहुंच योग्य है। इस साझा स्थान में अब प्राथमिक द्वारा उत्पन्न सभी WAL फाइलें होंगी। यह अब एक संग्रह बन जाता है , और WAL फ़ाइलों को संग्रह में संग्रहीत करने की प्रक्रिया को सतत संग्रह . कहा जाता है या बस WAL संग्रह करना

इस ऑपरेशन का उलटा - संग्रह से वाल फाइलों को रिकवरी-मोड पोस्टग्रेज में लाना - को रिस्टोर_कमांड का उपयोग करके कॉन्फ़िगर किया जा सकता है। archive_command के समान , यह भी शेल स्क्रिप्ट का पथ है। पुनर्प्राप्ति मोड में चलने वाला पोस्टमास्टर जानता है कि उसे कौन सी WAL फ़ाइल चाहिए। फ़ाइल का नाम स्क्रिप्ट में भेजा जा सकता है।

एक उदाहरण के रूप में, यहाँ एक S3 बकेट से WAL फ़ाइलों को संग्रहीत करने और लाने के लिए संग्रह और पुनर्स्थापना आदेश दिए गए हैं:

archive_command = 's3cmd put %p s3://BUCKET/path/%f' # in postgresql.conf
restore_command = 's3cmd get s3://BUCKET/path/%f %p' # in recovery.conf

पुनर्प्राप्ति मोड में प्रारंभ करते समय, यदि restore_command कॉन्फ़िगर किया गया है, Postgres पहले संग्रह से WAL फ़ाइलें लाने का प्रयास करेगा।

pg_standby

पुनर्प्राप्ति मोड में, पोस्टग्रेज़ अग्रिम रूप से यह नहीं जान सकता है और न ही यह जान सकता है कि अब तक कितनी WAL फ़ाइलें जनरेट की गई हैं। यदि पुनर्स्थापना_कमांड कॉन्फ़िगर किया गया है, तो पोस्टग्रेज़ इसे प्रगतिशील WAL फ़ाइल नामों के साथ बार-बार लागू करेगा (नाम अनुमानित अनुक्रम में हैं) जब तक कि कमांड कोई त्रुटि नहीं देता।

उदाहरण के लिए, पुनर्स्थापना आदेश WAL फ़ाइलों के अनुरोधों को पूरा करने में सक्षम था000000010000000000000001 के माध्यम से 00000001000000000000001A लेकिन विफल रहता है00000001000000000000001B . के लिए चूंकि यह संग्रह स्थान में नहीं मिला था। अन्य स्रोतों से वाल फाइलों की अनुपस्थिति में, पोस्टग्रेज मान लेंगे कि WALfile 00000001000000000000001B प्राथमिक द्वारा अभी तक उत्पन्न नहीं किया गया है, और 00000001000000000000001A लागू करने के बाद पुनर्प्राप्ति समाप्त कर देगा ।

विचार करें कि क्या होता है यदि पुनर्स्थापना आदेश फ़ाइल के लिए प्रतीक्षा कर रहा था00000001000000000000001B उपलब्ध होने के लिए, त्रुटि के साथ बाहर निकलने के बजाय क्योंकि यह नहीं मिला था। पोस्टग्रेज़ पुनर्स्थापना आदेश पर प्रतीक्षा करना जारी रखेंगे, और इसलिए पुनर्प्राप्ति मोड में बने रहेंगे।

यह एक मान्य कॉन्फ़िगरेशन है, और वार्म स्टैंडबाय सेट करने का एक मान्य तरीका है।

जहाजों को pg_standby नामक कमांड के साथ पोस्टग्रेज करता है, जिसका उपयोग इस तरह से एक गर्म स्टैंडबाय सेटअप करने के लिए किया जा सकता है, जब तक कि संग्रह एक निर्देशिका है।pg_standby फ़ाइल के उपलब्ध होने की प्रतीक्षा करेगा, यदि वह नहीं मिल पाती है।

pg_standby का उपयोग करके आदेश संग्रहीत करें और पुनर्स्थापित करें इस तरह दिखाई देंगे:

archive_command = 'cp %p /some/path/%f'         # in postgresql.conf
restore_command = 'pg_standby /some/path %f %p' # in recovery.conf

स्ट्रीमिंग प्रतिकृति

संग्रहीत WAL फ़ाइलों के साथ-साथ pg_wal . में फ़ाइलों को संसाधित करने के बाद निर्देशिका, Postgres नेटवर्क पर एक प्राथमिक सर्वर से जुड़ सकते हैं और बार-बार नई WAL फ़ाइलों को प्राप्त करने और लागू करने के रूप में वे बनाए जाते हैं। Postgres 9 में जोड़ी गई इस सुविधा को स्ट्रीमिंग प्रतिकृति . कहा जाता है ।

कनेक्ट करने के लिए प्राथमिक सर्वर को पुनर्प्राप्ति.कॉन्फ़ फ़ाइल में निर्दिष्ट किया जा सकता है:

# recovery.conf
standby_mode = on
primary_conninfo = 'host=10.0.1.10 user=repl password=p@ssw0rd'

हॉट स्टैंडबाय

डिफ़ॉल्ट रूप से, जब पुनर्प्राप्ति मोड में, Postgres क्लाइंट कनेक्शन स्वीकार नहीं करेगा, उन्हें "डेटाबेस सिस्टम पुनर्प्राप्ति मोड में है" त्रुटि संदेशों के साथ अस्वीकार कर देगा। लाइन जोड़कर hot_standby = on पुनर्प्राप्ति.कॉन्फ़ में, आप क्लाइंट कनेक्शन पोस्टग्रेज़ स्वीकार कर सकते हैं और उन्हें केवल-पढ़ने के लिए लेनदेन निष्पादित करने की अनुमति दे सकते हैं:

# recovery.conf
hot_standby = on

आमतौर पर हॉट_स्टैंडबाय को बंद करने का कोई कारण नहीं होता है।

PostgreSQL डॉक्स में "हॉट स्टैंडबाय" मोड में स्टैंडबाय सेट अप करने और चलाने के बारे में अधिक जानकारी है।

प्रतिकृति स्लॉट

पोस्टग्रेज 9.4 में प्रतिकृति स्लॉट पेश किए गए थे। वे सटीक रूप से और स्थायी रूप से ट्रैक रखने के लिए एक तंत्र हैं कि प्राथमिक के पीछे स्टैंडबाय कितना पीछे है। यह प्राथमिक को यह सुनिश्चित करने की अनुमति देता है कि स्टैंडबाय को पकड़ने के लिए अभी भी आवश्यक WAL फाइलें हटाई नहीं गई हैं।

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

आप प्रतिकृति स्लॉट के बारे में और अधिक पढ़ सकते हैं।

एक हॉट स्टैंडबाय सेटअप करने के चरण

आइए एक मौजूदा प्राथमिक के लिए हॉट स्टैंडबाय सेटअप करने के लिए आवश्यक चरणों पर एक नज़र डालें।

<मजबूत>1. प्रतिकृति उपयोगकर्ता बनाएं

सबसे पहले, हमें स्टैंडबाय के रूप में कनेक्ट होने के लिए एक उपयोगकर्ता की आवश्यकता है:

$ psql -p 6000
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.

postgres=# CREATE USER repluser REPLICATION PASSWORD 'p@ssw0rd';
CREATE USER

और pg_hba.conf . में संबंधित परिवर्तन :

# TYPE  DATABASE        USER          ADDRESS        METHOD
host    replication     repluser      standby-ip/32  md5
# (replace standby-ip)

आप निश्चित रूप से, PostgreSQL के किसी भी मानक प्रमाणीकरण तंत्र का उपयोग कर सकते हैं। उपयोगकर्ता को प्रतिकृति और लॉगिन विशेषाधिकारों की आवश्यकता होती है और किसी विशिष्ट डेटाबेस तक पहुंच की आवश्यकता नहीं होती है।

pg_hba.conf को प्रभावी करने के लिए परिवर्तनों के लिए प्राथमिक सर्वर को पुनः लोड करना सुनिश्चित करें।

<मजबूत>2. बैकअप लें

स्टैंडबाय को प्राथमिक के बैकअप से प्रारंभ करने की आवश्यकता है। आप pg_basebackup . का उपयोग करके ऐसा कर सकते हैं और करना चाहिए एक नए प्रतिकृति स्लॉट के साथ:

pg_basebackup -h primary-ip -p 6000 -U repluser -C -S slot_standby1 -R -D standby

यह primary-ip:6000 . पर प्राथमिक से जुड़ता है उस उपयोगकर्ता के साथ जिसे हमने अभी बनाया है और निर्देशिका में इसका बैकअप लेता है standby . एक नया प्रतिकृति स्लॉटslot_standby1 बनाया गया है।

<मजबूत>3. रिकवरी जोड़ें.कॉन्फ़ स्टैंडबाय में

हम इस स्लॉट का उपयोग अपने स्टैंडबाय प्रतिकृति स्लॉट के रूप में करेंगे, ताकि बैकअप से निरंतरता बनी रहे।

हमने पूछा था pg_basebackup एक recovery.conf बनाने के लिए हमारे लिए ऊपर ("-R" विकल्प)। आइए उस पर एक नजर डालते हैं:

$ cat standby/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=repluser password=''p@ssw0rd'' host=primary-ip port=6000 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'slot_standby1'

यह वास्तव में बहुत अच्छा है, और हमें इसे और संशोधित करने की आवश्यकता नहीं है। आइए अब स्टैंडबाय की बात करें:

o$ pg_ctl -D standby -l log_standby -o --port=6001 start
waiting for server to start.... done
server started
postgres@stg1:/tmp/demo$ cat log_standby
2019-06-19 09:17:50.032 UTC [21733] LOG:  listening on IPv4 address "127.0.0.1", port 6001
2019-06-19 09:17:50.034 UTC [21733] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.6001"
2019-06-19 09:17:50.067 UTC [21734] LOG:  database system was interrupted; last known up at 2019-06-19 09:12:05 UTC
2019-06-19 09:17:50.111 UTC [21734] LOG:  entering standby mode
2019-06-19 09:17:50.119 UTC [21734] LOG:  redo starts at 0/2000028
2019-06-19 09:17:50.120 UTC [21734] LOG:  consistent recovery state reached at 0/20000F8
2019-06-19 09:17:50.120 UTC [21733] LOG:  database system is ready to accept read only connections
2019-06-19 09:17:50.138 UTC [21739] LOG:  started streaming WAL from primary at 0/3000000 on timeline 1

और बस! लॉग फ़ाइल इंगित करती है कि स्ट्रीमिंग प्रतिकृति चालू है। अब आप पोर्ट 6001 पर स्टैंडबाय से कनेक्ट करने में सक्षम होना चाहिए, केवल-पढ़ने के लिए क्वेरीज़ और वास्तविक समय में प्राथमिक से कम या ज्यादा परिवर्तनों को दोहराते हुए देखें।

अगले चरण

PostgreSQLdocs पोस्टग्रेज की सभी प्रतिकृति-संबंधित विशेषताओं में आगे खुदाई शुरू करने के लिए एक बेहतरीन जगह है। आप विलंबित प्रतिकृति, कैस्केडिंग प्रतिकृति, सिंक्रोनस स्टैंडबाय आदि जैसे विषयों पर गौर करना चाहेंगे।

हालांकि पोस्टग्रेज सुविधाओं के एक प्रभावशाली सेट के साथ आता है, फिर भी ऐसे उपयोग-मामले हैं जो समर्थित नहीं हैं। इस पोस्टग्रेज विकिपेज में तृतीय-पक्ष टूल की एक सूची है जो अतिरिक्त प्रतिकृति-संबंधित कार्यक्षमता प्रदान करते हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL उपयोगकर्ता समूह NL

  2. @BatchSize एक स्मार्ट या बेवकूफी भरा उपयोग?

  3. PostgreSQL में महीने का पहला दिन प्राप्त करें

  4. पोस्टग्रेज में एक जेसन सरणी को पंक्तियों में कैसे बदलें

  5. PostgreSQL में डेटाबेस में टेक्स्ट डेटा लोड करने का कोई तरीका है?