2008-11-04 25 views
8

लघु संस्करणshards भर में खोज रहे हैं?

अगर मैं टुकड़ों में मेरी उन विभाजित है, मैं एक "उपयोगकर्ता की खोज" कैसे प्रदान करते हैं? जाहिर है, मैं नहीं चाहता कि प्रत्येक खोज हर शार्ड को मार दें।

लांग संस्करण

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

शेडिंग बनाम रीडिकेशन का लाभ यह है कि पढ़ने की प्रतिकृति आपके लेखन को स्केल नहीं करती है। मास्टर के पास जाने वाले सभी लेखों को प्रत्येक दास के पास जाना है। एक अर्थ में, वे सभी एक ही लिखने के भार लेते हैं, भले ही पठन भार वितरित किया जाता है।

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

अभी तक, बहुत अच्छा है। खोजों के बारे में क्या? इस उदाहरण में, यदि ब्रायन "एलेक्स" की खोज करता है तो मैं उपयोगकर्ता ए की जांच कर सकता हूं। लेकिन क्या होगा यदि वह अपने अंतिम नाम "स्मिथ" द्वारा एलेक्स की खोज करता है? प्रत्येक शार्ड में स्मिथ हैं। यहां से, मुझे दो विकल्प दिखाई देते हैं:

  1. प्रत्येक शार्ड पर स्मिथ के लिए एप्लिकेशन खोज करें। यह धीरे-धीरे किया जा सकता है (उत्तराधिकार में प्रत्येक शार्ड से पूछताछ) या जल्दी (समानांतर में प्रत्येक शार्ड से पूछताछ), लेकिन किसी भी तरह से, हर शार्ड को प्रत्येक खोज में शामिल करने की आवश्यकता होती है। वैसे ही प्रतिकृति पढ़ना स्केल नहीं करता है, खोजों को हर शार्ड पर हिट करने से आपकी खोजों को स्केल नहीं किया जाता है। आप उस समय तक पहुंच सकते हैं जब आपकी खोज मात्रा प्रत्येक शार्ड को जबरदस्त करने के लिए पर्याप्त होती है, और शर्ड्स जोड़ने से आपकी मदद नहीं होती है, क्योंकि वे सभी एक ही मात्रा प्राप्त करते हैं।
  2. कुछ प्रकार की इंडेक्सिंग जो खुद को शेरिंग का सहिष्णु है। उदाहरण के लिए, मान लीजिए कि मेरे पास निरंतर फ़ील्ड हैं जिनके द्वारा मैं खोजना चाहता हूं: पहला नाम और अंतिम नाम। उपयोगकर्ता ए, यूजरबी, आदि के अलावा मेरे पास इंडेक्सए, इंडेक्सबी, इत्यादि भी है। जब कोई नया उपयोगकर्ता पंजीकृत होता है, तो मैं उसे प्रत्येक इंडेक्स से जोड़ता हूं जिसे मैं चाहता हूं। इसलिए मैंने एलेक्स स्मिथ को इंडेक्स और इंडेक्स दोनों में रखा, और वह या तो "एलेक्स" या "स्मिथ" पर पाया जा सकता है, लेकिन कोई सबस्ट्रिंग नहीं। इस तरह, आपको प्रत्येक शार्ड से पूछने की आवश्यकता नहीं है, इसलिए खोज स्केलेबल हो सकती है।

तो खोज स्केल किया जा सकता है? यदि हां, तो क्या यह इंडेक्सिंग सही है? क्या कोई और है?

उत्तर

2

मैं तुम्हें संभालने हूँ के टुकड़े के बारे में एक ला बात कर रहे हैं: लाने के लिए http://highscalability.com/unorthodox-approach-database-design-coming-shard

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

+0

धन्यवाद। मैंने वास्तव में उस साइट को बड़े पैमाने पर पढ़ा है। मैंने उपरोक्त मेरे प्रश्न को स्पष्ट करने की कोशिश की है; जो आशा है कि आप जिस लेख से मददगार रूप से जुड़े हुए हैं उससे परे है। –

1

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

संभवतः आप उपयोगकर्ता की एक ही संपत्ति के आधार पर शेड करते हैं, शायद उपयोगकर्ता नाम का हैश। यदि आपकी खोज सुविधा उपयोगकर्ता के अन्य गुणों के आधार पर खोज करने की अनुमति देती है तो यह स्पष्ट है कि कोई भी शर्ड या शर्ट का सबसेट नहीं है जो किसी क्वेरी को संतुष्ट कर सकता है, क्योंकि किसी भी शार्ड में क्वेरी से मेल खाने वाले उपयोगकर्ता शामिल हो सकते हैं। खोज करने से पहले आप किसी भी शर्ड्स को रद्द नहीं कर सकते हैं, जिसका अर्थ है कि आपको सभी shards के खिलाफ क्वेरी को चलाना होगा।

+0

कृपया ऊपर मेरी स्पष्टीकरण देखें। –

7

कोई जादू बुलेट नहीं है।

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

तो यदि आप करना चाहते हैं तो आप समानांतर में खोजना चाहते हैं।

दो यथार्थवादी विकल्प हैं, और आप पहले ही उन्हें सूचीबद्ध कर रहे हैं - अनुक्रमण, और समांतर खोज। मुझे उन्हें डिजाइन करने के बारे में कुछ और जानकारी देने की अनुमति दें।

कुंजी अंतर्दृष्टि जिसका आप उपयोग कर सकते हैं वह यह है कि खोज में, आपको शायद ही कभी परिणामों के पूर्ण सेट की आवश्यकता होती है। आपको केवल परिणामों के पहले (या nth) पृष्ठ की आवश्यकता है। तो वहां बहुत कुछ विग्लू कमरा है जिसका आप प्रतिक्रिया समय कम करने के लिए उपयोग कर सकते हैं।

अनुक्रमण

आप विशेषताओं, जिस पर उन खोज की जाएगी जानते हैं, तो आप कस्टम, उनके लिए अलग अनुक्रमणिका बना सकते हैं। आप अपना खुद का inverted index बना सकते हैं, जो प्रत्येक खोज शब्द के लिए (shard, recordId) tuple को इंगित करेगा, या आप इसे डेटाबेस में संग्रहीत कर सकते हैं। इसे आलसी, और असीमित रूप से अद्यतन करें। मुझे आपकी आवेदन आवश्यकताओं को नहीं पता है, यह हर रात इंडेक्स को पुनर्निर्माण करना भी संभव हो सकता है (जिसका अर्थ है कि आपके पास किसी भी दिन किसी भी हालिया प्रविष्टियां नहीं होंगी - लेकिन यह आपके लिए ठीक हो सकती है)। इस इंडेक्स को आकार के लिए अनुकूलित करना सुनिश्चित करें ताकि यह स्मृति में फिट हो सके; ध्यान दें कि यदि आपको आवश्यकता हो, तो आप इस इंडेक्स को शेड कर सकते हैं।

स्वाभाविक रूप से, यदि लोग "lastname='Smith' OR lastname='Jones'" जैसे कुछ खोज सकते हैं, तो आप स्मिथ के लिए इंडेक्स पढ़ सकते हैं, जोन्स के लिए इंडेक्स पढ़ सकते हैं, और यूनियन की गणना कर सकते हैं - आपको केवल अपने भवन भागों के सभी संभावित प्रश्नों को स्टोर करने की आवश्यकता नहीं है।

समानांतर खोजें

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

जब आप इसमें हों, तो असमान डेटा और/या लोड वितरण के साथ संभावित समस्याओं का निरीक्षण करने के लिए sharded सर्वर के प्रतिक्रिया समय लॉग करें।

1

आप स्फिंक्स (http://www.sphinxsearch.com/articles.html) पर देखना चाह सकते हैं। यह वितरित खोज का समर्थन करता है। गीगास्पेस में समानांतर क्वेरी है और समर्थन मर्ज है। यह MySQL प्रॉक्सी (http://jan.kneschke.de/2008/6/2/mysql-proxy-merging-resultsets) के साथ भी किया जा सकता है।

एक गैर-शर्मीली अनुक्रमित प्रकार के निर्माण को पहली जगह में शार्ड का उद्देश्य पराजित करने के लिए :-) शॉर्ट आवश्यक होने पर एक केंद्रीकृत सूचकांक शायद काम नहीं करेगा।

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

0

आरडीबीएम टेक्स्टुअल खोज के लिए अच्छा उपकरण नहीं है। आप Solr पर देखकर बहुत बेहतर होंगे। सोलर और डेटाबेस के बीच प्रदर्शन अंतर 100X की परिमाण के क्रम में होगा।

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