पृष्ठभूमि :
मैंने एक वेब एप्लिकेशन बनाया है, जिसे मैं यथोचित रूप से सक्षम करना चाहूंगा। मुझे पता है कि मैं Google या Twitter नहीं हूं, लेकिन मेरा ऐप प्रत्येक उपयोगकर्ता के लिए काफी बड़ी मात्रा में डेटा का उपयोग करता है और इस प्रकार डेटा की उच्च आवश्यकताएं हैं। मैं बाद में सब कुछ फिर से आर्किटेक्ट किए बिना यथोचित पैमाने पर तैयार होना चाहता हूं।
मैं खुद को एक सॉफ्टवेयर डेवलपर मानता हूं, डेटाबेस विशेषज्ञ नहीं। इसलिए मैं यहां पोस्ट कर रहा हूं। उम्मीद है कि बहुत अधिक डेटाबेस विशेषज्ञता वाला कोई व्यक्ति मुझे सलाह दे सकता है।
उपयोगकर्ताओं की अपेक्षाकृत बड़ी संख्या के साथ, लेकिन फेसबुक नंबरों की तरह कुछ भी नहीं, मुझे उम्मीद है कि एक डीबी है जो इस तरह दिखता है:
एक "बड़ी तालिका":
- 250 मिलियन रिकॉर्ड
- 20 कॉलम
- लगभग 100 जीबी डेटा
- अनुक्रमित बिगिन (20) विदेशी कुंजी है
- एक अनुक्रमित varchar (500) string_id कॉलम है
- एक इंट (11) "मान" कॉलम है
4 अन्य टेबल:
- 10 मिलियन रिकॉर्ड प्रत्येक
- लगभग 2 - 4 जीबी डेटा प्रत्येक
- इनमें से प्रत्येक टेबल में 4 - 8 कॉलम हैं
- एक कॉलम डेटटाइम है
- एक स्तंभ varchar (500) string_id कॉलम है
- इन तालिकाओं में से प्रत्येक में से एक या दो स्तंभ एक चयन में चुने जाएंगे
इन तालिकाओं में से एक का उपयोग औसत भंडारण के लिए किया जाता है - इसका स्कीमा bigint (20) id, varchar (20) string_id, datetime date_created, float average_value है
मैं क्या करना चाहता हूँ - दो अपेक्षाकृत महंगे प्रश्न:
नए औसत मूल्यों की गणना करें:
- एक विदेशी कुंजी का उपयोग करके, बड़ी तालिका से कई मिलियन अलग-अलग रिकॉर्ड का चयन करें।
- एक नए औसत की गणना करें, string_id द्वारा समूहीकरण।
- औसत तालिका में परिणाम डालें।
- जैसा कि वर्तमान में निर्मित है, यह क्वेरी दो जोड़ का उपयोग करती है।
सेवारत उपयोगकर्ताओं के लिए डी-सामान्यीकृत, केवल-पढ़ने के लिए रिकॉर्ड बनाएं:
- बड़ी तालिका से 1,000-40,000 रिकॉर्ड से कहीं भी चयन करने के लिए एक विदेशी कुंजी का उपयोग करें।
- स्ट्रिंग आईडी कॉलम के साथ नवीनतम रिकॉर्ड पर अन्य चार तालिकाओं में से प्रत्येक के साथ जुड़ें।
- परिणामों को डी-सामान्यीकृत तालिका में डालें।
- ये रिकॉर्ड उपयोगकर्ताओं को जानकारी प्रदर्शित करने के लिए फ्रंट-एंड द्वारा उपयोग के लिए हैं।
- जैसा कि वर्तमान में निर्मित है, यह क्वेरी चार जोड़ का उपयोग करती है।
मैं बैच बैक-एंड डेटाबेस पर इन महंगे प्रश्नों में से प्रत्येक को चलाने की योजना बनाता हूं, जो इसके परिणामों को वास्तविक समय के फ्रंट-एंड डीबी सर्वर पर धकेल देगा, जो उपयोगकर्ताओं से अनुरोधों को संभालता है। इन प्रश्नों को नियमित अंतराल पर चलाया जाएगा। मैंने कितनी बार फैसला नहीं किया है। औसत क्वेरी प्रति दिन शायद एक बार की जा सकती है। डी-नॉर्मलाइज़ क्वेरी को अधिक बार - शायद हर कुछ मिनटों में करना होगा।
इन प्रश्नों में से प्रत्येक वर्तमान में MySQL में कुछ सेकंड्स में "डेटा टेबल" में 100K रिकॉर्ड के साथ एक बहुत कम अंत मशीन पर चलता है। मैं स्केल करने की मेरी क्षमता और स्केलिंग की लागत दोनों के बारे में चिंतित हूं।
प्रश्न :
- क्या यह दृष्टिकोण ध्वनि लगता है? क्या बड़ी तस्वीर के नजरिए से इसमें कुछ गलत है?
- क्या RDBMS सही उपकरण है, या क्या मुझे Hadoop परिवार में किसी चीज़ की तरह अन्य "बड़े डेटा" समाधानों को देखना चाहिए? मेरा झुकाव RDBMS का उपयोग करना है क्योंकि डेटा संरचित है और संबंधपरक मॉडल में अच्छी तरह से फिट बैठता है। हालांकि एक निश्चित बिंदु पर, यह मेरी समझ है कि मैं अब RDBMS का उपयोग करने में सक्षम नहीं हो सकता। क्या यह सच है? इस स्विच की आवश्यकता कब होगी?
- क्या ये काम करेगा? क्या उचित समय में इन प्रश्नों को चलाया जा सकता है? मैं क्वेरी # 1 के लिए शायद घंटों इंतजार कर सकता हूं, लेकिन क्वेरी # 2 मिनटों में समाप्त हो जानी चाहिए।
- हार्डवेयर परिप्रेक्ष्य से मुझे क्या विचार करना चाहिए? मेरी रैम और सीपीयू अड़चनें क्या हैं? मुझे लगता है कि RAM में अनुक्रमित रखना महत्वपूर्ण है। क्या कुछ और है जिस पर मुझे विचार करना चाहिए?
- कुछ बिंदु पर मुझे संभवतः अपने डेटा का विभाजन करना होगा और कई सर्वरों का उपयोग करना होगा। क्या मेरा उपयोग मामला ऐसा लगता है कि यह पहले से ही उस श्रेणी में है, या मैं थोड़ी देर के लिए एक भी मशीन को लंबवत रूप से स्केल कर पाऊंगा? क्या यह 10x डेटा के साथ काम करेगा? 100x?