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

PostgreSQL में तार्किक प्रतिकृति का अवलोकन

PostgreSQL दुनिया के सबसे उन्नत ओपन सोर्स डेटाबेस में से एक है जिसमें बहुत सारी बेहतरीन सुविधाएँ हैं। उनमें से एक स्ट्रीमिंग प्रतिकृति (भौतिक प्रतिकृति) है जिसे PostgreSQL 9.0 में पेश किया गया था। यह XLOG रिकॉर्ड पर आधारित है जो गंतव्य सर्वर पर स्थानांतरित हो जाता है और वहां लागू हो जाता है। हालाँकि, यह क्लस्टर आधारित है और हम एकल डेटाबेस या एकल ऑब्जेक्ट (चयनात्मक प्रतिकृति) प्रतिकृति नहीं कर सकते हैं। वर्षों से, हम चयनात्मक या आंशिक प्रतिकृति के लिए स्लोनी, बुकार्डो, बीडीआर, आदि जैसे बाहरी उपकरणों पर निर्भर रहे हैं क्योंकि पोस्टग्रेएसक्यूएल 9.6 तक कोर स्तर पर कोई सुविधा नहीं थी। हालाँकि, PostgreSQL 10 लॉजिकल प्रतिकृति नामक एक सुविधा के साथ आया, जिसके माध्यम से हम डेटाबेस/ऑब्जेक्ट स्तर की प्रतिकृति कर सकते हैं।

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

इस ब्लॉग पोस्ट में, हम चर्चा करने जा रहे हैं:

  • यह कैसे काम करता है - आर्किटेक्चर
  • विशेषताएं
  • मामलों का उपयोग करें - जब यह उपयोगी हो
  • सीमाएं
  • इसे कैसे प्राप्त करें

यह कैसे काम करता है - तार्किक प्रतिकृति वास्तुकला

तार्किक प्रतिकृति एक प्रकाशित और सदस्यता अवधारणा (प्रकाशन और सदस्यता) को लागू करती है। यह कैसे काम करता है, इस पर एक उच्च स्तरीय वास्तु आरेख नीचे दिया गया है।

मूल तार्किक प्रतिकृति वास्तुकला

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

आप दोहराए जाने वाले ऑब्जेक्ट (INSERT, UPDATE, और DELETE) के परिवर्तनों को सीमित कर सकते हैं। डिफ़ॉल्ट रूप से, सभी ऑपरेशन प्रकार दोहराए जाते हैं। आपके पास उस ऑब्जेक्ट के लिए कॉन्फ़िगर की गई प्रतिकृति पहचान होनी चाहिए जिसे आप प्रकाशन में जोड़ना चाहते हैं। यह अद्यतन दोहराने और संचालन को हटाने के लिए है। प्रतिकृति पहचान प्राथमिक कुंजी या अद्वितीय अनुक्रमणिका हो सकती है। यदि तालिका में प्राथमिक कुंजी या अद्वितीय अनुक्रमणिका नहीं है, तो इसे प्रतिकृति पहचान "पूर्ण" पर सेट किया जा सकता है जिसमें यह सभी स्तंभों को कुंजी के रूप में लेता है (पूरी पंक्ति कुंजी बन जाती है)।

आप CREATE PUBLICATION का उपयोग करके एक प्रकाशन बना सकते हैं। कुछ व्यावहारिक आदेश "इसे कैसे प्राप्त करें" खंड में शामिल हैं।

सदस्यता को गंतव्य सर्वर पर परिभाषित किया जा सकता है और जिस नोड पर इसे परिभाषित किया गया है उसे "ग्राहक" कहा जाता है। स्रोत डेटाबेस से कनेक्शन सदस्यता में परिभाषित किया गया है। सब्सक्राइबर नोड किसी भी अन्य स्टैंड अलोन डेटाबेस के समान है, और आप इसे आगे की सदस्यता के लिए एक प्रकाशन के रूप में भी उपयोग कर सकते हैं।

सदस्यता को क्रिएट सब्सक्रिप्शन का उपयोग करके जोड़ा जाता है और इसे किसी भी समय ALTER SUBSCRIPTION कमांड का उपयोग करके रोका / फिर से शुरू किया जा सकता है और DROP SUBSCRIPTION का उपयोग करके हटाया जा सकता है।

एक बार सदस्यता बन जाने के बाद, तार्किक प्रतिकृति प्रकाशक डेटाबेस पर डेटा के एक स्नैपशॉट की प्रतिलिपि बनाता है। एक बार ऐसा करने के बाद, यह डेल्टा परिवर्तनों की प्रतीक्षा करता है और जैसे ही वे होते हैं, उन्हें सदस्यता नोड में भेज देता है।

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

यह इन सभी चरणों को सेट करते समय लॉग फ़ाइलों में लॉग करता है। हम संदेशों को बाद में पोस्ट में "इसे कैसे प्राप्त करें" अनुभाग में देख सकते हैं।

तार्किक प्रतिकृति की विशेषताएं

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

केस का उपयोग करें - तार्किक प्रतिकृति कब उपयोगी है?

तार्किक प्रतिकृति का उपयोग कब करना है, यह जानना बहुत महत्वपूर्ण है। अन्यथा, यदि आपका उपयोग मामला मेल नहीं खाता है तो आपको अधिक लाभ नहीं मिलेगा। तो, यहाँ कुछ उपयोग के मामले दिए गए हैं कि तार्किक प्रतिकृति का उपयोग कब करें:

  • यदि आप विश्लेषणात्मक उद्देश्यों के लिए एकाधिक डेटाबेस को एक डेटाबेस में समेकित करना चाहते हैं।
  • यदि आपकी आवश्यकता PostgreSQL के विभिन्न प्रमुख संस्करणों के बीच डेटा को दोहराने की है।
  • यदि आप किसी एकल डेटाबेस या डेटाबेस के सबसेट में अन्य डेटाबेस में वृद्धिशील परिवर्तन भेजना चाहते हैं।
  • यदि आप उपयोगकर्ताओं के विभिन्न समूहों को प्रतिरूपित डेटा तक पहुंच प्रदान कर रहे हैं।
  • यदि एकाधिक डेटाबेस के बीच डेटाबेस का सबसेट साझा कर रहा है।

तार्किक प्रतिकृति की सीमाएं

तार्किक प्रतिकृति की कुछ सीमाएँ हैं जिन पर काबू पाने के लिए समुदाय लगातार काम कर रहा है:

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

तार्किक प्रतिकृति कैसे प्राप्त करें

यहां बुनियादी तार्किक प्रतिकृति प्राप्त करने के चरण दिए गए हैं। हम बाद में और अधिक जटिल परिदृश्यों के बारे में चर्चा कर सकते हैं।

  1. प्रकाशन और सदस्यता के लिए दो अलग-अलग उदाहरणों को प्रारंभ करें और प्रारंभ करें।

    C1MQV0FZDTY3:bin bajishaik$ export PATH=$PWD:$PATH
    C1MQV0FZDTY3:bin bajishaik$ which psql
    /Users/bajishaik/pg_software/10.2/bin/psql
    C1MQV0FZDTY3:bin bajishaik$ ./initdb -D /tmp/publication_db
    
    C1MQV0FZDTY3:bin bajishaik$ ./initdb -D /tmp/subscription_db
  2. इंस्टेंस शुरू करने से पहले बदले जाने वाले पैरामीटर (प्रकाशन और सदस्यता इंस्टेंस दोनों के लिए).

    C1MQV0FZDTY3:bin bajishaik$ tail -3 /tmp/publication_db/postgresql.conf
    listen_addresses='*'
    port = 5555
    wal_level= logical
    
    
    C1MQV0FZDTY3:bin bajishaik$ pg_ctl -D /tmp/publication_db/ start
    waiting for server to start....2018-03-21 16:03:30.394 IST [24344] LOG:  listening on IPv4 address "0.0.0.0", port 5555
    2018-03-21 16:03:30.395 IST [24344] LOG:  listening on IPv6 address "::", port 5555
    2018-03-21 16:03:30.544 IST [24344] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5555"
    2018-03-21 16:03:30.662 IST [24345] LOG:  database system was shut down at 2018-03-21 16:03:27 IST
    2018-03-21 16:03:30.677 IST [24344] LOG:  database system is ready to accept connections
     done
    server started
    
    C1MQV0FZDTY3:bin bajishaik$ tail -3 /tmp/subscription_db/postgresql.conf
    listen_addresses='*'
    port=5556
    wal_level=logical
    
    C1MQV0FZDTY3:bin bajishaik$ pg_ctl -D /tmp/subscription_db/ start
    waiting for server to start....2018-03-21 16:05:28.408 IST [24387] LOG:  listening on IPv4 address "0.0.0.0", port 5556
    2018-03-21 16:05:28.408 IST [24387] LOG:  listening on IPv6 address "::", port 5556
    2018-03-21 16:05:28.410 IST [24387] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5556"
    2018-03-21 16:05:28.460 IST [24388] LOG:  database system was shut down at 2018-03-21 15:59:32 IST
    2018-03-21 16:05:28.512 IST [24387] LOG:  database system is ready to accept connections
     done
    server started

    बुनियादी सेटअप के लिए अन्य पैरामीटर डिफ़ॉल्ट रूप से हो सकते हैं।

  3. प्रतिकृति की अनुमति देने के लिए pg_hba.conf फ़ाइल बदलें। ध्यान दें कि ये मान आपके परिवेश पर निर्भर हैं, हालांकि, यह केवल एक बुनियादी उदाहरण है (प्रकाशन और सदस्यता दोनों उदाहरणों के लिए)।

    C1MQV0FZDTY3:bin bajishaik$ tail -1 /tmp/publication_db/pg_hba.conf
     host     all     repuser     0.0.0.0/0     md5
    C1MQV0FZDTY3:bin bajishaik$ tail -1 /tmp/subscription_db/pg_hba.conf
     host     all     repuser     0.0.0.0/0     md5
    
    C1MQV0FZDTY3:bin bajishaik$ psql -p 5555 -U bajishaik -c "select pg_reload_conf()"
    Timing is on.
    Pager usage is off.
    2018-03-21 16:08:19.271 IST [24344] LOG:  received SIGHUP, reloading configuration files
     pg_reload_conf
    ----------------
     t
    (1 row)
    
    Time: 16.103 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -p 5556 -U bajishaik -c "select pg_reload_conf()"
    Timing is on.
    Pager usage is off.
    2018-03-21 16:08:29.929 IST [24387] LOG:  received SIGHUP, reloading configuration files
     pg_reload_conf
    ----------------
     t
    (1 row)
    
    Time: 53.542 ms
    C1MQV0FZDTY3:bin bajishaik$
  4. प्रकाशन उदाहरण पर कुछ डेटा को दोहराने और सम्मिलित करने के लिए कुछ परीक्षण तालिकाएँ बनाएँ।

    postgres=# create database source_rep;
    CREATE DATABASE
    Time: 662.342 ms
    postgres=# \c source_rep
    You are now connected to database "source_rep" as user "bajishaik".
    source_rep=# create table test_rep(id int primary key, name varchar);
    CREATE TABLE
    Time: 63.706 ms
    source_rep=# create table test_rep_other(id int primary key, name varchar);
    CREATE TABLE
    Time: 65.187 ms
    source_rep=# insert into test_rep values(generate_series(1,100),'data'||generate_series(1,100));
    INSERT 0 100
    Time: 2.679 ms
    source_rep=# insert into test_rep_other  values(generate_series(1,100),'data'||generate_series(1,100));
    INSERT 0 100
    Time: 1.848 ms
    source_rep=# select count(1) from test_rep;
     count
    -------
       100
    (1 row)
    
    Time: 0.513 ms
    source_rep=# select count(1) from test_rep_other ;
     count
    -------
       100
    (1 row)
    
    Time: 0.488 ms
    source_rep=#
  5. सब्सक्रिप्शन इंस्टेंस पर तालिकाओं की संरचना बनाएं क्योंकि तार्किक प्रतिकृति संरचना को दोहराती नहीं है।

    postgres=# create database target_rep;
    CREATE DATABASE
    Time: 514.308 ms
    postgres=# \c target_rep
    You are now connected to database "target_rep" as user "bajishaik".
    target_rep=# create table test_rep_other(id int primary key, name varchar);
    CREATE TABLE
    Time: 9.684 ms
    target_rep=# create table test_rep(id int primary key, name varchar);
    CREATE TABLE
    Time: 5.374 ms
    target_rep=#
  6. प्रकाशन उदाहरण (पोर्ट 5555) पर प्रकाशन बनाएँ।

    source_rep=# CREATE PUBLICATION mypub FOR TABLE test_rep, test_rep_other;
    CREATE PUBLICATION
    Time: 3.840 ms
    source_rep=#
  7. चरण 6 में बनाए गए प्रकाशन के लिए सदस्यता उदाहरण (पोर्ट 5556) पर सदस्यता बनाएं।

    target_rep=# CREATE SUBSCRIPTION mysub CONNECTION 'dbname=source_rep host=localhost user=bajishaik port=5555' PUBLICATION mypub;
    NOTICE:  created replication slot "mysub" on publisher
    CREATE SUBSCRIPTION
    Time: 81.729 ms

    लॉग से:

    2018-03-21 16:16:42.200 IST [24617] LOG:  logical decoding found consistent point at 0/1616D80
    2018-03-21 16:16:42.200 IST [24617] DETAIL:  There are no running transactions.
    target_rep=# 2018-03-21 16:16:42.207 IST [24618] LOG:  logical replication apply worker for subscription "mysub" has started
    2018-03-21 16:16:42.217 IST [24619] LOG:  starting logical decoding for slot "mysub"
    2018-03-21 16:16:42.217 IST [24619] DETAIL:  streaming transactions committing after 0/1616DB8, reading WAL from 0/1616D80
    2018-03-21 16:16:42.217 IST [24619] LOG:  logical decoding found consistent point at 0/1616D80
    2018-03-21 16:16:42.217 IST [24619] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.219 IST [24620] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep" has started
    2018-03-21 16:16:42.231 IST [24622] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep_other" has started
    2018-03-21 16:16:42.260 IST [24621] LOG:  logical decoding found consistent point at 0/1616DB8
    2018-03-21 16:16:42.260 IST [24621] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.267 IST [24623] LOG:  logical decoding found consistent point at 0/1616DF0
    2018-03-21 16:16:42.267 IST [24623] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.304 IST [24621] LOG:  starting logical decoding for slot "mysub_16403_sync_16393"
    2018-03-21 16:16:42.304 IST [24621] DETAIL:  streaming transactions committing after 0/1616DF0, reading WAL from 0/1616DB8
    2018-03-21 16:16:42.304 IST [24621] LOG:  logical decoding found consistent point at 0/1616DB8
    2018-03-21 16:16:42.304 IST [24621] DETAIL:  There are no running transactions.
    2018-03-21 16:16:42.306 IST [24620] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep" has finished
    2018-03-21 16:16:42.308 IST [24622] LOG:  logical replication table synchronization worker for subscription "mysub", table "test_rep_other" has finished

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

  8. सब्सक्रिप्शन इंस्टेंस पर डेटा सत्यापित करें।

    target_rep=# select count(1) from test_rep;
     count
    -------
       100
    (1 row)
    
    Time: 0.927 ms
    target_rep=# select count(1) from test_rep_other ;
     count
    -------
       100
    (1 row)
    
    Time: 0.767 ms
    target_rep=#

    जैसा कि आप देख सकते हैं, डेटा को प्रारंभिक स्नैपशॉट के माध्यम से दोहराया गया है।

  9. डेल्टा परिवर्तन सत्यापित करें।

    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5555 -d source_rep -c "insert into test_rep values(generate_series(101,200), 'data'||generate_series(101,200))"
    INSERT 0 100
    Time: 3.869 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5555 -d source_rep -c "insert into test_rep_other values(generate_series(101,200), 'data'||generate_series(101,200))"
    INSERT 0 100
    Time: 3.211 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5556 -d target_rep -c "select count(1) from test_rep"
     count
    -------
       200
    (1 row)
    
    Time: 1.742 ms
    C1MQV0FZDTY3:bin bajishaik$ psql -d postgres -p 5556 -d target_rep -c "select count(1) from test_rep_other"
     count
    -------
       200
    (1 row)
    
    Time: 1.480 ms
    C1MQV0FZDTY3:bin bajishaik$

तार्किक प्रतिकृति के मूल सेटअप के लिए ये चरण हैं।


  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 प्रक्रिया के नाम

  2. पोस्टग्रेज कॉलम मौजूद नहीं है

  3. PostgreSQL ORDER BY क्लॉज में ALIAS का उपयोग कैसे करें?

  4. /usr/bin/clang के साथ पाइप इंस्टाल विफल हो जाता है:ऐसी कोई फ़ाइल या निर्देशिका नहीं

  5. कैसे to_char () PostgreSQL में काम करता है