दो अलग-अलग डेटाबेस के बीच डेटा को सिंक्रनाइज़ करने का सबसे अच्छा तरीका


24

मुझे दो बड़े डेटाबेसों के बीच डेटा सिंक्रनाइज़ेशन को लागू करना होगा जिसमें पूरी तरह से अलग संरचनाएं हैं। मूल रूप से, मुझे पहले डेटाबेस में अलग-अलग तालिकाओं में उत्पादों के बारे में कुछ डेटा को इकट्ठा करने और दूसरे डेटाबेस में अन्य तालिकाओं के लिए उन्हें फिर से व्यवस्थित करने की आवश्यकता है।

पहली बार मेरे उत्पाद बनाना बहुत जटिल नहीं है। लेकिन मैं प्रत्येक उत्पाद के बारे में कुछ विशिष्ट डेटा - सभी डेटा नहीं - को अपडेट करने का तरीका ढूंढ रहा हूं।

जाहिर है, कुछ मुद्दे हैं जो इसे मुश्किल बनाते हैं।

  • मुझे चुनिंदा क्वेरीज़ के अलावा स्रोत डेटाबेस पर कुछ भी करने की अनुमति नहीं है।
  • लक्ष्य डेटाबेस पर, मैं सामान्य प्रश्न (चयन, अद्यतन, सम्मिलित करना, बना सकता हूं) कर सकता हूं, लेकिन मैं मौजूदा संरचना / तालिकाओं को संशोधित नहीं कर सकता।
  • लक्ष्य और स्रोत db में पूरी तरह से अलग संरचनाएं हैं, टेबल बिल्कुल समान नहीं हैं, इसलिए डेटा को वास्तव में पुनर्व्यवस्थित करना होगा - तालिकाओं की तुलना करना काम करेगा।
  • लक्ष्य डेटाबेस एक MySQL सर्वर का उपयोग करता है - स्रोत DB2 हो सकता है।
  • कहीं भी "अपडेटेड टाइम" फ़ील्ड नहीं हैं।

तो पूरी प्रक्रिया को एक एकल पायथन (आदर्श) स्क्रिप्ट में करने की आवश्यकता है।

मैं लक्ष्य डेटाबेस में अद्यतन करने के लिए फ़ील्ड्स के आधार पर प्रत्येक उत्पाद के लिए एक हैश बनाने के बारे में सोचता हूं: md5 (कोड + विवरण + आपूर्तिकर्ता + लगभग 10 अन्य फ़ील्ड)। स्रोत डेटाबेस से दैनिक आधार पर एक ही डेटा पर आधारित एक नया हैश बनाया जाएगा। मैं प्रदर्शन के उद्देश्य के लिए सभी हैश को एक ही तालिका (आइटम कोड, current_hash, old_hash) में संग्रहीत करूंगा। फिर उत्पाद की तुलना करें और अपडेट करें यदि नया हैश पुराने से अलग है।

लगभग 500 000 उत्पाद हैं इसलिए मैं प्रदर्शन के बारे में थोड़ा चिंतित हूं।

क्या यह जाने का अच्छा तरीका है?


2
क्या वे चाहते हैं कि आप इसे आंखों पर पट्टी बांधकर भी करें? यह मेरी समस्या अभी है ...
कप्तान हाइपरटेक्स्ट

1
@ क्या, यह कैसे चला गया? अब आप जो भी सलाह दे सकते हैं?
एडविन इवांस

4
@ एडविन इवांस मूल रूप से मैं अपने पहले विचार के साथ रहा, लेकिन विशेष रूप से बाधाओं के कारण मेरे पास था। मेरी स्क्रिप्ट सभी वस्तुओं के लिए मुख्य डेटा के आधार पर md5 हैश बनाता है। फिर मैं पिछले हैश के खिलाफ तुलना करता हूं। यदि हैश अलग है, तो यह आइटम के लिए सभी डेटा लोड करता है और सब कुछ अपडेट करता है। यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन यह रात में चलता है और प्रदर्शन सभ्य हैं।
नीव

जवाबों:


9

यह बहुत कुछ है जो मैं पिछले कुछ वर्षों से कर रहा हूं या रह रहा हूं, और मेरी आंत की वृत्ति यह है कि स्रोत डेटाबेस से 500,000 आइटम पढ़ने और गंतव्य में सिंक करने में उतना समय नहीं लगेगा जितना कि कोई सोच सकता है और "कुंजी" फ़ील्ड्स को पढ़ने में लगने वाला समय, MD5 हैश की गणना करें, और अपने टेबल के साथ क्रॉस चेक करें उन सिंकिंग आइटमों से बचने के लिए जो बदल नहीं गए हैं और बहुत अधिक समय की बचत भी नहीं होगी। मैं बस सभी को पढ़ता हूं और सभी को अपडेट करता हूं। अगर वह परिणाम बहुत लंबे समय तक चलता है, तो मैं ETL को थ्रेडेड बनाकर रनटाइम को संपीड़ित करूँगा, प्रत्येक थ्रेड के साथ केवल टेबल के एक सेगमेंट पर काम करना होगा लेकिन समानांतर में काम करना होगा।

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

आप कहते हैं कि स्रोत DB "DB2 हो सकता है"। जब आप कहते हैं "हो सकता है" तो इसका मतलब है कि DB अभी भी डिज़ाइन / नियोजित किया जा रहा है? DB2 9 या इसके बाद के संस्करण में अंतिम अपडेट समय की अंतर्निहित ट्रैकिंग होती है, और केवल उन वस्तुओं को क्वेरी और वापस प्राप्त करने की क्षमता होती है जो एक समय में बदल गई हैं। शायद यही कारण है कि DB को अंतिम अद्यतन समय का संकेत देने वाले कॉलम के लिए डिज़ाइन नहीं किया गया था, उदाहरण के लिए:

SELECT * FROM T1 WHERE ROW CHANGE TIMESTAMP FOR TAB t1 > current timestamp - 1 hours;

उपरोक्त क्वेरी के लिए टाइमस्टैम्प कटऑफ आपका सिंक चला गया आखिरी टाइमस्टैम्प होगा।

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


वहाँ भी mysql के लिए कोई इसी तरह का समाधान है?
फर्डिन बेहबूडी

5

डेटा सिंक बहुत बेहतर और तेज़ होगा, अगर यह किसी प्रकार के डेल्टा पहचानकर्ता या ध्वज के आधार पर किया जा सकता है। मूल रूप से, आपको लक्ष्य db डेटा पंक्तियों को केवल तभी अपडेट करना चाहिए जब वह स्रोत db के साथ सिंक से बाहर हो।

SQL सर्वर db में, आप डेल्टा आधारित पहचानकर्ता का निर्माण करने के लिए Checksum fn की मदद भी ले सकते हैं ।

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

यदि आपके पास स्रोत db तालिकाओं में "LastModifiedDate" जैसा एक कॉलम है, तो आप चेकसम दृष्टिकोण को छोड़ सकते हैं। इस तरह, आपके मूल्यांकन को दिनांक आधारित कॉलम पर निष्पादित किया जाएगा और चेकसम दृष्टिकोण की तुलना में कम समय लगेगा।


धन्यवाद, लेकिन मुझे यकीन नहीं है कि आपका समाधान काम कर सकता है - "मुद्दों" भाग में मेरे संपादन देखें।
नेव

चूंकि स्रोत डेटाबेस में कोई अद्यतन समय क्षेत्र नहीं हैं, इसलिए हमें चेकसम या हैश के आधार पर योग्य डेटा पंक्तियों को खींचने के लिए छोड़ दिया जाता है।
करण

चूंकि आपका स्रोत db2 है। आप इससे डेटा खींचने का इरादा कैसे करते हैं? कुछ webservice या एपीआई के माध्यम से ..
करण

एक ओएसबीसी ड्राइवर का उपयोग करके एक डीएसएन स्थापित किया गया है। मैं पायथन के लिए pyodbc का उपयोग करके प्रश्नों को कनेक्ट और कर सकता हूं।
नेव

ठीक है यह अच्छा है, क्योंकि आप दूरस्थ DB में PyODBC नामक उपकरण का उपयोग करके प्रश्नों का निष्पादन कर सकते हैं। आप एक और काम कर सकते हैं। आप उत्पाद डेटा को सीधे उसी प्रारूप में खींच सकते हैं, जब वह बिना किसी चेक या सत्यापन के आपके लक्ष्य DB में नए "स्टेजिंग टेबल" में हो। इस तरह से आप अपने लक्ष्य db में एक ही शॉट में स्टेज टेबल के नीचे लाइव डेटा प्राप्त करेंगे। फिर बाद में दूसरे चरण में, आप चेकसम संचालन कर सकते हैं और लक्ष्य लेनदेन तालिका डेटा को अपडेट कर सकते हैं। यह वास्तविक समय पर स्रोत db डेटा के साथ हैश या चेकसम मूल्यांकन को रोक देगा।
करण

1

हैश का उपयोग करना एक अच्छा विचार है। चूंकि इस मामले में सुरक्षा लक्ष्य नहीं है, इसलिए एक हैश फ़ंक्शन चुनें जो तेज़ है (md5 ठीक है)।

जब तक आप कई थ्रेड्स / प्रक्रियाओं में हैश गणना को विभाजित करने की योजना नहीं बनाते हैं, आपको वास्तव में डेटाबेस में वर्तमान हैश मान को संग्रहीत करने की आवश्यकता नहीं है। यदि आपकी प्रक्रिया एक एकल स्क्रिप्ट है, तो आपके पास मेमोरी में वर्तमान हैश होगा, और नए डेटाबेस में डेटा को अपडेट करने के बाद डेटाबेस को पुराने हैश के रूप में लिख देगा।


-1

आपको एक विंडो सेवा बनानी चाहिए, जो कुछ समय के अंतराल पर चलेगी जब भी आप चाहें और यह आपके स्रोत डेटाबेस में परिवर्तन खोजेगी और आपके गंतव्य डेटाबेस में उस परिवर्तन को सम्मिलित करेगी।


-1 (वास्तव में डाउनवोट नहीं है, लेकिन;) विंडोज़ के लिए केवल सुझाव है। आइए किसी भी विशिष्ट वास्तुकला पर भरोसा न करें जब सॉफ्टवेयर विकसित करना इसका मतलब है कि केवल कुछ लोग आपके सामान का उपयोग कर सकते हैं। एकमात्र निरंतर परिवर्तन है और इसलिए किसी भी विशिष्ट मंच पर उस हद तक भरोसा नहीं करना बेहतर है जो चीजों को अपने लिए और उपयोगकर्ताओं के लिए बनाए रखना आसान बनाता है
pythonian29033

1
@ मनीष कुमार भाग "यह आपके स्रोत डेटाबेस में परिवर्तन पाएंगे" सबसे कठिन है!
Narvalex
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.