MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में पृष्ठ दोष ठीक करना

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

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

MongoDB में डेटा मूवमेंट टोपोलॉजी

क्लाइंट से डेटा वर्चुअल मेमोरी में चला जाता है  जहां पेज कैश इसे लिखे गए तरीके से पढ़ता है, फिर डेटा को डिस्क में संग्रहीत किया जाता है जैसा कि नीचे चित्र में दिखाया गया है।

MongoDB पृष्ठ दोष कैसे खोजें

मोंगोडीबी में डेटा स्थिरता सुनिश्चित करने वाले लॉकिंग प्रदर्शन के माध्यम से पृष्ठ दोषों का पता लगाया जा सकता है। जब कोई दिया गया ऑपरेशन कतार में खड़ा होता है या लंबे समय तक चलता है तो MongoDB का प्रदर्शन ख़राब हो जाता है और ऑपरेशन धीमा हो जाता है क्योंकि यह लॉक होने की प्रतीक्षा करता है। यह एक मंदी की ओर जाता है क्योंकि लॉक से संबंधित देरी छिटपुट होती है और कभी-कभी एप्लिकेशन के प्रदर्शन को प्रभावित करती है। लॉक विभाजित होने पर किसी एप्लिकेशन के प्रदर्शन को लॉक प्रभावित करता है (locks.timeAcquireingMicros by locks.acquireWaitCount), यह किसी दिए गए लॉक मोड की प्रतीक्षा करने के लिए औसत समय देता है। Locks.deadLockCount अनुभव किए गए सभी लॉक अधिग्रहण गतिरोधों का कुल योग देता है। यह देखते हुए कि GlobalLock.totalTime  सामंजस्यपूर्ण रूप से उच्च है, तो लॉक की अपेक्षा करने वाले कई अनुरोध हैं। जैसे-जैसे अधिक अनुरोध लॉक के लिए प्रतीक्षा करते हैं, अधिक रैम की खपत होती है और यह पेज फॉल्ट की ओर जाता है।

आप mem.mapped का भी उपयोग कर सकते हैं जो डेवलपर्स को मोंगॉड द्वारा उपयोग की जा रही कुल मेमोरी की जांच करने में सक्षम बनाता है। Mem.mapped एक MMAPv1 स्टोरेज इंजन में मेगाबाइट (MB) में मेमोरी की मात्रा की जाँच करने के लिए एक सर्वर ऑपरेटर है। यदि mem.mapped ऑपरेटर सिस्टम मेमोरी की कुल मात्रा से अधिक मान दिखाता है तो एक पेज फॉल्ट का परिणाम होगा क्योंकि इतनी बड़ी मात्रा में मेमोरी के उपयोग से डेटाबेस में पेज फॉल्ट हो जाएगा।

MongoDB में पेज फॉल्ट कैसे होते हैं

MongoDB में पेज लोड करना फ्री मेमोरी की उपलब्धता पर निर्भर करता है, अगर इसमें फ्री मेमोरी की कमी है तो ऑपरेटिंग सिस्टम को यह करना होगा:

  1. ऐसे पेज की तलाश करें जिसे डेटाबेस ने इस्तेमाल करना बंद कर दिया है और पेज को मेमोरी डिस्क पर लिखें।
  2. डिस्क से पढ़ने के बाद अनुरोधित पेज को मेमोरी में लोड करें।

ये दो गतिविधियां तब होती हैं जब पृष्ठ लोड हो रहे होते हैं और इस प्रकार सक्रिय मेमोरी में पढ़ने की तुलना में बहुत अधिक समय लगता है जिससे पृष्ठ दोष उत्पन्न होते हैं।

MongoDB पृष्ठ दोषों का समाधान

निम्नलिखित कुछ तरीके हैं जिनके द्वारा कोई पृष्ठ दोषों को हल कर सकता है: 

  1. पर्याप्त RAM वाले उपकरणों के लिए लंबवत स्केलिंग या क्षैतिज रूप से स्केलिंग: जब किसी दिए गए डेटासेट के लिए अपर्याप्त RAM है, तो सर्वर में अधिक संसाधन जोड़ने के लिए अधिक RAM वाले उपकरणों के लिए लंबवत स्केलिंग करके RAM मेमोरी को बढ़ाना सही तरीका है। वर्टिकल स्केलिंग कई सर्वरों के बीच लोड को न फैलाकर MongoDB के प्रदर्शन को बढ़ाने के सर्वोत्तम और सरल तरीकों में से एक है। चूंकि लंबवत स्केलिंग अधिक रैम जोड़ती है, क्षैतिज रूप से स्केलिंग एक शार्प क्लस्टर में अधिक शार्क जोड़ने में सक्षम बनाती है। सरल शब्दों में, क्षैतिज स्केलिंग वह जगह है जहाँ डेटाबेस को विभिन्न विखंडू में विभाजित किया जाता है और कई सर्वरों में संग्रहीत किया जाता है। हॉरिजॉन्टल स्केलिंग डेवलपर को फ्लाई में अधिक सर्वर जोड़ने में सक्षम बनाता है और यह डेटाबेस के प्रदर्शन को बहुत बढ़ा देता है क्योंकि इसमें शून्य डाउनटाइम नहीं लगता है। वर्टिकल स्केलिंग और हॉरिजॉन्टल स्केलिंग, डेटाबेस के साथ काम करते समय काम करने वाली मेमोरी को बढ़ाकर पेज फॉल्ट की संभावना को कम करता है।
  2. सूचकांक डेटा ठीक से: उपयुक्त अनुक्रमणिका का उपयोग ताकि यह सुनिश्चित हो सके कि ऐसी कुशल क्वेरी हैं जो संग्रह स्कैन का कारण नहीं बनती हैं। उचित अनुक्रमण यह सुनिश्चित करता है कि डेटाबेस संग्रह में प्रत्येक दस्तावेज़ पर पुनरावृति नहीं करता है और इस प्रकार पृष्ठ दोष त्रुटि की संभावित घटना को हल करता है। संग्रह स्कैन एक पृष्ठ दोष त्रुटि का कारण बनता है क्योंकि पूरे संग्रह का क्वेरी इंजन द्वारा निरीक्षण किया जाता है क्योंकि इसे रैम में पढ़ा जाता है। संग्रह स्कैन में अधिकांश दस्तावेज़ ऐप में वापस नहीं किए जाते हैं और इस प्रकार प्रत्येक बाद की क्वेरी के लिए अनावश्यक पृष्ठ दोष का कारण बनता है जिसे बचाना आसान नहीं है। इसके अलावा, अतिरिक्त इंडेक्स भी रैम के अक्षम उपयोग को जन्म दे सकते हैं इससे पेज फॉल्ट त्रुटि हो सकती है। इसलिए, उचित अनुक्रमण सर्वोपरि है यदि कोई डेवलपर पृष्ठ दोष त्रुटियों को हल करना चाहता है। MongoDB उन इंडेक्स को निर्धारित करने में सहायता प्रदान करता है जिन्हें डेटाबेस का उपयोग करते समय तैनात करना चाहिए। वे धीमी क्वेरी विश्लेषक दोनों की पेशकश करते हैं जो उपयोगकर्ताओं और साझा उपयोगकर्ताओं के लिए अनुक्रमणिका के बारे में आवश्यक जानकारी देते हैं।
  3. MongoDB के नवीनतम संस्करण में माइग्रेट करना और फिर एप्लिकेशन को WiredTiger में स्थानांतरित करना। यह आवश्यक है यदि आप पृष्ठ दोष त्रुटि का सामना करने से बचने का इरादा रखते हैं क्योंकि नए संस्करणों और WiredTiger के विपरीत पृष्ठ दोष केवल MMAPv1 स्टोरेज इंजन में आम हैं। MMAPv1 स्टोरेज इंजन को हटा दिया गया है और MongoDB अब इसका समर्थन नहीं करता है। WiredTiger MongoDB में वर्तमान डिफॉल्ट स्टोरेज इंजन है और इसमें मल्टीवर्सन कंसुरेंसी कंट्रोल है जो इसे MMAPv1 स्टोरेज इंजन की तुलना में काफी बेहतर बनाता है। WiredTiger के साथ MongoDB फाइल सिस्टम कैश और WiredTiger आंतरिक कैश दोनों का उपयोग कर सकता है जिसका आकार 1GB (50% 0f (RAM - 1GB)) या 256 MB का बहुत बड़ा है।
  4. आपके सिस्टम में उपयोग के लिए उपलब्ध कुल RAM का ट्रैक रखें। यह न्यू रेलिक मॉनिटरिंग Google क्लाउड मॉनिटरिंग जैसी सेवाओं का उपयोग करके किया जा सकता है। इसके अलावा, BindPlane का उपयोग उल्लिखित क्लाउड मॉनिटरिंग सेवाओं के साथ किया जा सकता है। मॉनिटरिंग सिस्टम का उपयोग करना एक सक्रिय उपाय है जो किसी व्यक्ति को होने से पहले पृष्ठ दोषों का सामना करने में सक्षम बनाता है, न कि आने वाले पृष्ठ दोषों पर प्रतिक्रिया करने के लिए। BindPlane मॉनिटर को पेज फॉल्ट की घटना के लिए लगातार अलर्ट सेट करने की अनुमति देता है, अलर्ट इंडेक्स की संख्या, इंडेक्स साइज और फाइल साइज से भी अवगत कराता है।
  5. सुनिश्चित करना कि डेटा मौजूदा वर्किंग सेट में कॉन्फ़िगर किया गया है और अनुशंसित से अधिक रैम का उपयोग नहीं करेगा। MongoDB एक डेटाबेस सिस्टम है जो सबसे अच्छा काम करता है जब अक्सर एक्सेस किए गए डेटा और इंडेक्स असाइन की गई मेमोरी में पूरी तरह से फिट हो सकते हैं। डेटाबेस के प्रदर्शन को अनुकूलित करते समय रैम का आकार एक महत्वपूर्ण पहलू है इसलिए किसी को यह सुनिश्चित करना चाहिए कि ऐप को तैनात करने से पहले हमेशा पर्याप्त रैम मेमोरी हो।
  6. मोंगॉड इंस्टेंस के बीच शार्प जोड़कर या एक शार्प क्लस्टर को तैनात करके लोड वितरित करना। जहां लक्षित संग्रह स्थित है, वहां छायांकन को सक्षम करना महत्वपूर्ण है। सबसे पहले, मोंगो शेल में मोंगो से कनेक्ट करें और नीचे दी गई विधि का उपयोग करें।
    1. sh.shardCollection()

      फिर इस विधि से एक इंडेक्स बनाएं।

      ​db.collection.createIndex(keys, options)
      बनाया गया इंडेक्स शार्प की का समर्थन करता है, अर्थात यदि बनाया गया संग्रह पहले ही कुछ डेटा प्राप्त या संग्रहीत कर चुका है। हालांकि, अगर संग्रह में कोई डेटा (खाली) नहीं है, तो इसे ssh.shardCollection के हिस्से के रूप में अनुक्रमित करने के लिए नीचे दी गई विधि का उपयोग करें: sh.shardCollection()
    2. इसके बाद mongoDB द्वारा प्रदान की गई दो रणनीतियों में से कोई एक है।
      1. हैशेड शेडिंग 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. श्रेणी-आधारित छायांकन 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

MongoDB पृष्ठ दोषों को कैसे रोकें

  1. लोड को वितरित करने के लिए शार्प जोड़ें या शार्प्ड क्लस्टर परिनियोजित करें
  2. अपने एप्लिकेशन को परिनियोजित करने से पहले उसके लिए पर्याप्त RAM रखें
  3. MongoDB के नए संस्करणों पर जाएं और फिर WiredTiger पर जाएं
  4. अधिक RAM वाले डिवाइस के लिए लंबवत या क्षैतिज रूप से स्केल करें 
  5. अनुशंसित RAM का उपयोग करें और उपयोग किए गए RAM स्थान का ट्रैक रखें

निष्कर्ष 

कुछ संख्या में पृष्ठ दोष (अकेले) में कम समय लगता है, हालांकि, ऐसी स्थिति में जहां कई पृष्ठ दोष (कुल) हैं, यह एक संकेत है कि डेटाबेस बड़ी संख्या में डेटा पढ़ रहा है डिस्क। जब समुच्चय होता है तो अधिक MongoBD रीड लॉक होंगे जो एक पृष्ठ दोष का कारण बनेंगे।

MongoDB का उपयोग करते समय, सिस्टम के लिए RAM का आकार और प्रश्नों की संख्या एप्लिकेशन के प्रदर्शन को बहुत प्रभावित कर सकती है। MongoDB में किसी एप्लिकेशन का प्रदर्शन भौतिक मेमोरी पर उपलब्ध RAM पर बहुत अधिक निर्भर करता है जो एप्लिकेशन को एकल क्वेरी बनाने में लगने वाले समय पर प्रभाव डालता है। पर्याप्त RAM  के साथ पृष्ठ दोष कम हो जाते हैं और एप्लिकेशन का प्रदर्शन बेहतर होता है।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB नेस्टेड या/और कहाँ?

  2. मोंगोडब में अद्यतन और वापसी दस्तावेज़

  3. अधिकतम आईडी के साथ तत्व प्राप्त करने के लिए मोंगोडब में findOne का उपयोग करना

  4. डेटाबेस में संग्रह की संख्या की सीमा

  5. एकाधिक मानदंड द्वारा नेस्टेड ऐरे से ऑब्जेक्ट निकालें