2012-03-08 4 views
11

मेरे पास एक ऐसा एप्लिकेशन है जिसे मैंने डिज़ाइन किया है जहां रिलेशनल डेटा बैठता है और स्वाभाविक रूप से MySQL में फिट बैठता है। मेरे पास अन्य डेटा है जिसमें निरंतर विकसित स्कीमा है और इसमें संबंधपरक डेटा नहीं है, इसलिए मुझे लगता है कि यह डेटा स्टोर करने का प्राकृतिक तरीका मोंगोडीबी में एक दस्तावेज़ के रूप में होगा। मेरा मुद्दा यहां मेरे दस्तावेज़ों में से एक है MySQL प्राथमिक आईडी संदर्भित करता है। अभी तक इसने बिना किसी मुद्दे के काम किया है। मेरी चिंता यह है कि जब उत्पादन यातायात आता है और हम बैकअप के साथ काम करना शुरू करते हैं, तो दस्तावेज़ के परिवर्तन के लिए असंगतता हो सकती है, यह MySQL डेटाबेस में सही आईडी को इंगित नहीं कर सकता है। इसे एक निश्चित डिग्री की गारंटी देने का एकमात्र तरीका एप्लिकेशन को बंद करना और बैकअप लेना होगा, जो अधिक समझ में नहीं आता है।बैकअप (MySQL और MongoDB) के दौरान दो अलग-अलग डेटा स्टोर्स के बीच अखंडता को बनाए रखना

ऐसे अन्य लोग होने चाहिए जो समान रणनीति को तैनात करते हैं। विशेष रूप से बैकअप के दौरान, दो डेटा स्टोर के बीच डेटा अखंडता सुनिश्चित करने का सबसे अच्छा तरीका क्या है?

+2

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

+0

आपने क्या किया? – Aerik

उत्तर

2

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

4

MySQL परिप्रेक्ष्य

अपने सभी MySQL डेटा InnoDB का उपयोग करना होगा। तो फिर तुम MySQL डाटा का एक स्नैपशॉट इस प्रकार बना सकता है:

MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers" 
mysqldump -u... -p... ${MYSQLDUMP_OPTIONS} --all-databases > MySQLData.sql 

यह एक एकल लेनदेन के रूप में सभी MySQL डेटा की एक साफ बिंदु-इन-टाइम स्नैपशॉट पैदा करेगा।

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

यदि आपके पास कोई MyISAM टेबल है, तो आपको उन्हें InnoDB में परिवर्तित करने की आवश्यकता है। चलो हम पीछा करते हैं। जब आप सभी उपयोगकर्ता परिभाषित MyISAM तालिकाओं रूपांतरण करने वाले

MYISAM_TO_INNODB_CONVERSION_SCRIPT=/root/ConvertMyISAMToInnoDB.sql 
echo "SET SQL_LOG_BIN = 0;" > ${MYISAM_TO_INNODB_CONVERSION_SCRIPT} 
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" >> ${MYISAM_TO_INNODB_CONVERSION_SCRIPT} 

बस इस स्क्रिप्ट को चलाने: यहाँ आप कैसे एक स्क्रिप्ट InnoDB के लिए अपने सभी MyISAM तालिकाओं कन्वर्ट करने के लिए बनाते हैं। किसी भी सिस्टम से संबंधित माईसाम टेबल को नजरअंदाज कर दिया जाता है और वैसे भी स्पर्श नहीं किया जाना चाहिए।

MongoDB परिप्रेक्ष्य

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

आम उद्देश्य

प्वाइंट-इन-समय वास्तव में आपके लिए महत्वपूर्ण हैं, तो सुनिश्चित करें कि सभी ओएस घड़ियों एक ही सिंक्रनाइज़ समय और समय क्षेत्र बनाता है। यदि आपको ऐसा सिंक्रनाइज़ेशन करना है, तो आपको mysqld और mongod को पुनरारंभ करना होगा। फिर, mysqldump और mongodump के लिए आपकी crontab नौकरियां एक ही समय में बंद हो जाएगा। व्यक्तिगत रूप से, मैं मोंडोडम्प में पोस्ट किए जाने वाले mysql से आईड्स को आश्वस्त करने के लिए लगभग 30 सेकंड में एक मोंगोडम्प में देरी करूँगा।

यदि आपके पास एक ही सर्वर पर MySQL और mongod चल रहा है, तो आपको किसी भी MongoDB प्रतिकृति की आवश्यकता नहीं है। 00:00:00 (मध्यरात्रि) और 00:30:00 (मध्यरात्रि के बाद 30 सेकंड) पर मोंगोडम्प पर बस एक mysqldump शुरू करें।

0

वास्तव में किसी प्रकार की बाहरी जांच या प्रवर्तन के बिना ऐसा करने का कोई तरीका नहीं है।

यदि आपको वास्तव में दोनों के बीच पूर्ण अखंडता सुनिश्चित करने की आवश्यकता है, तो ऐसा करने का एक तरीका है अपने mysql डेटा (सभी रिकॉर्ड) और मोंगो रिकॉर्ड्स दोनों के लिए टाइमस्टैम्प का उपयोग करना, फिर टूल का उपयोग करके टाइमस्टैम्प द्वारा फ़िल्टर किए गए प्रत्येक को बैक अप लें प्रत्येक को ही रिकार्ड अनुसूचित बैकअप से पहले सही मौजूदा चयन करने के लिए (कैसे एक कहां खंड के साथ mysqldump का उपयोग करने के लिए http://www.electrictoolbox.com/mysqldump-selectively-dump-data/ और http://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-mongodump को देखने के एक प्रश्न के साथ एक MongoDB संग्रह डंप करने के लिए)

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

लेकिन टाइमस्टैम्प चीज़ परवाह किए बिना काम करेगा - आपके पास टाइमस्टैम्प का अतिरिक्त ओवरहेड है।

+1

आप वैकल्पिक रूप से ऑटो-वृद्धि आईडी का उपयोग कर सकते हैं बशर्ते कि आपके पास इनकी स्कीमा है। mysqldump -uuser -p mydb --tables my_documents_table --where = "id <= 2000122" | gzip> my_documents_table_YYYYMMDDHHMMSS.sql.gz mysqldump -uuser -p mydb --ignore-table = mydb.my_documents_table | gzip> mydb_YYYYMMDDHHMMSS.sql.gz फिर आप अपने चयनित दस्तावेज़ आईडी श्रेणी सहित केवल रिकॉर्ड्स चुनने के लिए mongodump उपयोगिता का उपयोग कर सकते हैं। – wisefish

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