कैप प्रमेय में मोंगोडब कहाँ खड़ा है?


121

हर जगह मैं देखता हूं, मैं देखता हूं कि MongoDB CP है। लेकिन जब मैं खुदाई करता हूं तो मैं देखता हूं कि यह आखिरकार सुसंगत है। क्या यह CP है जब आप सुरक्षित = सही का उपयोग करते हैं? यदि हां, तो क्या इसका मतलब है कि जब मैं सुरक्षित = सही के साथ लिखता हूं, तो परिणाम प्राप्त करने से पहले सभी प्रतिकृतियां अपडेट की जाएंगी?

जवाबों:


104

MongoDB दृढ़ता से डिफ़ॉल्ट रूप से सुसंगत है - यदि आप एक लेखन करते हैं और फिर एक रीड करते हैं, तो यह मानते हुए कि लेखन सफल था आप हमेशा केवल पढ़ने के लिए लिखने के परिणाम को पढ़ पाएंगे। ऐसा इसलिए है क्योंकि MongoDB एक सिंगल-मास्टर सिस्टम है और सभी रीड डिफ़ॉल्ट रूप से प्राथमिक में जाते हैं। यदि आप वैकल्पिक रूप से सेकंडरी से पढ़ने को सक्षम करते हैं तो MongoDB अंततः सुसंगत हो जाता है जहां आउट-ऑफ-डेट परिणाम पढ़ना संभव है।

MongoDB भी प्रतिकृति सेटों में स्वचालित विफलता के माध्यम से उच्च-उपलब्धता प्राप्त करता है: http://www.mongodb.org/display/DOCS/Replica+Sets


13
Aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads के अनुसार यदि आप प्रतिकृति सेट में प्राथमिक नोड से पढ़ते हैं तो आपको बासी या गंदा डेटा मिल सकता है। तो MongoDB मजबूत सुसंगत है ??
माइक अरग्यिउ सिप

3
काइल द्वारा भयानक प्रयोग। यह वास्तव में मोंगो का शिकार करता है। मुझे आश्चर्य है कि अगर वहाँ उत्पादन प्रणाली हैं, उदाहरण के लिए MongoDB भुगतान लेनदेन कर रहे हैं? यदि यह सिर्फ एक व्यक्तिगत वेबसाइट है, जो मजबूत स्थिरता की परवाह करता है।
xin

5
केवल रिकॉर्ड के लिए, MongoDB v3.4 ने काइल द्वारा डिज़ाइन किया गया परीक्षण पारित किया, हाँ, MongoDB दृढ़ता से संगत है, यहां तक ​​कि प्रतिकृति और शेयरिंग के साथ भी: mongodb.com/mongodb-3.4-passes-jepsen-test
Maxime Beugnet

2
यह उत्तर थोड़ा सा सरल हो सकता है, क्योंकि MongoDB कॉन्फ़िगरेशन के आधार पर समय-समय पर उपलब्धता का त्याग कर सकता है। JoCa की बेहतर स्थिति उन स्थितियों की व्याख्या करती है जिसमें वह CA / CP / AP
PaoloC

37

मैं लुक्कास पोस्ट से सहमत हूं। आप बस यह नहीं कह सकते हैं कि MongoDB CP / AP / CA है, क्योंकि यह वास्तव में C, A और P के बीच का व्यापार है, जो डेटाबेस / ड्राइवर कॉन्फ़िगरेशन और आपदा के प्रकार पर निर्भर करता है : यहाँ एक दृश्य पुनरावृत्ति है, और नीचे एक अधिक विस्तृत विवरण।

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

संगति:

जब आप किसी एकल कनेक्शन या सही लिखें / पढ़ें चिंता का स्तर ( जो आपको निष्पादन गति का खर्च करेगा ) का उपयोग करते हुए MongoDB दृढ़ता से सुसंगत है । जैसे ही आप उन शर्तों को पूरा नहीं करते हैं (विशेषकर जब आप द्वितीयक-प्रतिकृति से पढ़ रहे हैं) MongoDB अंततः सुसंगत हो जाता है।

उपलब्धता:

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

विभाजन सहिष्णुता:

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


तो अगर Im सही लिखने / पढ़ने की चिंता के स्तर का उपयोग कर रहा है, तो इसका मतलब है कि सभी वॉट्स और रीड्स प्राइमरी में जाते हैं (यदि मैं सही तरीके से समझा गया), तो वास्तव में सेकेंडरी क्या करते हैं? बस प्राथमिक नीचे चला जाता है के मामले में वहाँ स्टैंडबाय पर बैठते हैं?
tomer.z

@ tomer.z आप मैनुअल के इस खंड को पढ़ना चाह सकते हैं : आप पढ़ने के लिए सेकेंडरी का उपयोग कर सकते हैं। यदि आप "बहुमत" रीड-लेवल का उपयोग कर रहे हैं, तो जैसे ही अधिकांश सदस्यों ने रीड को स्वीकार कर लिया है, वैसे ही रीड मान्य होगा। वही "बहुमत" लिखें-स्तर के लिए जाता है। यदि आप दोनों के लिए "बहुमत" चिंता-स्तर का उपयोग कर रहे हैं, तो आपके पास एक सुसंगत डेटाबेस है। आप मैनुअल में इसके बारे में अधिक पढ़ना चाह सकते हैं ।
जॉका

18

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

बेशक CAP बहुत अधिक शब्दों के बिना यह पता लगाने में मदद करता है कि डेटाबेस इसके बारे में क्या कहता है, लेकिन लोग अक्सर यह भूल जाते हैं कि C में CAP का अर्थ परमाणु स्थिरता (रैखिकता) है, उदाहरण के लिए। और इसने मुझे बहुत सारे दर्द को समझा, जब वर्गीकृत करने की कोशिश की। तो, इसके अलावा MongoDB मजबूत स्थिरता देता है, इसका मतलब यह नहीं है कि सी। इस तरह से, यदि कोई इस वर्गीकरण को करता है, तो मैं यह भी सलाह देता हूं कि संदेह को न छोड़ने के लिए यह वास्तव में अधिक गहराई से काम करता है।


10

हाँ, यह सीपी का उपयोग करते समय है safe=true। इसका सीधा सा मतलब है, डेटा ने इसे मास्टर्स डिस्क में बनाया है। यदि आप यह सुनिश्चित करना चाहते हैं कि यह कुछ प्रतिकृति पर भी पहुंचे, तो 'w = N' पैरामीटर देखें जहाँ N को डेटा को बचाने के लिए प्रतिकृति की संख्या है।

देखना यह और इस बारे में अधिक जानकारी के लिए।


3

मैं मानगो के लिए पी के बारे में निश्चित नहीं हूं। स्थिति की कल्पना करें:

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

यहां समस्या यह है कि डंप फ़ाइल का आकार सीमित है और यदि आपके पास लंबे समय तक विभाजन था तो आप अपने डेटा को हमेशा के लिए ढीला कर सकते हैं।

आप कह सकते हैं कि ऐसा होने की संभावना नहीं है - हां, जब तक कि बादल में यह एक से अधिक आम नहीं है जो सोच सकते हैं।

यह उदाहरण है कि मैं किसी भी डेटाबेस को कोई भी पत्र सौंपने से पहले बहुत सावधान रहूंगा। बहुत सारे परिदृश्य और कार्यान्वयन सही नहीं हैं।

अगर किसी को पता है कि इस परिदृश्य को मानगो के बाद के रिलीज में संबोधित किया गया है तो कृपया टिप्पणी करें! (मैं कुछ समय से जो कुछ हो रहा था, उसका पालन नहीं कर रहा हूं ..)


2
MongoDB का चुनाव प्रोटोकॉल एक ही प्राथमिक के लिए (अधिकतम) बनाया गया है। कॉन्फ़िगर किए गए प्रतिकृति सेट वोटिंग सदस्यों (n / 2 +1) के बहुमत से एक प्राथमिक (और निरंतर) चुना जा सकता है। नेटवर्क विभाजन की स्थिति में, केवल एक विभाजन (अधिकांश मतदान सदस्यों के साथ) एक प्राथमिक का चुनाव कर सकता है; अल्पसंख्यक विभाजन में एक प्राथमिक प्राथमिक पदत्याग और माध्यमिक बन जाएगा। इस तरह से प्रतिकृति सेट हमेशा काम किया है। इस घटना में एक पूर्व प्राथमिक ने लिखा है कि प्रतिकृति को स्वीकार नहीं किया गया था, जब वे सदस्य प्रतिकृति सेट में शामिल हो जाते हैं, तो उन्हें वापस रोल किया जाएगा (डिस्क में सहेजा गया)।
स्टेनी

2

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


2

जब भी कोई विभाजन होता है, MongoDB उपलब्धता पर संगति का चयन करता है। इसका अर्थ यह है कि जब कोई विभाजन (P) होता है तो वह उपलब्धता (A) से अधिक संगति (C) चुनता है।

इसे समझने के लिए, आइए समझते हैं कि MongoDB प्रतिकृति सेट कैसे काम करता है। एक प्रतिकृति सेट में एक एकल प्राथमिक नोड है। डेटा करने का एकमात्र "सुरक्षित" तरीका उस नोड को लिखना है और फिर सेट में अधिकांश नोड्स के लिए उस डेटा का इंतजार करना है। (आप लिखते हुए उस ध्वज को w = बहुमत के लिए देखेंगे)

विभाजन दो परिदृश्यों में निम्नानुसार हो सकता है:

  • जब प्राथमिक नोड नीचे जाता है: एक नया प्राथमिक चुने जाने तक सिस्टम अनुपलब्ध हो जाता है।
  • जब प्राथमिक नोड बहुत अधिक माध्यमिक नोड्स से कनेक्शन खो देता है: सिस्टम अनुपलब्ध हो जाता है। अन्य सेकंडरी एक नए प्राइमरी का चुनाव करने की कोशिश करेंगी और वर्तमान प्राइमरी को छोड़ दिया जाएगा।

मूल रूप से, जब भी कोई विभाजन होता है और MongoDB को यह तय करने की आवश्यकता होती है कि क्या करना है, तो यह उपलब्धता पर संगति का चयन करेगा। यह सिस्टम को लिखने को तब तक स्वीकार करना बंद कर देगा जब तक उसे विश्वास नहीं हो जाता कि वह सुरक्षित रूप से उन लिखों को पूरा कर सकता है।


"यह सिस्टम को लिखने को तब तक स्वीकार करना बंद कर देगा जब तक उसे विश्वास नहीं हो जाता कि वह उन लिखों को सुरक्षित रूप से पूरा कर सकता है। " क्या पढ़ता है ? क्या यह उस दौरान पढ़ा-उपलब्ध रहेगा?
जोश

1

Mongodb स्थिरता और विभाजन सहिष्णुता प्रदान करता है

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

संगति - प्रणाली अंततः सुसंगत हो जाएगी। डेटा जितनी जल्दी या बाद में हर जगह प्रचारित करेगा, लेकिन सिस्टम इनपुट प्राप्त करना जारी रखेगा और अगले एक पर जाने से पहले हर लेनदेन की स्थिरता की जांच नहीं कर रहा है।

उपलब्धता - डिफ़ॉल्ट रूप से, Mongo DB क्लाइंट (MongoDB ड्राइवर), नेता / प्राथमिक नोड को सभी पढ़ने / लिखने के अनुरोध भेजता है। यह सिस्टम को सुसंगत बनाता है लेकिन उपलब्ध नहीं होने के कारण - यदि कोई नेता क्लस्टर से डिस्कनेक्ट करता है, तो एक नए नेता को चुनने में कुछ सेकंड लगते हैं। इसलिए, यह उस अवधि में लिखने और पढ़ने के लिए अनुपलब्ध है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.