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

स्लोनी स्लेव नोड पर केवल INSERTs को DELETEs/UPDATEs को दोहराने के लिए कैसे?

सबसे पहले, हमें यह जानना होगा कि ऐसी आवश्यकता की आवश्यकता क्यों है। IMO, लक्ष्य डेटाबेस (स्लेव नोड) पर किसी प्रकार के ऐतिहासिक डेटा को बनाए रखने के लिए इसकी बिल्कुल व्यावसायिक आवश्यकता है। विशेष रूप से, कई स्लेव नोड्स में से एक स्लेव नोड में से एक डेटा के पहले रूप को बनाए रखने के लिए जब इसे शुरू में डेटाबेस में लिखा जाता है।

इस आवश्यकता को पूरा करने के लिए, हमें स्लेव नोड पर TRIGGERs/RULEs जैसे कुछ प्रकार के फ़िल्टर के साथ आना चाहिए ताकि यह DELETE और UPDATE स्टेटमेंट को रिले करने से बच सके। चूंकि हम स्लोनी-आई के साथ काम कर रहे हैं, इसमें डीएमएल को फ़िल्टर करने के लिए ऐसा अंतर्निहित तंत्र नहीं है, जबकि उन्हें दास नोड पर फिर से खेलना है, हालांकि यह मास्टर नोड से सभी घटनाओं को इकट्ठा करता है। (AFAIK Mysql, Oracle, SQL Server समर्थन फ़िल्टर करते हैं )।

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

ERROR:  duplicate key value violates unique constraint "reptest_pkey"
DETAIL: Key (id)=(2) already exists.
CONTEXT: SQL statement "INSERT INTO "public"."reptest" ("id", "name") VALUES ($1, $2);"
.....
or
....
CONTEXT: SQL statement "UPDATE ONLY "public"."reptest" SET "id" = $1 WHERE "id" = $2;"
2014-11-17 23:18:53 PST ERROR remoteWorkerThread_1: SYNC aborted

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

चूंकि Slony-I के साथ अकेले DML नियम संभव नहीं हैं, हम PostgreSQL CREATE RULE… ON DELETE/ON UPDATE DO INSTETAD कुछ भी नहीं का उपयोग कर सकते हैं और उस नियम को ALTER TABLE द्वारा लागू कर सकते हैं… DELETE/UPDATE कथन को रद्द करने के लिए प्रतिकृति नियम को सक्षम करें। इस विकल्प का उपयोग करने में बहुत अनुशासन लगता है, इसलिए आप यह सुनिश्चित कर सकते हैं कि आपका आवेदन और स्टाफ सदस्य वास्तव में इन नियमों का पालन करें।

चरणों के साथ जारी रखने के लिए, आपके पास स्लोनी सेटअप होना चाहिए, यदि आपको सेटअप करने की आवश्यकता है तो आप यहां मेरी पिछली पोस्ट का उल्लेख कर सकते हैं।

स्लेव नोड पर कदम (मास्टर डीबी:पोस्टग्रेज, स्लेव डीबी:डेमो, पोर्ट:5432):

1. स्लोन डेमॉन को रोकें
2. DELETE पर बनाएं और अपडेट पर कुछ भी न करें नियम बनाएं

demo=# CREATE RULE void_delete AS ON DELETE TO reptest DO INSTEAD NOTHING;
CREATE RULE
demo=# CREATE RULE void_update AS ON UPDATE TO reptest DO INSTEAD NOTHING;
CREATE RULE

3. टेबल पर नियम लागू करें

demo=# ALTER TABLE reptest ENABLE REPLICA RULE void_delete;
ALTER TABLE
demo=# ALTER TABLE reptest ENABLE REPLICA RULE void_update ;
ALTER TABLE

4. स्लोन डेमॉन शुरू करें

अब, आप नीचे देख सकते हैं कि UPDATE/DELETE का स्लेव नोड पर कोई प्रभाव नहीं है:

postgres=# delete from reptest where id =2;
DELETE 1
postgres=# update reptest set id=2 where id=1;
UPDATE 1

--On Master
postgres=# select * from reptest ;
id | name
----+------------
2 | A
(1 row)

--On Slave
demo=# select * from reptest ;
id | name
----+------------
1 | A
2 | C
(2 rows)

यदि INSERT स्टेटमेंट को मान 1 के साथ निष्पादित किया जाता है तो यह प्रतिकृति को तोड़ देगा। ध्यान दें…!!

याद रखें, इस अनुरोध को पूरा करने के अन्य तरीके हैं जैसे dblinks, ट्रिगर जैसे कि पहले हटाएं ... फ़ंक्शन से NULL मान लौटाएं, लेकिन मेरा मानना ​​​​है कि जब आप स्लोनी प्रतिकृति के साथ काम कर रहे हों तो नियम/प्रतिकृति नियम का उपयोग करना सबसे प्रभावी तरीका होगा।

अब तक आपने पोस्टग्रेएसक्यूएल 9.4 में लॉजिकल डिकोडिंग प्रतिकृति स्लॉट नई सुविधा पर कई ब्लॉग पढ़े होंगे, आशा है कि भविष्य में इसमें स्लेव पर फ़िल्टर डीएमएल की अवधारणा शामिल हो सकती है।

आने के लिए धन्यवाद।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PITR करते समय, क्या PostgreSQL में विराम देना/फिर से शुरू करना संभव होगा?

  2. क्या JDBC युक्ति '?' को रोकती है? एक ऑपरेटर के रूप में इस्तेमाल होने से (उद्धरण के बाहर)?

  3. Psql स्क्रिप्ट चलाते समय जानकारी संदेशों को कैसे दबाएं?

  4. क्या समाप्ति समय निर्धारित करने का कोई तरीका है, जिसके बाद PostgreSQL में डेटा प्रविष्टि स्वचालित रूप से हटा दी जाती है?

  5. PostgreSQL में एक तारीख में महीने जोड़ें