2009-06-03 14 views
12

हम कॉर्पोरेट वेब एप्लिकेशन के लिए खोज आर्किटेक्चर तैयार कर रहे हैं। हम इसके लिए Lucene.net का उपयोग करेंगे। इंडेक्स बड़े नहीं होंगे (लगभग 100,000 दस्तावेज), लेकिन खोज सेवा हमेशा ऊपर रहनी चाहिए और हमेशा अद्यतित रहनी चाहिए। इंडेक्स में हर समय और समवर्ती खोजों में नए दस्तावेज़ जोड़े जाएंगे। चूंकि हमारे पास खोज प्रणाली के लिए उच्च उपलब्धता होनी चाहिए, हमारे पास 2 एप्लिकेशन सर्वर हैं जो खोज और अनुक्रमण करने के लिए डब्ल्यूसीएफ सेवा का पर्दाफाश करते हैं (सेवा की एक प्रति प्रत्येक सर्वर में चल रही है)। सर्वर इंडेक्स तक पहुंचने के लिए lucene.net एपीआई का उपयोग करता है।एकाधिक ऐप सर्वरों पर Lucene.net अनुक्रमणिका को सिंक करना

समस्या यह है कि इंडेक्स को हर समय समन्वयित करने का सबसे अच्छा समाधान क्या होगा? हम कई विकल्पों पर विचार किया है:

  • अनुक्रमण के लिए एक सर्वर और 2 सर्वर का उपयोग एसएमबी के माध्यम से अनुक्रमित होने का उपयोग करना: कोई क्योंकि हम विफलता स्थिति का एक बिंदु है कर सकते हैं;

  • दोनों सर्वरों को इंडेक्स करना, अनिवार्य रूप से प्रत्येक इंडेक्स को दो बार लिखना: शायद लुभावनी प्रदर्शन, और उदाहरण के लिए desync की संभावना। सर्वर 1 अनुक्रमणिका ठीक है और सर्वर 2 डिस्क स्थान से बाहर चला जाता है या जो भी हो;

  • इंडेक्स तक पहुंच को लपेटने के लिए एसओएलआर या केएटीटीए का उपयोग करना: नहीं, हमारे पास सर्वर पर टोमकैट या समान चलाना नहीं है, हमारे पास केवल आईआईएस है।

  • डेटाबेस में अनुक्रमणिका को संग्रहीत करना: मुझे लगता है कि यह लुसीन (जेडीबीसी डायरेक्टरी मॉड्यूल) के जावा संस्करण के साथ किया जा सकता है, लेकिन मुझे Lucene.net के लिए कुछ भी नहीं मिला। यहां तक ​​कि यदि इसका मतलब एक छोटा प्रदर्शन हिट था, तो हम इस विकल्प के लिए जाएंगे क्योंकि यह न्यूनतम रूप से मिनिनम विकास के साथ समेकन और समन्वयन समस्या को हल करेगा।

  • Lucene.net वितरित खोज contrib मॉड्यूल का उपयोग: मैं इस बारे में दस्तावेज़ीकरण के साथ एक लिंक दर्ज नहीं कर सका। मैं कोड को देखकर यह भी नहीं जानता कि यह कोड क्या करता है, लेकिन ऐसा लगता है कि यह वास्तव में कई मशीनों में इंडेक्स को विभाजित करता है, जो हम नहीं चाहते हैं।

  • rsync और दोस्तों, 2 सर्वरों के बीच सूचकांक की प्रतिलिपि बनाते हैं: यह हमें हैकिश और त्रुटि-प्रवण लगता है, और यदि सूचकांक बड़े हो जाते हैं, तो कुछ समय लग सकता है, और इस अवधि के दौरान हम होंगे ग्राहकों को भ्रष्ट या असंगत डेटा लौटाना, इसलिए हमें कुछ विज्ञापन लॉकिंग नीति विकसित करना होगा, जिसे हम नहीं चाहते हैं।

मुझे समझ में आता है कि यह एक जटिल समस्या है, लेकिन मुझे यकीन है कि बहुत से लोगों ने इसका सामना किया है। किसी भी मदद का स्वागत है!

उत्तर

6

ऐसा लगता है कि सबसे अच्छा समाधान दोनों सर्वरों पर दस्तावेज़ों को इंडेक्स की अपनी प्रतिलिपि में सूचीबद्ध करना होगा।

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

+0

शॉन, यह वर्तमान में हमारे उम्मीदवार विकल्प है। मैं आपसे और इसकेडोक से सहमत हूं कि यह सबसे अच्छा विकल्प लगता है। मैं जेडीबीसी डायरेक्टरी के स्रोतों को खोजने का प्रयास कर रहा हूं यह देखने के लिए कि क्या .NET + SQL सर्वर पर एक पोर्ट संभव होगा। यह देखने के लिए कि क्या नए दृष्टिकोण आते हैं, प्रश्न थोड़ी देर तक खुला रहेगा, अन्यथा यह जवाब स्वीकार करेगा। –

+0

मैंने एक ही चीज़ को एक बार चेक किया। यह प्रयास के लायक नहीं था क्योंकि डीबी लेनदेन से संबंधित सामानों का एक समूह है जो पोर्ट को छोटा नहीं है। नेट। जेडीबीसी डायरेक्टरी सामग्री का उपयोग करके कम गति की शिकायतें भी थीं। स्रोत कम्पास प्रोजेक्ट में है - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ –

+2

कुछ सोचने के बाद, यह वही है मैं सबसे व्यवहार्य समाधान के रूप में देखता हूं: जब एक अनुक्रमण/डिंडेक्सिंग अनुरोध प्राप्त होता है, तो एक साझा डीबी तालिका में एक पंक्ति डालें जो कतार के रूप में काम करती है। एक साधारण Win32 सेवा को कार्यान्वित करें जो दोनों ऐप सर्वरों में चलता है और स्थानीय रूप से सामग्री को अनुक्रमणित करते हुए प्रत्येक एक्स सेकंड में कतार का चुनाव करता है। जब सामग्री सफलतापूर्वक अनुक्रमित की जाती है, तो सेवा आइटम को संसाधित के रूप में चिह्नित करती है, अन्यथा यह कोशिश करता रहता है। –

1

+1। दोनों सर्वरों पर अनुक्रमण सबसे स्वच्छ और सुरक्षित विकल्प की तरह लगता है।

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

एक समाधान जो मैंने पहले उपयोग किया है, में एक सर्वर पर एक इंडेक्स खंड बनाना शामिल है, फिर rsync इसे सर्च सर्वर पर ले जा रहा है और प्रत्येक इंडेक्स में IndexWriter.AddIndexesNoOptimize का उपयोग करके खंड को विलय कर रहा है। आप हर 5 मिनट में एक नया हिस्सा बना सकते हैं या जब भी यह एक निश्चित आकार में हो जाता है। यदि आपके पास बिल्कुल अद्यतित इंडेक्स नहीं हैं, तो यह आपके लिए एक समाधान हो सकता है।

1

जावा दुनिया में, हमने सूचकांक (एस) के सामने एक एमक्यू डालकर इस समस्या को हल किया। सम्मिलन केवल तभी पूरा हुआ जब कतार से निकाला गया बीन सफल रहा, अन्यथा यह किसी भी कार्रवाई को वापस ले गया, जिसे लंबित के रूप में चिह्नित किया गया था और इसे बाद में

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं बस इसके पार आया और एक बहु-सर्वर कार्यान्वयन पर सलाह देने के लिए किसी और के लिए अपना 2 सेंट देना चाहता था।

क्यों साझा साझा फ़ोल्डर पर इंडेक्स फ़ाइलों को नहीं रखे? उस डेटाबेस में इंडेक्स को संग्रहीत करने से अलग कैसे है जिसे आप सोच रहे थे? एक डेटाबेस को उच्च उपलब्धता के लिए दोहराया जा सकता है, और इसलिए एक NAS हो सकता है!

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

+0

मैंने यह सत्यापित नहीं किया है कि यह सत्य है या नहीं, लेकिन निम्न उत्तर कहता है "प्रमुख ल्यूसीन सिफारिशों में से एक नेटवर्क नेटवर्क फाइल सिस्टम का उपयोग नहीं करना है": http://stackoverflow.com/a/8562566/1145177 लुसेर्न एफएक्यू का उल्लेख है "स्थानीय फाइल सिस्टम का उपयोग करें। दूरस्थ फाइल सिस्टम आमतौर पर खोज के लिए थोड़ा धीमे होते हैं। अगर इंडेक्स रिमोट होना चाहिए, तो रिमोट फाइल सिस्टम को रीडोनली माउंट के रूप में माउंट करने का प्रयास करें": http://wiki.apache.org/ Lucene-जावा/ImproveSearchingSpeed –

0

जिस तरह से हम अपने लोड-संतुलित सर्वर को सिंक में रखते हैं, प्रत्येक अपनी ल्यूसीन की प्रतिलिपि के साथ, किसी अन्य सर्वर पर एक कार्य है, जो प्रत्येक लोड-संतुलित सर्वर को प्रत्येक इंडेक्स को अपडेट करने के लिए प्रत्येक 5 मिनट चलाता है एक निश्चित टाइमस्टैम्प।

उदाहरण के लिए, कार्य सभी लोड-संतुलित सर्वरों पर '12/1/2013 12: 35: 02.423 'का टाइमस्टैम्प भेजता है (कार्य प्रत्येक भार-संतुलित वेबसाइट पर वेबपृष्ठ पर क्वेरीस्ट्रिंग के माध्यम से टाइमस्टैम्प सबमिट कर रहा है), तो प्रत्येक सर्वर उस टाइमस्टैम्प का उपयोग उस टाइमस्टैम्प के माध्यम से अंतिम अद्यतन के बाद से होने वाले सभी अपडेट के लिए डेटाबेस से पूछताछ करने के लिए करता है, और उनके स्थानीय ल्यूसीन इंडेक्स को अपडेट करता है।

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

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