MongoDB और डेटासेट जो RAM में फिट नहीं होते हैं, चाहे आप कितनी भी मेहनत कर लें


12

यह बहुत ही सिस्टम पर निर्भर है, लेकिन संभावना है कि हम कुछ मनमानी चट्टानों को पार करेंगे और वास्तविक परेशानी में पड़ेंगे। मैं उत्सुक हूँ कि डिस्क-स्पेस अनुपात में एक अच्छी रैम के लिए किस तरह के नियम-अंगूठे मौजूद हैं। हम सिस्टम के हमारे अगले दौर की योजना बना रहे हैं, और रैम, एसएसडी के बारे में कुछ विकल्प बनाने की जरूरत है, और प्रत्येक नए नोड्स को कितना मिलेगा।

लेकिन अब कुछ प्रदर्शन विवरण के लिए!

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

संपूर्ण उपयोगकर्ता अंत-उपयोगकर्ता व्युत्पन्न स्रोतों से यादृच्छिक प्रश्नों के साथ लगातार मारा जाता है; हालांकि आवृत्ति अनियमित है, आकार आमतौर पर बहुत छोटा है (10 दस्तावेजों के समूह)। चूंकि यह उपयोगकर्ता का सामना कर रहा है, इसलिए उत्तर को 3 सेकंड की "ऊब-अब" सीमा के तहत होना चाहिए। यह एक्सेस पैटर्न कैश में होने की संभावना बहुत कम है, इसलिए डिस्क हिट को लाइक करने की बहुत संभावना होगी।

एक माध्यमिक प्रसंस्करण वर्कफ़्लो पिछले प्रसंस्करण रन का उच्च पढ़ा जाता है जो दिन, सप्ताह या महीने पुराना हो सकता है, और इसे अक्सर चलाया जाता है, लेकिन फिर भी इसे ज़िप्पी करने की आवश्यकता होती है। पिछले प्रसंस्करण रन में दस्तावेजों के 100% तक पहुंच होगी। कैश-वार्मिंग की कोई भी राशि इससे मदद नहीं कर सकती, मुझे संदेह है।

समाप्त दस्तावेज़ आकार व्यापक रूप से भिन्न होते हैं, लेकिन औसत आकार 8K है।

सामान्य प्रोजेक्ट प्रोसेसिंग का उच्च-पढ़ा जाने वाला भाग रीड ट्रैफ़िक को वितरित करने में सहायता करने के लिए प्रतिकृतियों के उपयोग का दृढ़ता से सुझाव देता है। मैंने कहीं और पढ़ा है कि 1:10 RAM-GB से HD-GB धीमी डिस्क के लिए एक अच्छा नियम है, जैसा कि हम बहुत तेजी से SSDs का उपयोग करने पर गंभीरता से विचार कर रहे हैं, मैं जानना चाहूंगा कि क्या एक समान नियम है तेजी से डिस्क के लिए अंगूठे का।

मुझे पता है कि हम एक तरह से मैंगो का उपयोग कर रहे हैं जहां कैश-सब कुछ वास्तव में उड़ान भरने वाला नहीं है, यही वजह है कि मैं एक ऐसे सिस्टम को इंजीनियर करने के तरीकों पर गौर कर रहा हूं जो इस तरह के उपयोग से बच सकता है। पूरे डाटासेट संभावना आधे से एक वर्ष के भीतर एक टीबी के सबसे हो सकता है और बढ़ रहा रखेंगे।


एक कठिन सवाल अच्छी तरह से पूछा।
ग्वेल्डो

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

@ मैं जो भी जानने की कोशिश कर रहा हूं उसका कुछ हिस्सा है जब मुझे शार्प करने की जरूरत होती है, इसके अलावा मैं व्यक्तिगत प्रतिकृति नोड्स को कैसे बना सकता हूं। मेरे अनंतिम युक्ति में पीसीआई-आधारित एसएसडी कार्ड शामिल है।
sysadmin1138

आह, समझ गया। आप शुरुआत से ही शार्पिंग पर विचार कर सकते हैं, हम एकल सर्वर को बहुत अधिक बढ़ाते हैं। यह आपको राइट लॉक के आसपास मिलता है और प्रभावी रूप से आपके कुल कोर को लिखता है। साथ ही, बाद में सर्वर के बीच शार्क को स्थानांतरित करना आसान है।
4

जवाबों:


5

यह छोटे बिंदुओं का एक समूह है। हालाँकि, आपके प्रश्न का कोई एकल उत्तर नहीं है।

MongoDB OS कर्नेल को मेमोरी-मैनेजमेंट को संभालने की अनुमति देता है। समस्या पर जितना संभव हो उतना रैम फेंकने के अलावा, केवल कुछ चीजें हैं जो आपके वर्किंग सेट को 'सक्रिय रूप से प्रबंधित' करने के लिए की जा सकती हैं।

एक चीज़ जो आप राइट्स को ऑप्टिमाइज़ करने के लिए कर सकते हैं, वह उस रिकॉर्ड के लिए पहली क्वेरी है (एक रीड करें), ताकि यह काम करने वाली मेमोरी में हो। यह प्रोसेस-वाइड ग्लोबल लॉक (जो v2.2 में प्रति db माना जाता है) से जुड़ी प्रदर्शन समस्याओं से बच जाएगा)

रैम बनाम एसएसडी अनुपात के लिए कोई कठिन-व्रत नियम नहीं है, लेकिन मुझे लगता है कि एसएसडी के कच्चे आईओपीएस को आपको बहुत कम अनुपात के साथ जाने की अनुमति देनी चाहिए। मेरे सिर के ऊपर से, 1: 3 शायद सबसे कम है जिसे आप साथ जाना चाहते हैं। लेकिन उच्च लागत और कम क्षमता को देखते हुए, आपको उस अनुपात को वैसे भी नीचे रखने की आवश्यकता है।

'लिखने बनाम पढ़ने के चरणों' के बारे में, क्या मैं सही ढंग से पढ़ रहा हूं कि एक बार एक रिकॉर्ड लिखे जाने के बाद, यह शायद ही कभी अपडेट किया जाता है ("upserted")? यदि ऐसा है, तो दो समूहों की मेजबानी करना सार्थक हो सकता है; सामान्य लेखन क्लस्टर, और "वृद्ध" डेटा के लिए पढ़ा-अनुकूलित क्लस्टर जिसे [X समय अवधि] में संशोधित नहीं किया गया है । मैं निश्चित रूप से इस क्लस्टर पर दास-पठन को सक्षम करूंगा। (व्यक्तिगत रूप से, मैं आपके db के ऑब्जेक्ट दस्तावेज़ों में दिनांक-संशोधित मूल्य शामिल करके प्रबंधित करूँगा।)

यदि आपके पास प्रोडक्ट में जाने से पहले लोड-टेस्ट करने की क्षमता है, तो नरक की निगरानी करें। MongoDB को इस धारणा के साथ लिखा गया था कि इसे अक्सर VMs में तैनात किया जाएगा (उनके संदर्भ सिस्टम EC2 में हैं), इसलिए VMs को शार्प करने से डरो मत।


प्रसंस्करण के दौरान एक प्रारंभिक दस्तावेज स्टब बनाया जाता है और फिर प्रसंस्करण के पहले भाग में विभिन्न उप-चरणों द्वारा लगातार अद्यतन किया जाता है। हम प्रारंभिक स्तर पर कुछ हैंड-पेडिंग करने की संभावना को कम कर रहे हैं, जो हम कर रहे हैं, की मात्रा को कम करने के लिए, लेकिन हमारा वर्तमान राइट-लॉक प्रतिशत खुशी से कम है।
sysadmin1138

रैम में इसे प्राप्त करने के लिए लिखने से पहले रिकॉर्ड पढ़ने की सलाह अच्छी सलाह नहीं है। 2.0 के बाद से (2011 के मध्य) MongoDB उपज है अगर डेटा तक पहुँचने के लिए RAM में नहीं है, तो आप सिर्फ एक अतिरिक्त पढ़ने के लिए और बिना किसी अच्छे कारण के लिए सर्वर के लिए एक अतिरिक्त दौर यात्रा का कारण बन रहे हैं यदि आप ऐसा करते हैं तो ताला बंद हो जाएगा वैसे भी उस अवधि के लिए आयोजित नहीं किया जा सकता है।
अस्य कामस्की

13

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

आप रीडहेड (लिनक्स पर) के लिए वर्तमान सेटिंग्स को चलाकर जांच सकते हैं blockdev --report(आमतौर पर sudo / root विशेषाधिकारों की आवश्यकता होती है)। यह प्रत्येक डिस्क डिवाइस के लिए एक पंक्ति के साथ एक तालिका का प्रिंट आउट लेगा। आरए कॉलम में रीडहेड के लिए मान होता है। यह मान 512 बाइट सेक्टरों की संख्या है (जब तक कि सेक्टर का आकार डिफ़ॉल्ट नहीं है - ध्यान दें कि इस पोस्ट को लिखने के समय, यहां तक ​​कि डिस्क जिनके बड़े आकार हैं उन्हें 512 बाइट क्षेत्रों के रूप में माना जाता है) जो हर पर पढ़े जाते हैं डिस्क का उपयोग।

आप किसी दिए गए डिस्क डिवाइस के लिए रीडहेड सेटिंग को चलाकर सेट कर सकते हैं:

blockdev --setra <value> <device name>

सॉफ़्टवेयर आधारित RAID सिस्टम का उपयोग करते समय, प्रत्येक डिस्क डिवाइस पर रीडहेड सेट करने के साथ-साथ उस डिवाइस पर भी सुनिश्चित करें जो RAID नियंत्रक से मेल खाती है।

यह महत्वपूर्ण क्यों है? वैसे, रीडहेड उसी संसाधन का उपयोग करता है जो MongoDB क्रमिक पहुंच के लिए अपने रीड को ऑप्टिमाइज़ करने के लिए उपयोग करने की कोशिश कर रहा है - RAM। जब आप कताई डिस्क पर अनुक्रमिक रीडिंग कर रहे हैं (या ऐसे उपकरण जो कताई डिस्क की तरह कुछ भी व्यवहार करते हैं - ईबीएस मैं आपको देख रहा हूं), रैम में आस-पास के डेटा को प्राप्त करना प्रदर्शन को बड़े पैमाने पर बढ़ा सकता है, आपको ढूंढने पर बचा सकता है, और उच्च रीडहैड सेटिंग में सही वातावरण आपको कुछ प्रभावशाली परिणाम दे सकता है।

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

सही रीडहेड आकार चुनना मुश्किल है और आपके हार्डवेयर, कॉन्फ़िगरेशन, ब्लॉक आकार, स्ट्राइप आकार और डेटा पर निर्भर करता है। यदि आप उदाहरण के लिए SSDs में जाते हैं, तो आप कम सेटिंग चाहते हैं, लेकिन डेटा पर कितना कम निर्भर करेगा।

व्याख्या करने के लिए: आप यह सुनिश्चित करना चाहते हैं कि रीडहेड एक पूर्ण एकल दस्तावेज़ में खींचने के लिए पर्याप्त है और डिस्क पर वापस नहीं जाना है। आइए अपने उल्लिखित औसत दर्जे का आकार 8k लें - क्योंकि डिस्क पर सेक्टर्स आम तौर पर 512 बाइट्स होते हैं इसलिए पूरे डॉक्यूमेंट को बिना रीडहेड के पढ़ने के लिए इसे 16 डिस्क एक्सेस लेना होगा। यदि आपके पास 16 क्षेत्रों या उससे अधिक का रीडहेड था, तो आप पूरे दस्तावेज़ में डिस्क पर केवल एक यात्रा के साथ पढ़ेंगे।

दरअसल, चूंकि MongoDB इंडेक्स बकेट 8k हैं, आप कभी भी 16 से नीचे रीडहेड सेट नहीं करना चाहेंगे, या यह एक इंडेक्स बकेट में पढ़ने के लिए 2 डिस्क एक्सेस लेगा। एक सामान्य अच्छा अभ्यास अपनी वर्तमान सेटिंग के साथ शुरू करना है, इसे आधा करना है, फिर अपने रैम उपयोग और आईओ का पुनर्मूल्यांकन करें और वहां से आगे बढ़ें।


1
मूल्यवान सूचना जो घर में कुछ हार्डवेयर प्राप्त करने के बाद निश्चित रूप से काम में आएगी। धन्यवाद!
sysadmin1138

3

आपको एंड-यूज़र क्वेरी के लिए प्रतिकृतियों का उपयोग करने और अन्य मशीनों पर किए गए अपने वर्कफ़्लो पर विचार करना चाहिए।

अपने 1:10 रूल-ऑफ-थंब का उपयोग करते हुए, आप डिस्क स्टोरेज के 1TB के लिए लगभग 128GB RAM देख रहे हैं; हालांकि कुछ सस्ती SSDs आज तक पहुंचने का दावा करती हैं> 60K IOPS, असली दुनिया की संख्या काफी भिन्न हो सकती है, साथ ही साथ आप अपने SSDs के साथ RAID का उपयोग कर रहे हैं या नहीं, और यदि आप कर रहे हैं, तो RAID कार्ड अत्यंत महत्वपूर्ण है ।

इस पोस्ट के समय, DDR3 ECC ram के 128GB से 256GB तक जाने पर 1U इंटेल सर्वर पर लगभग 2000 $ अतिरिक्त लगता है, और यह आपको 1TB डेटा के साथ 1: 5 अनुपात देगा, जो मुझे लगता है कि होगा और भी बेहतर अनुपात। यदि आपको अपने कार्यभार को जितनी जल्दी हो सके समाप्त करने की आवश्यकता है, तो अधिक रैम निश्चित रूप से मदद करेगा, लेकिन क्या यह वास्तव में जरूरी है?

आपको ext4 पर कुछ फाइल सिस्टम ट्यूनिंग करने की आवश्यकता होगी, जैसे "noatime, data = writeback, nobarrier", और आपको कुछ कर्नेल सेटिंग्स ट्वीक करने की आवश्यकता हो सकती है, साथ ही सबसे अधिक प्रदर्शन को निचोड़ने के लिए जिसे आप अपने से बाहर कर सकते हैं। प्रणाली।

यदि आप RAID के साथ जा रहे हैं, तो RAID-10 एक बहुत अच्छा विकल्प होगा, और उचित RAID नियंत्रक के साथ काफी प्रदर्शन को बढ़ावा देगा, लेकिन आपके उपलब्ध स्थान को आधा कर देगा। यदि आप अपने उपलब्ध स्थान को आधा किए बिना एक अच्छा प्रदर्शन को बढ़ावा देना चाहते हैं, तो आप RAID50 में भी देख सकते हैं। RAID चलाने का जोखिम यह है कि अब आपके पास ड्राइव पर TRIM तक पहुंच नहीं है, जिसका अर्थ है कि हर बार और फिर से आपको अपना डेटा बाहर ले जाने, RAID को तोड़ने, ड्राइव को फिर से चलाने और RAID को फिर से बनाने की आवश्यकता है।

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

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