2013-08-13 32 views
9

में समय श्रृंखला को संग्रहीत करना मैं अमेज़ॅन के डायनेमो डीबी डेटाबेस में 1 एम + अलग-अलग समय श्रृंखला स्टोर करना चाहता हूं। प्रत्येक बार श्रृंखला में लगभग 50 के डेटा पॉइंट होंगे। एक डेटा बिंदु एक टाइमस्टैम्प और एक मूल्य शामिल है।AWS DynamoDb

एप्लिकेशन समय-समय पर (हमेशा समय) के लिए नए डेटा अंक जोड़ देगा और समय-समय पर विश्लेषिकी के लिए पुनर्प्राप्त (आमतौर पर पूरे समय श्रृंखला) समय श्रृंखला को पुनर्प्राप्त करेगा।

मुझे डेटाबेस को कैसे व्यवस्थित करना चाहिए? क्या मुझे प्रत्येक टाइमरीज़ के लिए एक अलग टेबल बनाना चाहिए? या मुझे एक टेबल में सभी डेटा अंक रखना चाहिए?

+4

आपने क्या उपयोग किया? – Hugo

+3

आप किस डिजाइन का उपयोग कर समाप्त किया? – Narayan

उत्तर

12

मान लें कि आपका डेटा अपरिवर्तनीय है और आकार दिया गया है, तो आप Amazon Redshift पर विचार करना चाहेंगे; यह पेटबाइट आकार के रिपोर्टिंग समाधानों के लिए लिखा गया है।

डायनेमो में, मैं कुछ व्यवहार्य डिजाइनों के बारे में सोच सकता हूं। सबसे पहले, आप एक कंपाउंड हैश/रेंज कुंजी (दोनों स्ट्रिंग्स) के साथ एक टेबल का उपयोग कर सकते हैं। हैश कुंजी समय श्रृंखला का नाम होगा, रेंज कुंजी एक आईएसओ 8601 स्ट्रिंग के रूप में टाइमस्टैम्प होगी (जिसमें सुखद संपत्ति है जो वर्णानुक्रमिक क्रम भी क्रोनोलॉजिकल ऑर्डरिंग है), और प्रत्येक आइटम पर एक अतिरिक्त विशेषता होगी; एक कीमत'। यह आपको एक समय श्रृंखला (हैशके समानता पर प्रश्न) और एक समय श्रृंखला का एक सबसेट चुनने का अधिकार देता है (हैशकी समानता और सीमा के बीच सीमा के बारे में प्रश्न)। हालांकि, आपकी मुख्य समस्या "हॉटस्पॉट" समस्या है: आंतरिक रूप से, डायनेमो आपके डेटा को हैशके द्वारा विभाजित करेगा, और आपके सभी विभाजनों पर आपकी ProvisionedReadCapacity फैल जाएगा। तो आपके पास 1000 सेकंड पढ़ने वाला एक सेकंड हो सकता है, लेकिन यदि आपके पास 100 विभाजन हैं, तो आपके पास प्रत्येक विभाजन के लिए केवल 10 KB एक सेकंड है, और एक ही समय श्रृंखला (एकल हैशके) से सभी डेटा पढ़ने से केवल एक विभाजन ही प्रभावित होगा। तो आपको लगता है कि आपके 1000 केबी पढ़ने से आपको 1 एमबी एक सेकंड मिलती है, लेकिन यदि आपके पास 10 एमबी संग्रहीत है तो इसे पढ़ने के लिए आपको अधिक समय लग सकता है, क्योंकि आपका एकल विभाजन आपको बहुत अधिक भारी कर देगा।

ऊपर की तरफ, डायनेमो डीबी की स्केलिंग पर अत्यधिक उच्च लेकिन महंगा ऊपरी सीमा है; यदि आप चाहते थे कि आप 100,000 पढ़ने की क्षमता इकाइयों के लिए भुगतान कर सकें, और उस डेटा के उप-दूसरे प्रतिक्रिया समय हो।

एक और सैद्धांतिक डिजाइन प्रत्येक बार श्रृंखला को एक अलग तालिका में स्टोर करना होगा, लेकिन मुझे नहीं लगता कि डायनेमोडबीबी लाखों तालिकाओं तक स्केल करने के लिए है, इसलिए यह शायद कोई नहीं है।

आप 10 टेबलों में अपनी टाइम सीरीज़ को आजमा सकते हैं और तालिका तालिका में "अत्यधिक पढ़ा" डेटा चला सकते हैं, तालिका 10 में "डेटा कभी नहीं पढ़ा", और अन्य सभी डेटा के बीच कहीं भी। यह आपको प्रावधान थ्रूपुट/विभाजन थ्रॉटलिंग नियमों को "गेम" करने देगा, लेकिन आपके डिजाइन में जटिलता की उच्च डिग्री पर। कुल मिलाकर, यह शायद इसके लायक नहीं है; आप नई समय श्रृंखला कहां करते हैं? आपको याद है कि वे कहां हैं? आप एक समय श्रृंखला कैसे ले जाते हैं?

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

+0

मैं एक MySQL डेटाबेस में एक छोटे से ईसी 2 उदाहरण पर 100 के समय श्रृंखला को संभाल सकता हूं। जो बहुत सस्ता है। Redshift अतिरिक्त बड़े ईसी 2 उदाहरणों की आवश्यकता है जो बहुत महंगा हैं ... – jQguru

0

जेएसओएन या इसी तरह की दुकान में एसई 3 में प्रत्येक बार श्रृंखला को टपकाने के बारे में। अधिकतर आपको डायनेमो जैसे कहीं से एक लुकअप की आवश्यकता होगी।

आपको अभी भी अपने इनपुट को संसाधित करने के लिए Redshift की आवश्यकता हो सकती है।

संबंधित मुद्दे