mysql

2008-11-28 2 views
11

का उपयोग कर वास्तविक समय में गतिशील डेटा को द्वि-दिशात्मक रूप से सिंक्रनाइज़ करने का सबसे अच्छा तरीका कौन सा परिदृश्य है। दो अलग-अलग स्थानों में 2 वेब सर्वर समान टेबल वाले दो mysql डेटाबेस हैं। तालिकाओं के भीतर डेटा वास्तविक समय में समान होने की उम्मीद है।mysql

यहां समस्या है। यदि किसी भी स्थान पर कोई उपयोगकर्ता समान तालिकाओं में एक नए रिकॉर्ड में प्रवेश करता है, जैसा कि नीचे दी गई दो पहली सारणी में दिखाया गया है, जहां प्रत्येक तालिका में तीसरा रिकॉर्ड अलग-अलग लोगों द्वारा एक साथ दर्ज किया गया है। टेबल में डेटा अब समान नहीं है। यह सुनिश्चित करने का सबसे अच्छा तरीका कौन सा है कि डेटा वास्तविक समय में समान रहता है जैसा कि अपडेट की गई जगहों के बावजूद नीचे दी गई तीसरी तालिका में दिखाया गया है? इस तरह से प्रत्येक तालिका में 3 पंक्तियों के साथ समाप्त होने के बजाय नीचे दिए गए चित्रों में, नए रिकॉर्ड द्वि-दिशात्मक रूप से दोहराए जाते हैं और उन्हें इस समय 4 कॉलम के साथ दो समान तालिकाओं को बनाने के लिए दोनों तालिकाओं में डाला जाता है?

Server A in Location A 
============== 

Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
|-----------| 
| 3 | John | 
|-----------| 

Server B in Location B 
============== 
Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
|-----------| 
| 3 | Peter | 
|-----------| 


Expected Scenario 
=========== 
Table Names 
| ID| NAME | 
|-----------| 
| 1 | Tom | 
| 2 | Scott | 
| 3 | Peter | 
| 4 | John | 
|-----------| 

उत्तर

11

दो डेटाबेस पर अपने डेटाबेस को दोहराने से प्राप्त करने के लिए बहुत अधिक प्रदर्शन नहीं है। हालांकि अगर आप अपने आवेदन को सही कोड देते हैं तो निफ्टी का निफ्टी बिट है।

मास्टर-मास्टर सेटअप अनिवार्य रूप से स्लेव-मास्टर सेटअप के समान ही है, लेकिन दोनों गुलामों ने शुरू किया है और प्रत्येक बॉक्स पर आपकी कॉन्फ़िगरेशन फ़ाइलों में एक महत्वपूर्ण परिवर्तन है।

मास्टर MySQL 1:

auto_increment_increment = 2 
auto_increment_offset = 1 

मास्टर MySQL 2:

auto_increment_increment = 2 
auto_increment_offset = 2 

इन दो मापदंडों सुनिश्चित करना है कि जब दो सर्वर किसी कारण के लिए एक प्राथमिक कुंजी को लेकर लड़ रहे हैं, वे नकली और मत मारो प्रतिकृति 1 से बढ़ने के बजाय, कोई भी ऑटो-वृद्धि फ़ील्ड डिफ़ॉल्ट रूप से 2 से बढ़ेगी। एक बॉक्स पर यह 1 से ऑफसेट शुरू हो जाएगा और अनुक्रम 1 3 5 7 9 11 13 आदि चलाएगा। दूसरे बॉक्स पर यह 2 से ऑफसेट शुरू हो जाएगा और 2 4 6 8 10 12 आदि के साथ चलें। वर्तमान परीक्षण से, ऑटो वृद्धि अगले मुक्त नंबर को लेती है, जो पहले नहीं छोड़ी गई है। जैसेयदि सर्वर 1 पहले 3 रिकॉर्ड (1 3 और 5) को सम्मिलित करता है, जब सर्वर 2 चौथाई डाला जाता है, तो उसे 6 की कुंजी दी जाएगी (2 नहीं, जो अप्रयुक्त छोड़ी गई है)।

एक बार जब आप इसे सेट कर लेंगे, तो दोनों को गुलामों के रूप में शुरू करें। फिर दोनों जांचने के लिए ठीक है, दोनों मशीनों से कनेक्ट करें और SHOW SLAVE STATUS कमांड करें और आपको ध्यान रखना चाहिए कि Slave_IO_Running और Slave_SQL_Running दोनों को प्रत्येक बॉक्स पर "हाँ" कहना चाहिए।

फिर बेशक, एक तालिका में कुछ रिकॉर्ड बनाएं और सुनिश्चित करें कि एक बॉक्स केवल विषम संख्या वाली प्राथमिक कुंजी डालने वाला है और दूसरा केवल संख्याबद्ध लोगों को बढ़ा रहा है।

फिर यह सुनिश्चित करने के लिए सभी परीक्षण करें कि आप प्रत्येक बॉक्स पर सभी मानक अनुप्रयोगों को दूसरे के साथ दोहराने के साथ कर सकते हैं।

यह जाने के बाद अपेक्षाकृत सरल है। लेकिन जैसा कि उल्लेख किया गया है, MySQL इसे हतोत्साहित करता है और सलाह देता है कि आप सुनिश्चित करें कि आप अपना आवेदन कोड लिखते समय इस कार्यक्षमता से सावधान रहें।

संपादित करें: मुझे लगता है कि यदि आप सुनिश्चित करते हैं कि ऑफसेट सही हैं और इसी तरह से अधिक स्वामी जोड़ना सैद्धांतिक रूप से संभव है। यद्यपि आप अधिक यथार्थवादी हो सकते हैं, कुछ अतिरिक्त दास जोड़ें।

+0

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

+0

भी, सुनिश्चित करें कि सर्वर सर्वर आईडी और उस दोहराने-ही-server-आईडी के लिए अलग-अलग मान 0. की अपनी डिफ़ॉल्ट यह पहले से ही हो सकता है के लिए सेट है, लेकिन यह पाश होगा और मुठभेड़ त्रुटियों अगर नहीं। – benlumley

+0

मुझे 2 से सर्वर ऑटो-वृद्धि करने का विचार पसंद है, फिर सम्मिलित/संपादन ट्रैक करने के लिए कस्टम प्लगइन लिखें और प्लगइन बाकी को संभालेगा। इसलिए यदि सर्वर 1 सम्मिलित करता है (1,3,5) प्लगइन इसे चुन सकता है और उसी आईडी का उपयोग करके सर्वर 2 पर निर्यात कर सकता है और इसके विपरीत कोई विरोध नहीं है। –

0

आपकी टेबल को सिंक्रनाइज़ करने के लिए एकमात्र तरीका डेटाबेस के बीच 2-तरीकों प्रतिकृति सेट करना है।

लेकिन, MySQL केवल एक तरफा प्रतिकृति की अनुमति देता है, इसलिए आप इस कॉन्फ़िगरेशन में अपनी समस्या को हल नहीं कर सकते हैं।

स्पष्ट होने के लिए, आप 2-तरीकों की प्रतिकृति "सेटअप" कर सकते हैं लेकिन MySQL AB discourages this

1

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

+0

हां, यह महत्वपूर्ण है कि यूआईडी दोनों सर्वरों पर समान हों। हालांकि उन्हें अनुक्रम का पालन नहीं करना पड़ेगा, उन्हें बस दोनों सर्वरों में समान और अद्वितीय होना चाहिए। फिर भी धन्यवाद। मेरे पास एक अच्छा विचार है कि मैं क्या करूँगा। –

2

MySQL सिंक्रोनस प्रतिकृति का समर्थन नहीं करता है, हालांकि, अगर ऐसा होता है, तो शायद आप इसका उपयोग नहीं करना चाहते हैं (अन्य लेनदेन प्रतिबद्धता पर सिंक करने के लिए अन्य सर्वर के इंतजार के प्रदर्शन हिट नहीं ले सकते हैं)।

आपको इसके लिए अधिक उपयुक्त आर्किटेक्चरल समाधानों पर विचार करना होगा - तीसरे पक्ष के उत्पाद हैं जो विलय करेंगे और पूर्व निर्धारित तरीके से संघर्ष हल करेंगे - यह वास्तव में एकमात्र तरीका है।

इस तरह से कार्य करने के लिए अपने आर्किटेक्चर की अपेक्षा करना बेवकूफ़ है - किसी भी डेटाबेस के लिए कोई "आसान फिक्स" नहीं है, न केवल MySQL।

+0

यह वर्णन नहीं करता है जैसा कि आप वर्णन करते हैं - उपरोक्त के रूप में, इसके वास्तव में दो मास्टर-गुलाम उदाहरण – benlumley

+0

मेरा अनुमान था कि MySQL सिंक्रोनस प्रतिकृति का समर्थन करता है। – MarkR

 संबंधित मुद्दे