मेरे परिदृश्य के लिए कौन सा डेटा स्टोर सबसे अच्छा है?


10

मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं, जिसमें डेटाबेस में अपडेट / सेलेक्टेड क्वेरीज़ का बहुत उच्च निष्पादन शामिल है।

मेरे पास एक बेस टेबल (ए) है, जिसमें एक दिन के लिए एक इकाई के लिए लगभग 500 रिकॉर्ड होंगे। और सिस्टम के प्रत्येक उपयोगकर्ता के लिए, उपयोगकर्ता की कुछ प्राथमिकताओं के आधार पर इस इकाई का एक रूपांतर बनाया जाता है और उन्हें किसी अन्य तालिका (B) में संग्रहीत किया जाता है। यह एक क्रॉन जॉब द्वारा किया जाता है जो हर रोज आधी रात को चलता है।

इसलिए यदि तालिका ए में 10,000 उपयोगकर्ता और 500 रिकॉर्ड हैं, तो उस दिन तालिका बी में 5M रिकॉर्ड होंगे। मैं हमेशा इन तालिकाओं में एक दिन के लिए डेटा रखता हूं और आधी रात को मैं ऐतिहासिक डेटा को HBase में संग्रहीत करता हूं। यह सेटअप ठीक काम कर रहा है और मेरे पास अब तक कोई प्रदर्शन समस्या नहीं है।

हाल ही में व्यावसायिक आवश्यकताओं में कुछ बदलाव हुए हैं और अब आधार तालिका ए (15 - 20 रिकॉर्ड के लिए) में कुछ विशेषताएँ हर 20 सेकंड में बदल जाएंगी और इसके आधार पर मुझे तालिका बी में उन सभी विविध रिकॉर्डों के लिए कुछ मूल्यों को फिर से समझना होगा। सभी उपयोगकर्ताओं। भले ही केवल 20 मास्टर रिकॉर्ड बदलते हैं, लेकिन मुझे 200,000 उपयोगकर्ता रिकॉर्ड को पुनर्गणना और अद्यतन करने की आवश्यकता है जो 20 सेकंड से अधिक समय लेता है और तब तक अगला अपडेट होता है जिसके परिणामस्वरूप सभी चुनिंदा प्रश्नों को कतारबद्ध किया जाता है। मुझे ऑनलाइन उपयोगकर्ताओं से लगभग 3 प्राप्त अनुरोध / 5 सेकंड मिल रहे हैं, जिसके परिणामस्वरूप 6-9 चुनिंदा प्रश्न होते हैं। एक एपीआई के अनुरोध का जवाब देने के लिए, मैं हमेशा टेबल बी में खेतों का उपयोग करता हूं।

मैं अधिक प्रोसेसिंग पावर खरीद सकता हूं और इस स्थिति को हल कर सकता हूं, लेकिन मैं ठीक से स्केलेड सिस्टम होने में दिलचस्पी रखता हूं जो एक मिलियन उपयोगकर्ताओं को भी संभाल सकता है।

क्या यहां कोई बेहतर विकल्प सुझा सकता है? क्या nosql + संबंधपरक डेटाबेस यहाँ मेरी मदद करता है? क्या ऐसे कोई प्लेटफ़ॉर्म / डेटास्टोर्स हैं जो मुझे बिना लॉक किए बार-बार डेटा अपडेट करने देंगे और साथ ही मुझे एक इकाई में विभिन्न क्षेत्रों पर चुनिंदा प्रश्नों को चलाने की सुविधा देंगे?


क्या आपको वास्तव में उस सभी डेटा को स्टोर करने की आवश्यकता है? यह किसी भी तरह लगता है जैसे कि आप अनुरोध पर गणना करना बेहतर होगा। यदि आप 200k रिकॉर्ड की गणना 20 सेकंड से थोड़ा अधिक कर सकते हैं, तो उन 20 रिकॉर्ड की गणना करना संभव होना चाहिए * 3 उपयोगकर्ता = 60 रिकॉर्ड बिना किसी समय के। संभवतः आप देख सकते हैं कि कौन से उपयोगकर्ता ऑनलाइन हैं और किस समय और भी अधिक ऑप्टिमाइज़ करते हैं? थोड़ा सा लगता है जैसे आप किसी के द्वारा उपयोग किए जा रहे डेटा का टन कभी भी उत्पन्न कर रहे हैं (उस समय के दौरान डेटा अभी भी कम से कम वैध है)
थरस्टन मुलर

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

@ जुगस - यह अभी भी इस सवाल को छोड़ देता है कि क्या आप सिर्फ मक्खी की गणना कर सकते हैं। क्या आप है रिकॉर्ड को अपडेट करने, या आपके आवेदन सिर्फ डेटा की जरूरत है वहाँ हो?
बोबसन

मुझे डर है कि मैं मक्खी पर गणना नहीं कर सकता क्योंकि प्रविष्टियां तालिका बी को एक उपयोगकर्ता (1 स्टार के माध्यम से 5 सितारे) के लिए रैंक की जाती हैं और इन गणनाओं के होने के बाद, हम उपयोगकर्ता के लिए फिर से रैंकिंग करते हैं। एक उपयोगकर्ता के लिए पूरी प्रक्रिया 500 msecs लेती है और अगर मैं इसे उड़ान पर करता हूं, तो यह हमारे एपीआई प्रतिक्रिया समय को प्रभावित करेगा
जुग

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

जवाबों:


1

ऐसा लगता है कि तालिका Bकुछ प्रकार की कैश है। लेकिन उस तरह का कैश जो उत्पादकता कम करता है ।।

यहां तक ​​कि अगर आपके पास प्रति सेकंड 25 प्रश्न हैं, तो आप तालिका के उपयोग से इनकार कर सकते हैंB , और प्रत्येक अनुरोध के लिए उत्तर की गणना कर सकते हैं।

वैसे भी , यदि आपके पास 20 रिकॉर्ड को अपडेट करने में 30 सेकंड की देरी है - यह एक सॉफ्टवेयर आर्किटेक्चर में विफल है (मैं गलत हूं, अगर आपका डीबी प्रत्येक रिकॉर्ड के लिए पहले 10 ^ 100 पीआई के 100 संकेतों की गणना करता है)।

जैसा कि मुझे पता है, अनुक्रमिक डीबी के बिना संबंधपरक डीबी, इंडेक्स के साथ, और 1 000 से कम 000 रिकॉर्ड लगभग सभी प्रश्नों के लिए पूरी तरह से काम करेंगे।

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


1

सवाल वास्तव में है कि सिस्टम बी में डालने के लिए रिकॉर्ड और बी डेटा के आकार की गणना करता है।

किसी भी डेटाबेस (उदाहरण के लिए MSSQL) आवेषण की मात्रा को संभालने में सक्षम होना चाहिए, आप किसी भी समस्या के बारे में बात कर रहे हैं, यह मानते हुए कि वस्तु बहुत बड़ी नहीं है।

अपडेट अधिक कठिन समस्या हो सकती है, लेकिन सही अनुक्रमण और लॉकिंग के साथ, फिर से एक बड़ी समस्या नहीं होनी चाहिए।

99% उस समय जब मुझे बी रिकॉर्ड की वजह से इस तरह की समस्या दिखाई देती है, जो एक संग्रहीत खरीद द्वारा गणना की जाती है। यह db सर्वर पर सारा भार डालता है

अगर ऐसा है तो समाधान इस कोड को एक ऑफ़लाइन सेवा में ले जाना है जिसे एक कतार प्रणाली के माध्यम से बुलाया जा सकता है।

तो आपका अपडेट एक संदेश एक कार्यकर्ता प्रक्रिया को ट्रिगर करेगा जो उपयोगकर्ताओं के माध्यम से लूप करेगा और प्रत्येक उपयोगकर्ता के लिए एक अपडेट बी संदेश बनाएगा

एक दूसरी कार्यकर्ता प्रक्रिया बी डेटा के साथ उपयोगकर्ता एक्स को पिकअप करेगी एक घटना बी रिकॉर्ड बनाती है और डीबी को अपडेट करती है

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

आप आगे अद्यतन / आवेषण से चयन को अलग करके अनुकूलित कर सकते हैं। एक नया DB होता है जिसे पुराने डीबी के प्रतिकृति के रूप में सभी चयनित अनुरोध मिलते हैं जो सभी अद्यतन प्राप्त करता है।


0

यदि आप अमेज़ॅन में चल रहे हैं तो मैं डायनामोडीबी पर विचार करूंगा। यह फ्लैश मेमोरी आधारित है। : यहाँ यह करने के लिए एक कड़ी है https://aws.amazon.com/dynamodb/

आप किस प्रकार के आरडीबीएमएस का उपयोग कर रहे हैं? आप एक दृश्य में UDF, या परिकलित फ़ील्ड का उपयोग करके प्रदर्शन को बढ़ाने में सक्षम हो सकते हैं। क्या आप डेटाबेस में एकल अद्यतन क्वेरी के माध्यम से गणना चला रहे हैं, या क्या आप डेटाबेस से डेटा का चयन करते हैं, गणना को किसी अन्य प्रक्रिया में चलाते हैं और फिर उन्हें वापस लोड करते हैं?

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

आप किस तरह के माहौल में चल रहे हैं? यदि यह अमेज़ॅन में ईसी 2 उदाहरण पर एक आरडीबीएमएस है, तो स्थानीय फ्लैश डिस्क पर डीबी डेटाफ़ाइल्स डालने की कोशिश करें। मैंने EBS से स्थानीय डिस्क पर फ़ाइलों को ले जाने में परिमाण के अंतर का एक क्रम देखा है।

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