2011-08-11 15 views
14

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

  • क्या मुझे कोई खोज करनी चाहिए?

  • क्या मुझे कुछ विशिष्ट mongoDB आदेशों का उपयोग करना चाहिए?

  • मैं sharding का उपयोग करना चाहिए, भले ही एक सर्वर संतोषजनक
    गति के लिए और जिस तरह से यह कुछ भी गारंटी नहीं है प्रकाश
    नीचे चला जाता है, तो द्वारा पर्याप्त है?

सबसे अच्छा समाधान क्या है?

उत्तर

14

आपकी सबसे अच्छी शर्त लिखें चिंता का उपयोग करना है - ये आपको MongoDB को बताने की अनुमति देता है कि डेटा का एक टुकड़ा कितना महत्वपूर्ण है। सबसे तेज़ लिखें कंसर्न भी कम से कम सुरक्षित है - अगली अनुसूचित फ्लश तक डेटा डिस्क पर फ़्लश नहीं किया जाता है। सबसे सुरक्षित यह पुष्टि करेगा कि डेटा लौटने से पहले कई मशीनों पर डिस्क पर लिखा गया है।

लिखने की चिंता आप FSYNC_SAFE (कम से कम यही है जिसे इसे Java driver के दृष्टिकोण से कहा जाता है) या REPLICAS_SAFE जो पुष्टि करता है कि आपका डेटा दोहराया गया है।

ध्यान रखें कि मोंगोडीबी के पारंपरिक अर्थ में लेनदेन नहीं है - आपके रोलबैक को हाथ से लुढ़का जाना होगा क्योंकि आप मोंगो डेटाबेस को यह करने के लिए नहीं कह सकते हैं।

अन्य चीज जो आपको करने की ज़रूरत है वह या तो अपेक्षाकृत नए --journal विकल्प (जो एक आगे लिखने का उपयोग करता है) का उपयोग करें, या एक डेटा की स्थिति में डेटा अखंडता को अधिकतम करने के लिए कई मशीनों में अपना डेटा साझा करने के लिए प्रतिकृति सेट का उपयोग करें दुर्घटना/बिजली की कमी।

शेडिंग हार्डवेयर विफलता के खिलाफ विशेष रूप से बड़े डेटासेट से निपटने के दौरान भार साझा करने की विधि के रूप में इतनी अधिक सुरक्षा नहीं है - शेर्डिंग को प्रतिकृति सेट के साथ भ्रमित नहीं किया जाना चाहिए जो एक से अधिक डिस्क पर डेटा लिखने का एक तरीका है एक से अधिक मशीनें

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

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

+0

वास्तव में एक अच्छा और विशाल उत्तर के लिए धन्यवाद। मैं कुछ समय के लिए अन्य उत्तरों की प्रतीक्षा करूंगा और अगर मुझे कुछ नया नहीं मिला तो मैं इसे स्वीकार करूंगा, धन्यवाद –

+0

टीएल; डॉ: आप किसी भी तरह से खराब हो गए हैं! – Mrchief

5

मुझे Google समूह पर GVP नामक व्यक्ति से वास्तव में एक अच्छा जवाब मिला।मैं इसे बोली जाएगा (मूल रूप से इसे रिच के जवाब देने के लिए कहते हैं):

मुझे यकीन है कि मेरे डेटा डालने के बाद डेटाबेस में है हो सकता है और पूरे बैच रोलबैक करना चाहते हैं तो एक तत्व सम्मिलित नहीं किया गया था ।

यह एक जटिल विषय है और आपके पास पर कई व्यापार-बंद हैं।

क्या मुझे शेरिंग का उपयोग करना चाहिए?

शेडिंग लिखने के लिए है। डेटा सुरक्षा के लिए, आप प्रतिकृति सेट देखना चाहते हैं।

क्या मुझे कुछ विशिष्ट mongoDB आदेशों का उपयोग करना चाहिए?

विचार करने वाली पहली बात "सुरक्षित" मोड या "getLastError()" एंड्रियास द्वारा इंगित की गई है। यदि आप "सुरक्षित" लेखन जारी करते हैं, तो आप जानते हैं कि डेटाबेस को सम्मिलित किया गया है और लेखन लागू किया गया है। हालांकि, मोंगोडीबी केवल 60 सेकंड में डिस्क पर फिसल जाता है, इसलिए सर्वर डिस्क पर डेटा के बिना विफल हो सकता है।

विचार करने की दूसरी बात "जर्नलिंग" (v1.8 +) है। जर्नलिंग चालू होने के साथ, डेटा को हर 100ms जर्नल पर फ़्लश किया जाता है। तो विफलता से पहले आपके पास समय की एक छोटी सी खिड़की है। ड्राइवरों में "fsync" विकल्प होता है (उस नाम की जांच करें) जो "सुरक्षित" से आगे एक चरण चला जाता है, यह स्वीकृति के लिए प्रतीक्षा करता है कि डेटा डिस्क पर फ़्लश किया गया है (यानी जर्नल फ़ाइल)। हालांकि, यह केवल एक सर्वर को कवर करता है। क्या होता है यदि सर्वर पर हार्ड ड्राइव सिर्फ मर जाता है? खैर आपको दूसरी प्रतिलिपि की आवश्यकता है।

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

यहां इस पर PHP ड्राइवर का एक लिंक है: http://it.php.net/manual/en/mongocollection.batchinsert.php आपको प्रतिकृति और डब्ल्यू पैरामीटर पर विवरण जांचना होगा। मेरा मानना ​​है कि वही सीमाएं यहां लागू होती हैं।

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