उत्पादन के उपयोग के लिए MongoDB Java ड्राइवर MongoOptions को कैसे कॉन्फ़िगर करें?


100

मैं MongoDB जावा ड्राइवर के लिए MongoOptions को कॉन्फ़िगर करने के लिए सर्वोत्तम प्रथाओं की तलाश में वेब खोज रहा हूं और मैं एपीआई के अलावा बहुत कुछ नहीं आया हूं। यह खोज मैंने "com.mongodb.DBPortPool $ SemaphoresOut: db कनेक्शन से बाहर लाने के लिए" त्रुटि प्राप्त करने के लिए शुरू की थी और त्रुटि / कनेक्शन को गुणा करने से मैं उस समस्या को हल करने में सक्षम था। मैं उत्पादन के लिए इन विकल्पों को कॉन्फ़िगर करने में लिंक या आपके सर्वोत्तम अभ्यासों की तलाश कर रहा हूं।

2.4 चालक के विकल्पों में शामिल हैं: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionsPerHost
  • connectTimeout
  • maxWaitTime
  • socketTimeout
  • threadsAllowedToBlockForConnectionMultiplier

नए ड्राइवरों के पास अधिक विकल्प हैं और मुझे उन लोगों के बारे में भी सुनने में दिलचस्पी होगी।

जवाबों:


160

2.9 पर अपडेट किया गया:

  • AutoConnectRetry का अर्थ है कि ड्राइवर अनपेक्षित डिस्कनेक्ट के बाद स्वचालित रूप से सर्वर (सर्वर) को फिर से कनेक्ट करने का प्रयास करेगा। उत्पादन वातावरण में आप आमतौर पर इस सेट को सही करना चाहते हैं।

  • connectionPerHost भौतिक कनेक्शनों की एक एकल मानगो आवृत्ति है (यह सिंगलटन है, ताकि आपके पास आमतौर पर एक प्रति अनुप्रयोग हो) एक मोंगॉड / मोंगोस प्रक्रिया को स्थापित कर सकता है। लिखने के समय जावा ड्राइवर कनेक्शन की इस राशि को अंततः स्थापित करेगा भले ही वास्तविक क्वेरी थ्रूपुट कम हो (क्रम शब्दों में आप मूंगोस्टैट वृद्धि में "कॉन" स्टेटिस्टिक्स देखेंगे जब तक कि यह प्रति ऐप सर्वर पर इस नंबर को हिट नहीं करता है)।

    ज्यादातर मामलों में इसे 100 से अधिक सेट करने की आवश्यकता नहीं है, लेकिन यह सेटिंग उन लोगों में से एक है जो इसे "परीक्षण करते हैं और देखते हैं"। ध्यान दें कि आपको यह सुनिश्चित करना होगा कि आप इसे कम सेट करें ताकि आपके सर्वर से कनेक्शन की कुल राशि से अधिक न हो

    db.serverStatus().connections.available

    उत्पादन में वर्तमान में हम 40 पर है।

  • कनेक्ट टाइमआउट । जैसा कि नाम से पता चलता है कि मिलीसेकंड की संख्या एक कनेक्शन प्रयास के समाप्त होने से पहले चालक प्रतीक्षा करेगी। कुछ समय (15-30 सेकंड) के लिए टाइमआउट सेट करें, जब तक कि कोई वास्तविक, अपेक्षित मौका न हो, अन्यथा यह अन्यथा कनेक्शन के प्रयासों के रास्ते में होगा। आम तौर पर अगर कनेक्शन का प्रयास कुछ सेकंड से अधिक समय लेता है तो आपका नेटवर्क इन्फ्रास्ट्रक्चर उच्च थ्रूपुट में सक्षम नहीं है।

  • मैक्सवेटटाइम । एमएस की संख्या एक थ्रेड कनेक्शन पूल पर उपलब्ध होने के लिए प्रतीक्षा करेगा, और यदि समय में ऐसा नहीं होता है तो एक अपवाद उठाता है। डिफ़ॉल्ट रखें।

  • सॉकेट टाइमआउट । मानक सॉकेट टाइमआउट मान। 60 सेकंड (60000) पर सेट करें।

  • थ्रेड्सऑल्टेडटॉब्लॉकफोरकॉन्नेक्शनमूलिपियर । कनेक्शन के लिए गुणकपोस्टपोस्ट जो उन थ्रेड्स की संख्या को दर्शाता है जिन्हें कनेक्शन के लिए प्रतीक्षा करने की अनुमति है यदि पूल वर्तमान में समाप्त हो जाता है। यह वह सेटिंग है जिसके कारण "com.mongodb.DBPortPool $ SemaphoresOut: db कनेक्शन पाने के लिए सेमाफोर से बाहर" अपवाद होगा। एक बार यह थ्रेड कतार थ्रेड्स से अलग हो जाएगा, तो यह अपवाद छोड़ देगा। AllowedToBlockForConnectionMultiplier मान। उदाहरण के लिए, यदि कनेक्शन्सपॉस्टर 10 है और यह मान 5 से 50 तक है तो उपरोक्त अपवाद को फेंकने से पहले थ्रेड्स ब्लॉक कर सकते हैं।

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

  • पठन(अद्यतन, 2.8+) डिफ़ॉल्ट पढ़ने की प्राथमिकता निर्धारित करने के लिए उपयोग किया जाता है और "slaveOk" को प्रतिस्थापित करता है। क्लास फैक्ट्री पद्धति में से एक के माध्यम से रीडप्रीफेरेंस सेट करें। इस पोस्ट के अंत में सबसे सामान्य सेटिंग्स का पूरा विवरण पाया जा सकता है

  • डब्ल्यू(अद्यतन, 2.6+) यह मान लेखन की "सुरक्षा" निर्धारित करता है। जब यह मान -1 है तो लेखन नेटवर्क या डेटाबेस त्रुटियों की परवाह किए बिना किसी भी त्रुटि की रिपोर्ट नहीं करेगा। WriteConcern.NONE इसके लिए उपयुक्त पूर्वनिर्धारित WriteConcern है। यदि w 0 है तो नेटवर्क एरर राइट को फेल कर देगा लेकिन मैंगो एरर नहीं होगा। यह आमतौर पर "आग और भूल" लिखता है और इसका उपयोग तब किया जाना चाहिए जब प्रदर्शन स्थिरता और स्थायित्व से अधिक महत्वपूर्ण हो। इस मोड के लिए WriteConcern.NORMAL का उपयोग करें।

    यदि आप w को 1 या उच्चतर सेट करते हैं, तो लेखन सुरक्षित माना जाता है। सेफ़ राइट लिखता है और सर्वर से अनुरोध का पालन करता है कि यह सुनिश्चित करने के लिए कि लेखन सफल हुआ या त्रुटि मान पुनः प्राप्त करें यदि ऐसा नहीं हुआ (दूसरे शब्दों में, यह आपको लिखने के बाद getLastError () कमांड भेजता है)। ध्यान दें कि जब तक यह getLastError () कमांड पूरा नहीं हो जाता है, तब तक कनेक्शन आरक्षित है। उस और अतिरिक्त कमांड के परिणामस्वरूप थ्रूपुट डब्ल्यू के साथ लिखने की तुलना में महत्वपूर्ण रूप से कम हो जाएगा <= 0. ठीक 1 मान के साथ, MongoDB गारंटी देता है कि आपके द्वारा लिखित भेजे गए उदाहरण पर लेखन सफल (या पूरी तरह से विफल) है।

    प्रतिकृति सेटों के मामले में, आप w मान के लिए उच्च मूल्यों का उपयोग कर सकते हैं, मानगोडीब को बताएं कि वापसी से पहले सेट की कम से कम "डब्ल्यू" सदस्यों को भेजें (या अधिक सटीक रूप से, अपने लिखने की प्रतिकृति के लिए प्रतीक्षा करें "डब्ल्यू" सदस्य )। आप स्ट्रिंग को "बहुमत" पर भी सेट कर सकते हैं जो MongoDB को प्रतिकृति सेट सदस्यों के बहुमत (WriteConcern.MAJORITY) को लिखने के लिए कहता है। Typicall आपको इसे 1 पर सेट करना चाहिए जब तक कि आपको कच्चे प्रदर्शन (-1 या 0) की आवश्यकता नहीं होती है या प्रतिकृति (> 1) लिखी जाती है। 1 से अधिक मूल्यों का थ्रूपुट पर लिखने पर काफी प्रभाव पड़ता है।

  • fsync । स्थायित्व का विकल्प जो मोंगो को सक्षम होने पर प्रत्येक लिखने के बाद डिस्क को फ्लश करने के लिए मजबूर करता है। मेरे पास राइट बैकलॉग से संबंधित कोई टिकाऊ समस्या नहीं है, इसलिए हमारे पास उत्पादन में गलत (डिफ़ॉल्ट) है।

  • j * (NEW 2.7+) *। बूलियन जब सच्चा बलवा करने के लिए तैयार होता है तो वापसी से पहले एक सफल जर्नलिंग कमेटी का इंतजार करने के लिए मोंगोबडी। यदि आपके पास जर्नलिंग सक्षम है तो आप अतिरिक्त स्थायित्व के लिए इसे सक्षम कर सकते हैं। का संदर्भ लें http://www.mongodb.org/display/DOCS/Journaling क्या जर्नलिंग आप हो जाता है देखने के लिए (और इस प्रकार तुम क्यों इस ध्वज सक्षम कर सकते हैं)।

ReadPreference ReadPreference वर्ग आपको कॉन्फ़िगर करता है कि यदि आप प्रतिकृति सेट के साथ काम कर रहे हैं तो मोंगॉड इंस्टेंस प्रश्नों को कैसे कॉन्फ़िगर करें। निम्न विकल्प उपलब्ध हैं :

  • ReadPreference.primary () : सभी रीड्स केवल प्राथमिक प्रतिनिधि के पास जाते हैं। यदि आपको सभी प्रश्नों को सुसंगत (सबसे हाल ही में लिखा गया) डेटा वापस करने की आवश्यकता हो तो इसका उपयोग करें। यह डिफ़ॉल्ट है।

  • ReadPreference.primaryPreferred () : यदि संभव हो तो सभी रीड प्रतिनिधि प्राथमिक सदस्य के पास जाते हैं लेकिन यदि प्राथमिक नोड उपलब्ध नहीं है, तो माध्यमिक सदस्यों को क्वेरी कर सकते हैं। जैसे कि यदि प्राथमिक अनुपलब्ध हो जाता है, तो अंततः सुसंगत हो जाता है, लेकिन केवल यदि प्राथमिक अनुपलब्ध हो।

  • ReadPreference.secondary () : सभी रीड्स सेकेंडरी रेपसेट सदस्यों में जाते हैं और प्राथमिक सदस्य का उपयोग केवल लिखने के लिए किया जाता है। इसका उपयोग केवल तभी करें जब आप अंततः सुसंगत रीडिंग के साथ रह सकते हैं। अतिरिक्त repset सदस्यों का उपयोग रीड परफॉर्मेंस को स्केल करने के लिए किया जा सकता है, हालांकि (repset) सदस्यों की राशि की सीमाएं हो सकती हैं।

  • ReadPreference.secondaryPreferred () : यदि कोई भी उपलब्ध हो, तो सभी रीड्स द्वितीयक प्रतिनिधि सदस्य के पास जाते हैं। प्राथमिक सदस्य विशेष रूप से लिखने के लिए उपयोग किया जाता है जब तक कि सभी माध्यमिक सदस्य अनुपलब्ध न हो जाएं। यह पढ़ने के लिए प्राथमिक सदस्य के लिए वापसी के अलावा अन्य ReadPreference.secondary () के समान है।

  • ReadPreference.nearest () : रीडर्स डेटाबेस क्लाइंट के लिए उपलब्ध नजदीकी प्रतिनिधि के पास जाता है। केवल तभी उपयोग करें जब अंततः सुसंगत रीड स्वीकार्य हों। निकटतम सदस्य ग्राहक और विभिन्न प्रतिनिधि सदस्यों के बीच सबसे कम विलंबता वाला सदस्य है। चूंकि व्यस्त सदस्यों में अंततः उच्च विलंबता होगी, इसलिए इसे स्वचालित रूप से रीड लोड को संतुलित करना चाहिए, हालांकि मेरे अनुभव में माध्यमिक (पसंदीदा) ऐसा करना बेहतर लगता है यदि सदस्य विलंबता अपेक्षाकृत सुसंगत हैं।

नोट: उपरोक्त सभी में एक ही विधि के टैग सक्षम संस्करण हैं जो इसके बजाय TaggableReadPreference इंस्टेंस को वापस करते हैं। प्रतिकृति सेट टैग का पूरा विवरण यहां पाया जा सकता है: प्रतिकृति सेट टैग


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

इदरीस, बहुत सच है। अपनी पोस्ट में मैंने गलत तरीके से मान लिया कि MongoOptions में हमारी चूक थी। हमारी मैंगो ओआरएम परत में क्रमशः 15 सेकंड और 1 मिनट हैं और लिखते समय मैंने माना कि ये चूक थीं। अनंत समय निश्चित रूप से एक बुरा विचार है। सिर के लिए धन्यवाद, मैंने इसे पोस्ट में तय किया
रेमन वैन Vliet

"slaveOk" विकल्प अब पदावनत कर दिया जाता है, यदि आप चाहते हैं कि यह समकक्ष सही हो, तो करें: mongoOptions.readPreference = ReadPreference.secondaryPreferred ();
गुबट्रॉन

अच्छा उत्तर लेकिन आपकी सूत्र की परिभाषाएल्डगेटटॉकब्लॉकफ़ॉरकोनेलिमन्टीप्लायर गलत है (कीवर्ड गुणक)। डॉक्स के अनुसार: "कनेक्शन के लिए गुणक # थ्रेड्स के #PerHost के लिए जो कनेक्शन ब्लॉक कर सकता है यदि कनेक्शनपेरहोस्ट 10 है, और थ्रेड्स एटलटेडब्लॉकब्लॉर्फफ़ोरनेक्शन मोटलिपियर 5 है, तो 50 थ्रेड्स इससे अधिक ब्लॉक कर सकते हैं और एक अपवाद फेंक दिया जाएगा"
टायलर ज़ेल

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