अल्ट्रा-फास्ट डेटाबेस में एक अरब पंक्तियों को स्कैन करना


9

पृष्ठभूमि

एक स्थानीय डेटाबेस में लगभग 1.3 बिलियन अद्वितीय पंक्तियाँ होती हैं। प्रत्येक पंक्ति अप्रत्यक्ष रूप से एक विशिष्ट अक्षांश और देशांतर (स्थान) से जुड़ी होती है। प्रत्येक पंक्ति में एक तारीख मोहर होती है।

उदाहरण

समस्या इस प्रकार है:

  1. उपयोगकर्ता एक प्रारंभिक / समाप्ति तिथि और मूल्यों की एक श्रेणी (जैसे, 100 से 105) निर्धारित करता है।
  2. सिस्टम सभी पंक्तियों को इकट्ठा करता है जो दी गई तारीख से मेल खाते हैं, स्थान के अनुसार समूहीकृत।
  3. सिस्टम उन स्थानों को निर्धारित करता है जो उन तिथियों के दौरान मूल्यों की दी गई सीमा में गिरने की सांख्यिकीय संभावना रखते हैं।
  4. सिस्टम उपयोगकर्ता के सभी मिलान स्थानों को प्रदर्शित करता है।

यह गति और पैमाने की समस्या है।

सवाल

कम से कम महंगी समाधान वास्तुकला क्या है जो आप कल्पना कर सकते हैं कि इस तरह की प्रणाली पांच सेकंड के भीतर उपयोगकर्ताओं के लिए परिणाम प्राप्त करने की अनुमति देगी?

वर्तमान व्यवस्था

पर्यावरण वर्तमान में है:

  • PostgreSQL 8.4 (उन्नयन संभव है; डेटाबेस स्विच करना एक विकल्प नहीं है)
  • आर और पीएल / आर
  • XFS
  • डब्लू डब्लू
  • 8 GB RAM (Corsair G.Skill; 1.3 GHz)
  • क्वाड कोर जेनुएल 7 (2.8 गीगाहर्ट्ज़)
  • उबंटू 10.10

हार्डवेयर अपग्रेड स्वीकार्य हैं।

अद्यतन - डेटाबेस संरचना

अरबों पंक्तियाँ एक तालिका के सदृश हैं:

id | taken | location_id | category | value1 | value2 | value3
  • आईडी - प्राथमिक कुंजी
  • लिया - दिनांक पंक्ति को सौंपा गया
  • location_id - अक्षांश / देशांतर का संदर्भ
  • श्रेणी - डेटा का विवरण
  • value1 .. 3 - उपयोगकर्ता जो अन्य मान क्वेरी कर सकता है

takenस्तंभ आम तौर पर प्रति लगातार तारीखों है location_id, कभी कभी प्रत्येक स्थान 1800 से 2010 तक की डेटा है (के रूप में प्रत्येक स्थान समान दिनांक सीमा में डेटा है 77,000 के बारे में दिनांक, उनमें से कई दोहराया गया)।

सात श्रेणियां हैं और तालिकाओं को पहले से ही श्रेणी (बाल तालिकाओं का उपयोग करके) से विभाजित किया गया है। प्रत्येक श्रेणी में ~ 190 मिलियन पंक्तियाँ हैं। निकट भविष्य में, प्रति श्रेणी पंक्तियों की संख्या एक बिलियन से अधिक होगी।

लगभग 20,000 स्थान और 70,000 शहर हैं। अक्षांश और देशांतर से शहर के लिए स्थान परस्पर संबंधित हैं। प्रत्येक स्थान को किसी विशेष शहर में निर्दिष्ट करने का मतलब है कि शहर की सीमाएं ढूंढना, जो कि एक तुच्छ कार्य नहीं है।

विचार

मेरे पास कुछ विचार शामिल हैं:

  • डेटाबेस को होस्ट करने के लिए क्लाउड सेवा खोजें।
  • एक एसएसडी छापे पट्टी (महान वीडियो) बनाएं ।
  • शहर (पूर्व-गणना) द्वारा सभी स्थानों को समेटने वाली एक तालिका बनाएँ।

धन्यवाद!


10
"डेटाबेस स्विच करना एक विकल्प नहीं है" अच्छी तरह से बहुत अधिक समाधान को समाप्त करता है। सौभाग्य!
स्टीवन ए। लोवे

1
यह कहना मुश्किल है कि आप उन रिकॉर्ड्स के साथ क्या कर रहे हैं, इसके बारे में अधिक जानकारी के बिना। इसके अलावा, क्या आप 5 सेकंड के सबसे खराब मामले की तलाश कर रहे हैं (जिसका अर्थ है कि हर रिकॉर्ड की जांच की जाए और शून्य स्थानों का मिलान हो)?
गाइ सिरटन

2
@ क्या: वर्तमान प्रणाली में कितना समय लगता है? क्या वर्तमान प्रणाली PostGIS का उपयोग कर रही है ? है location_idएक geographyया geometry, या एक दूसरी तालिका को संदर्भित करता है? क्या location_idकॉलम अनुक्रमणित है?
rwong

1
@ Thorbjørn & @Darknight - विचार अनुभाग में मैं पूर्व-गणना की सूची देता हूं, जिससे प्रति दिन प्रति शहर (प्रति श्रेणी) प्रति डेटा एक मूल्य कम हो जाएगा। गणना सालाना, या मासिक भी हो सकती है, मुझे लगता है। यह मेरी योजना थी यदि कोई अन्य संभावनाएं नहीं थीं (गणना में शायद सप्ताह लगेंगे)।
डेव जार्विस

1
@ बहुत संभावनाएं हैं, लेकिन सवाल वही है जो आपके लिए प्रासंगिक है। क्या आपने जांच की है कि वर्तमान में अड़चनें कहां हैं?

जवाबों:


12

सबसे महत्वपूर्ण बात यह पूरी तरह से निश्चित है जहां टोंटी अब प्रतिनिधि अनुरोधों की एक संख्या के लिए है क्योंकि आप डेटाबेस को स्विच नहीं कर सकते हैं।

यदि आप पूर्ण तालिका स्कैन करते हैं, तो आपको उपयुक्त अनुक्रमित चाहिए।

यदि आप I / O पर प्रतीक्षा करते हैं तो आपको कैशिंग के लिए अधिक मेमोरी की आवश्यकता है (जेफ एटवुड ने हाल ही में उल्लेख किया है कि 24 जीबी सिस्टम डेस्कटॉप सिस्टम पर उपलब्ध थे)।

यदि आप सीपीयू पर प्रतीक्षा करते हैं तो आपको यह देखने की आवश्यकता है कि क्या आपकी गणनाओं को अनुकूलित किया जा सकता है।

इसके लिए नुकीले डीबीए-टोपी और एक ऑपरेटिंग सिस्टम-टोपी की आवश्यकता होती है, लेकिन यह सुनिश्चित करने के लिए लायक है कि आप सही पेड़ को भौंक रहे हैं।


आप इसे कितनी बार स्लाइस और डाइस करते हैं - भले ही प्रत्येक पंक्ति में केवल 100 बाइट्स, 1.3 बिलियन पंक्तियाँ = 121 जीबी हों। आपके सभी सूचकांक आदि के साथ, मुझे यकीन है कि यह बहुत अधिक होगा। जब तक आप SSD + Tonnes के आसपास कुछ गंभीर हार्डवेयर नहीं रखते हैं, तब तक आप एक बॉक्स पर धीमे रहने वाले हैं। सस्ता तरीका है बक्से भर में पैमाना।
सुबु शंकर सुब्रमण्यन

4
@ सुब्बू, तुम वितरित जाना चाहते हो? अब आपको दो समस्याएं हैं ...

हेह - कि मैं इससे सहमत हूँ :) लेकिन इसकी सस्ती!
सुबु शंकरा सुब्रमण्यन

@ Thorbjørn: आपके समय और आपकी सभी मदद के लिए धन्यवाद। मुझे लगता है कि मैं प्रति श्रेणी में डेटा को 25 मिलियन पंक्तियों तक कम कर दूंगा, फिर दिनांक पर अनुक्रमित करूंगा। यह स्कैन को ~ 70000 पंक्तियों (प्रति दिन, सीमा के लिए दो सप्ताह की सीमा के साथ) को कम करना चाहिए, जो कि काफी तेज़ होना चाहिए।
डेव जार्विस

@ क्या, आपको अभी भी यह जानना होगा कि आपकी अड़चनें कहाँ हैं। यह जानें कि आप नहीं है, जबकि राशि के लिए।

4

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

यदि आप देखते हैं कि तारीख की मुहर बहुत बदल रही है, तो आप स्थानों के आधार पर विभाजन कर सकते हैं - फिर से क्षैतिज रूप से स्केलेबल। (उम्मीद है कि वे अक्षांश / देशांतर के कई और अधिक नहीं जोड़ते हैं!)


विचारों के लिए धन्यवाद। संभावित रूप से 77,066 तारीखें हैं, और नई तारीखों को आगे बढ़ाते हुए जोड़ा जाएगा। मेरे पास एक ही मशीन है। 20,000 स्थान हैं, फिर भी स्थान से विभाजित करने से मदद नहीं मिलेगी क्योंकि डेटा सभी स्थानों का विश्लेषण करता है।
डेव जार्विस

और कैसे उपर्युक्त समाधान से अलग बादल का उपयोग कर रहा है?
चनी

यही मैंने भी सोचा है। किसी प्रकार का क्षैतिज विभाजन ताकि खोज सभी विभाजनों के समानांतर हो सके।
davidk01

दिन को विभाजित करना संभवतः सबसे अधिक सहायक होगा, जिसके परिणामस्वरूप 2562 अलग-अलग टेबल (366 दिन x 7 श्रेणियां) हो सकती हैं।
डेव जार्विस

4

सबसे खराब स्थिति यह है कि तिथि सीमा आपके डेटाबेस की सभी तिथियों को कवर करती है।

आप 1.3 बिलियन रिकॉर्ड पढ़ना चाहते हैं और 5 सेकंड से कम समय में, एक भौतिक मशीन पर, प्रत्येक रिकॉर्ड बनाम दर्ज किए गए मानों पर कुछ विश्लेषण करते हैं। परिणाम सभी स्थानों या कोई भी हो सकता है - आप पहले से कुछ भी नहीं जानते हैं।

इन मापदंडों को देखते हुए मैं कहूंगा कि संभावना असंभव है।

बस अपनी हार्ड ड्राइव को देखें: मैक्स सस्टेन्ड रेट 150MB / s से कम है। 1.3 बिलियन रिकॉर्ड पढ़ने में 5 सेकंड से अधिक समय लगेगा। सीपीयू-वार आप 5 सेकंड में 1.3 बिलियन रिकॉर्ड पर किसी भी तरह के सांख्यिकीय विश्लेषण करने में सक्षम नहीं होंगे।

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

स्मृति में सभी रिकॉर्ड (या कम से कम महत्वपूर्ण भाग) को पकड़ना संभव हो सकता है। शायद 8GB में नहीं। यह कम से कम डिस्क I / O भाग को समाप्त कर देगा, भले ही मेमोरी बैंडविड्थ 5 सेकंड में सब कुछ के माध्यम से स्कैन करने के लिए अपर्याप्त हो। किसी भी दर पर, इन प्रकार के अनुप्रयोगों को गति देने के लिए यह एक और तकनीक है (मेरे पिछले सुझाव के साथ गठबंधन)।

आप एक क्लाउड सेवा का उपयोग करने का उल्लेख करते हैं। यदि आप पर्याप्त सीपीयू और आईओ मांसपेशी के लिए भुगतान करते हैं और अपने डेटाबेस को कई सर्वरों में विभाजित करते हैं, तो आप बल को विभाजित / विभाजित कर सकते हैं और इसे जीत सकते हैं।


जवाब के लिए धन्यवाद। मेरे द्वारा सूचीबद्ध विचारों के अनुसार हार्डवेयर अपग्रेड एक विचार है। एक उप-$ 750 USD समाधान आदर्श होगा।
डेव जार्विस

2

मैं प्रश्न पर दूसरी रवांग टिप्पणी करता हूं: PostgreSQL उचित अनुक्रमित प्रकार और उपकरण (GIST अनुक्रमित, GIN अनुक्रमित, पोस्टगिस, ज्यामितीय प्रकार) प्रदान करता है इस तरह से कि जियोडेटा और डेटाटाइम से संबंधित डेटा उन मानदंडों के साथ खोज करना चाहिए, जिनमें बहुत अधिक समस्याएं नहीं हैं।

यदि इन मानदंडों पर आपके प्रश्नों में सेकंड लगते हैं, तो इसका मतलब है कि इस तरह के सूचकांक का उपयोग नहीं किया जा रहा है। क्या आप इस बात की पुष्टि कर सकते हैं कि आपने इनकी जाँच उपयुक्त के रूप में की है?


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

2
बी-ट्री पर आधारित अनुक्रमण स्थान आपके द्वारा खोजे जा रहे खोज के प्रकार को देखते हुए थोड़ा उपयोगी नहीं है। आपको एक उल्टे सूचकांक की आवश्यकता होती है जो आवश्यक ऑपरेटरों के साथ काम करता है, जो कि पोस्टगिस के मामले में आमतौर पर GIST का अर्थ है। आप कुछ धीमे प्रश्नों को उजागर करना चाह सकते हैं ...
डेनिस डे बर्नार्डी

1

यह देखते हुए कि आप PostgreSQL और अक्षांश / देशांतर डेटा का उपयोग करते हैं, आपको निश्चित रूप से PostGIS का उपयोग करना चाहिए, इस तरह आप चीजों को गति देने में मदद करने के लिए अपने डेटाबेस में GiST स्थानिक सूचकांक जोड़ सकते हैं।

मेरे पास एक ऐसी तालिका है (350k पंक्तियों के साथ) जो आपकी तुलना में बहुत छोटी है (2 कोर और बमुश्किल 2 जीबी रैम) फिर भी खोज एक सेकंड से कम समय लेती है।


0

शायद आप एक संबंधपरक मॉडल को तोड़ सकते हैं जैसे कि एस्बेस ने उनके ओएलएपी आर्किटेक्चर के साथ किया था: एस्बेसबेस विकिपीडिया

मेरा मतलब है कि प्रति शहर एक तालिका बनाई जाए, इस प्रकार 1000+ तालिकाओं के साथ समाप्त किया जाए। एक तालिका जैसा कि आपने सुझाव नहीं दिया है, लेकिन कई। प्रत्येक तालिका को दिनांक और स्थान के अनुसार अनुक्रमित करें। कई टेबल, कई इंडेक्स -> तेजी से।


नोट के लिए धन्यवाद। 70,000 से अधिक शहर हैं, और कई अलग-अलग अक्षांश / देशांतर मान एक विशिष्ट शहर क्षेत्र में आते हैं।
डेव जार्विस

@ क्या आप शहरों के लिए वोरोनोई आरेख का निर्माण कर सकते हैं और अक्षांशों में लैट / लोन मानों को वर्गीकृत कर सकते हैं? (यानी यदि यह बेतरतीब लगता है, तो इसे रहने दें।) फिर, देखने के दौरान, आप उन सभी शहरों की खोज करेंगे जिनके टेसूलेशन क्वेरी के अक्षांश / लोन पर्वतमाला को छूते हैं। अगर वोरोनोई टेसलेशन बहुत धीमा है, तो वर्गाकार बॉक्स (जैसे 5 डिस लेट x 5 डिग लोन) कोशिश करने लायक हो सकते हैं।
rwong

0

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


-2

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

और मुझे विश्वास है कि आप मुझसे नहीं हैं;

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