यदि MongoDB में बहुत सारे आवेषण हैं, तो क्या होगा? कैसे सुनिश्चित करें कि सभी डेटा संग्रहीत है?


24

मैं समय-समय पर मापा मूल्यों को संग्रहीत करने के लिए MongoDB का उपयोग करता हूं। प्रत्येक ~ 100 एमएस में मूल्यों का एक गुच्छा दस्तावेज़ के रूप में डाला जाता है। यह ठीक काम करता है, लेकिन मैं प्रदर्शन के मुद्दों को लेकर चिंतित हूं। (मैं सुरक्षित आवेषण का उपयोग करता हूं, ऐसा लगता है जैसे कि PyMongo में यह डिफ़ॉल्ट है।)

क्या होता है जब हार्ड डिस्क को सहेजने में मोंगॉड की तुलना में प्रति सेकंड अधिक आवेषण होते हैं? क्या कोई चेतावनी होगी या यह बस चुपचाप विफल हो जाएगा?

क्या लेखन भार की निगरानी करने की कोई विधि है? मैंने केवल वही पाया है db.serverStatus().writeBacksQueuedजो मुझे कॉल करने पर हमेशा गलत पर सेट होता है। मैं कैसे लिख सकता हूं कि मुझे लिखने की कतार को भरने के लिए कितना डेटा डालना है?

mongostatताले दिखाता है। क्या इस बारे में मुझे कुछ चिंतित होना चाहिए?

insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn repl       time 
  *117     *0     *0     *0       0     2|0       0  17.4g  35.3g  3.76g      0     .:6.5%          0       0|0     0|0   124b     6k     2  SLV   09:58:10 
  *111     *0     *0     *0       0     2|0       0  17.4g  35.3g  3.76g      0     .:0.8%          0       0|0     0|0   124b     6k     2  SLV   09:58:11 
  *111     *0     *0     *0       0     2|0       0  17.4g  35.3g  3.76g      0     .:4.2%          0       0|0     0|0   124b     6k     2  SLV   09:58:1

क्या मुझे ताले लिखने की चिंता है? लेखन बंद समय अवधि के दौरान सम्मिलित करने के लिए क्या होता है? क्या इसे बाद में कतारबद्ध और संग्रहीत किया गया है?

मैं एक मास्टर और एक गुलाम का उपयोग करके एक सरल प्रतिकृति सेटअप के बारे में सोच रहा हूं। क्या प्रारंभिक सिंक या एक रेसक्यूंक प्रक्रिया डेटाबेस को लॉक करती है?

(मैं संस्करण 2.4.3 का उपयोग कर रहा हूं।)

अद्यतन: मुझे लगता है कि आंशिक रूप से मेरे अपने प्रश्न का उत्तर दिया है। मैं एक छोटे से परीक्षण दस्तावेज़ सम्मिलित करते हुए एक साधारण का उपयोग करके प्रति सेकंड 12.000 आवेषण तक पहुंचने में कामयाब रहा। लेकिन qr | qw अभी भी दिखाता है कि पढ़ी जाती हैं- और लिखना कतार अभी भी खाली है:

insert  query update delete getmore command flushes mapped  vsize    res faults       locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn repl       time 
 11234     *0      2     *0    1563     1|0       1  21.9g  44.3g  1.22g      0    testdb:58.9%          0       1|0     1|1   797k   980k     6  PRI   10:26:32 
 12768     *0      2     *0    1284     1|0       0  21.9g  44.3g  1.22g      0    testdb:58.0%          0       0|0     0|1   881k     1m     6  PRI   10:26:33 
 12839     *0      2     *0    1231     1|0       0  21.9g  44.3g  1.22g      0    testdb:60.3%          0       0|0     0|1   883k     1m     6  PRI   10:26:34 
 12701     *0      2     *0     910     1|0       0  21.9g  44.3g  1.22g      0    testdb:61.8%          0       0|0     0|1   858k     1m     6  PRI   10:26:35 
 12241     *0      2     *0    1206     1|0       0  21.9g  44.3g  1.22g      0    testdb:56.7%          0       0|0     0|0   843k     1m     6  PRI   10:26:36 
 11581     *0      2     *0    1406     1|0       0  21.9g  44.3g  1.22g      0    testdb:61.8%          0       0|0     0|1   811k     1m     6  PRI   10:26:37 
  8719     *0      2     *0    1210     1|0       0  21.9g  44.3g  1.22g      0    testdb:43.8%          0       0|0     0|1   618k   762k     6  PRI   10:26:38 
 11429     *0      2     *0    1469     1|0       0  21.9g  44.3g  1.22g      0    testdb:60.6%          0       0|0     0|1   804k   993k     6  PRI   10:26:39 
 12779     *0      2     *0    1092     1|0       0  21.9g  44.3g  1.22g      0    testdb:60.2%          0       1|0     0|1   872k     1m     6  PRI   10:26:40 
 12757     *0      2     *0     436     1|0       0  21.9g  44.3g  1.22g      0    testdb:59.7%          0       0|0     0|1   838k   432k     6  PRI   10:26:41 

मुझे लगता है कि इसका मतलब यह है कि अकेले आवेषण बहुत परेशानी का कारण नहीं बनेंगे: "यदि आप बहुत सारे लेखन कार्य कर रहे हैं, तो अन्य लिखित भारी ऑप्स के साथ, जैसे कि बड़े रंगे हुए हटाता है, कतारें बढ़ेंगी।" ( यहां पाया गया ]

मेरा खुला प्रश्न: यदि लंबी अवधि में लेखन कतार बढ़ती है तो मेरे डेटा का क्या होगा?

जवाबों:


25

आपने अपने कुछ प्रश्नों के उत्तर यहां दिए हैं, विशेष रूप से आपके पास समीकरण के राइट लॉक पहलू के बारे में एक अच्छा विचार है - 12,000 इंसर्ट / सेकंड आपको ~ 60% राइट लॉक पर मिल जाता है। लगातार प्रदर्शन पाने के लिए यह एक उचित स्तर है - आपको कुछ विवाद हो रहे होंगे, और कुछ ऑप्स थोड़े धीमे होंगे, लेकिन आप वास्तव में लगभग 80% चिंता करना शुरू करना चाहते हैं - बहुत सी चीजों की तरह, जब आप 80% से अधिक उपलब्ध होने लगते हैं क्षमता आप मुद्दों को अधिक बार मारना शुरू कर देंगे।

अन्य अड़चनों के संदर्भ में, और विशेष रूप से आप कितनी जल्दी डिस्क पर लिख सकते हैं - यह समस्या पैदा कर सकता है, लेकिन समय के साथ प्रासंगिक आँकड़ों को देखने के लिए मैं आपको हार्डवेयर और आईओ आँकड़े देने के लिए मुनिन-नोड प्लगइन के साथ एमएमएस स्थापित करने की सलाह दूंगा। MongoDB आँकड़े के अलावा।

जब आपके पास ऐसा हो, तो आप जिन मीट्रिक पर नज़र रखना चाहेंगे, वे हैं:

  • औसत फ्लश समय (यह है कि MongoDB की डिस्क में आवधिक सिंक कितना समय ले रहा है)
  • हार्डवेयर टैब में IOStats (विशेष रूप से IOWait)
  • पृष्ठ दोष (यदि आपकी डिस्क लिखने में व्यस्त है और आपको डेटा पढ़ने की आवश्यकता है, तो वे एक दुर्लभ संसाधन के लिए प्रतिस्पर्धा करने वाले हैं)

यह थोड़ा जटिल है, लेकिन यहाँ एक मूल विचार है:

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

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

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

अपने पहले के बाद, अपने कुछ सवालों पर:

क्या होता है जब हार्ड डिस्क को सहेजने में मोंगॉड की तुलना में प्रति सेकंड अधिक आवेषण होते हैं? क्या कोई चेतावनी होगी या यह बस चुपचाप विफल हो जाएगा?

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

मैं एक मास्टर और एक गुलाम का उपयोग करके एक सरल प्रतिकृति सेटअप के बारे में सोच रहा हूं। क्या प्रारंभिक सिंक या एक रेसक्यूंक प्रक्रिया डेटाबेस को लॉक करती है?

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

अगर लंबी अवधि में लेखन कतार बढ़ती है तो मेरे डेटा का क्या होगा?

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

आम तौर पर, आप अपने सीमित कारक का पता लगाना चाहते हैं - यह लॉकिंग, डिस्क की गति आदि हो और फिर एक कठिन सीमा को हिट करने और प्रदर्शन की समस्याओं को देखने से पहले समय और स्केल आउट (शार्पिंग) (बेहतर हार्डवेयर) के स्तर को ट्रैक करें।

एक आखिरी बात, db.serverStatus().writeBacksQueuedवास्तव में एक मीट्रिक है जो केवल कभी-कभी एक तेज वातावरण में गैर-शून्य होगा, और यह सुनिश्चित करने के साथ करना होगा कि प्रवास के दौरान एक चंक को लिखता है उचित तरीके से ( राइटबैक श्रोता द्वारा नियंत्रित ) से निपटा जाता है । इसलिए यह अनिवार्य रूप से एक लाल हेरिंग है - सामान्य लिखने की मात्रा के साथ कुछ नहीं करना है।

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