Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> डेटाबेस

धीमे Elasticsearch Queries का समस्या निवारण: सामान्य कारण और समाधान

मूल रूप से 29 मई, 2018 को ObjectRocket.com/blog पर प्रकाशित।

Rackspace Technology को प्राप्त होने वाले सबसे आम Elasticsearch® समर्थन अनुरोधों में से एक है "क्या आप मेरी प्रतिक्रिया समय में मदद कर सकते हैं?" या "मेरे queries को लंबा समय लग रहा है, मैं क्या कर सकता हूं?"

धीमे Elasticsearch Queries का समस्या निवारण: सामान्य कारण और समाधान

दो दृष्टिकोण

जब भी हमें इस प्रकार के प्रश्न मिलते हैं, हम दो मुख्य क्षेत्रों को देखकर शुरू करते हैं:

  • Operations Side – वर्तमान सिस्टम संसाधनों और डिफ़ॉल्ट Elasticsearch विकल्पों को देखें।
  • Development Side - queries, उनकी संरचना, और आप जिस डेटा को खोज रहे हैं उसकी मैपिंग को देखें।

Elasticsearch अनुकूलन पर ब्लॉग पोस्ट की इस श्रृंखला में पहले में, हम इन दो क्षेत्रों में से बाद वाले पर ध्यान केंद्रित करते हैं। हम धीमे queries प्राप्त करते हैं, डोमेन स्पेसिफिक लैंग्वेज (DSL) query भाषा पर चर्चा करते हैं, और उन विकल्पों पर जाते हैं जो आपके Elasticsearch queries को बेहतर बनाने में मदद कर सकते हैं।

आपके queries कितने धीमे हैं?

पहला कदम यह देखना है कि क्लस्टर को query भेजने में कितना समय लगता है। Elasticsearch डॉक्स धीमे logs चालू करने के तरीके के बारे में स्पष्ट नहीं हैं, इसलिए मैं इस पोस्ट में कुछ उदाहरण दिखाता हूँ।

सबसे पहले, Elasticsearch में धीमे logs के दो संस्करण हैं: index धीमे logs और search धीमे logs। चूंकि हम जिस मुद्दे को हल करने की कोशिश कर रहे हैं उसमें धीमे queries शामिल हैं, हम search धीमे logs पर ध्यान केंद्रित करते हैं। हालांकि, यदि यह indexing या दस्तावेज़ जोड़ते समय प्रदर्शन मुद्दों के बारे में था, तो हम index धीमे logs को देखेंगे।

Elasticsearch के सभी संस्करण डिफ़ॉल्ट रूप से धीमे logs को बंद कर देते हैं, इसलिए आपको क्लस्टर सेटिंग्स और index सेटिंग्स दोनों में कुछ अपडेट करने होंगे। निम्नलिखित उदाहरण Elasticsearch 6.2 से संबंधित हैं, लेकिन आप पिछले संस्करणों के बारे में जानकारी यहाँ पा सकते हैं। जिस संस्करण पर आप काम कर रहे हैं उसके साथ $ES_version को बदलें, उदाहरण के लिए, संस्करण 5.5।

  • _cluster API पर PUT अनुरोध भेजें ताकि आप जिस धीमे log स्तर को चालू करना चाहते हैं उसे परिभाषित कर सकें: warn, info, debug, और trace। (लॉगिंग स्तरों पर अधिक जानकारी।)

    curl -XPUT https://localhost:$ES_PORT/_cluster/settings -H ‘Content-Type: application/json’ -d’

     { 

    “transient” : { “logger.index.search.slowlog” : “DEBUG”, “logger.index.indexing.slowlog” : “DEBUG” } }'

चूंकि Elasticsearch index स्तर पर सभी धीमे लॉगिंग को सक्षम करता है, आप index _settings API पर अनुरोध भेजकर इसे चालू कर सकते हैं। यदि आप अपने indices को मासिक, त्रैमासिक, आदि घुमा रहे हैं तो आपको अपने index template में भी जोड़ना होगा।

  • धीमे log समय सीमा से मेल खाने के लिए index settings के लिए API कॉल को समायोजित करें। आप इंस्टेंस को प्रोफाइल करने और भेजे गए सभी queries को एकत्र करने के लिए मान को शून्य पर सेट कर सकते हैं या धीमे log को बंद करने के लिए -1 पर सेट कर सकते हैं।

  • _clustersettings में आपके द्वारा उपयोग की गई समान log-level सेटिंग का उपयोग करें। इस उदाहरण में, DEBUG। ES_PORT एक स्थायी पर्यावरण चर है।

    curl -XPUT https://localhost:$ES_PORT/*/_settings?pretty -H ‘Content-Type: application/json’ -d ‘{“index.search.slowlog.threshold.query.debug”: “-1”,“index.search.slowlog. threshold.fetch.debug”: “-1”,}’

अब, आपको logs एकत्र करने की आवश्यकता है। धीमे logs प्रति shard उत्पन्न होते हैं और प्रति डेटा नोड एकत्र किए जाते हैं। यदि आपके पास केवल एक डेटा नोड है जिसमें पांच primary shards हैं (डिफ़ॉल्ट मान), तो आप धीमे logs में एक query के लिए पांच प्रविष्टियाँ देखते हैं। चूंकि Elasticsearch में खोजें प्रत्येक shard के अंदर होती हैं, आप प्रत्येक shard के लिए एक देखते हैं। धीमे logs डिफ़ॉल्ट रूप से निम्न स्थान पर प्रति डेटा नोड संग्रहीत होते हैं: /var/log/elasticsearch/$ClusterID_index_slowlog_query and /var/log/elasticsearch/$ClusterID_index_slowlog_fetch। जैसा कि आप देख सकते हैं, search धीमे logs फिर से खोज के चरण के आधार पर अलग-अलग log फ़ाइलों में विभाजित होते हैं: fetch और query।

अब जब हमारे पास logs में परिणाम हैं, तो हम एक प्रविष्टि निकाल सकते हैं और उसे अलग कर सकते हैं।

[2018-05-21T12:35:53,352][DEBUG ][index.search.slowlog.query] [DwOfjJF] [blogpost-slowlogs][4] took[1s], took_millis[0], types[], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query":{"match":{"name": {"query":"hello world", "operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions" :true, "lenient":false,"zero_terms_query": "NONE","boost":1.0}}},"sort":[{"price": {"order":"desc"}}]}], 

यहां, आप देखते हैं:

  • दिनांक टाइमस्टैम्प
  • Log level
  • Slowlog प्रकार
  • नोड नाम
  • Index
  • Shard नंबर
  • लगा समय
  • Query का body (_source>)

जिस query की पहचान हमने बहुत लंबा समय लेने वाले के रूप में की है, उसे प्राप्त करने के बाद, हम इसे निम्नलिखित टूल्स का उपयोग करके तोड़ सकते हैं:

_profile API

_profile API आपकी खोज के बारे में पृष्ठों की जानकारी प्रदान करता है और प्रत्येक shard में जो हुआ उसे व्यक्तिगत खोज घटक के समय तक तोड़ देता है—खोज जितनी विस्तृत होगी, _profile आउटपुट उतना ही वर्बोज़ होगा।

Kibana प्रोफाइलिंग टूल

Kibana® टूल _profile API के साथ हाथ से काम करता है। यह व्यक्तिगत खोज घटकों और उन्हें पूरा करने में लगने वाले समय का एक अच्छा दृश्य वॉटरफॉल प्रतिनिधित्व देता है। फिर से, यह आपको query के समस्या क्षेत्र को चुनने की अनुमति देता है।

Elasticsearch के दो चरण: query then fetch

अब, हमने एक धीमे query की पहचान की है, और हमने इसे एक प्रोफाइलर के माध्यम से चलाया है। व्यक्तिगत घटक समय परिणामों को देखने से आपकी खोज तेज नहीं हुई है, हालांकि। अब क्या? queries कैसे काम करते हैं, इसे समझना, निम्नलिखित दो चरणों से गुजरना, आपको अपने query को इस तरह से पुनः डिज़ाइन करने की अनुमति देता है जो Elasticsearch से सर्वोत्तम परिणाम प्राप्त करता है—गति और प्रासंगिकता दोनों के संदर्भ में।

Query चरण

  • कोऑर्डिनेटर नोड query को स्वीकार करता है।
  • कोऑर्डिनेटर खोजे जा रहे index (या indices) की पहचान करता है।
  • कोऑर्डिनेटर उन नोड्स की एक सूची तैयार करता है जिनमें index के लिए shards होते हैं (primary और replica दोनों के मिश्रण में)।
  • कोऑर्डिनेटर query को नोड्स पर भेजता है।
  • नोड्स पर shards query को प्रोसेस करते हैं।
  • Queries को डिफ़ॉल्ट रूप से शीर्ष 10 दस्तावेज़ों पर स्कोर किया जाता है।
  • सूची कोऑर्डिनेटर नोड पर वापस भेजी जाती है।

Fetch चरण

  • Fetch चरण कोऑर्डिनेटर नोड से शुरू होता है, जो प्रत्येक shard द्वारा भेजे गए 50 (5 shards x 10) परिणामों में से शीर्ष 10 दस्तावेज़ों को निर्धारित करता है।
  • कोऑर्डिनेटर शीर्ष 10 दस्तावेज़ों के लिए shards को अनुरोध भेजता है। (यह एक shard हो सकता है जिसमें शीर्ष-स्कोरिंग docs हों, या वे कई shards में बिखरे हो सकते हैं।)

एक सूची वापस आने के बाद, मास्टर query response के _hits अनुभाग में दस्तावेज़ प्रस्तुत करता है।

परिणाम स्कोर

परिणाम स्कोर Elasticsearch में महत्वपूर्ण हैं। आमतौर पर, जब आप एक खोज इंजन का उपयोग करते हैं, तो आप सबसे सटीक परिणाम चाहते हैं। उदाहरण के लिए, यदि आप कीवी फल खोज रहे हैं, तो आप नहीं चाहते कि परिणामों में कीवी शू पॉलिश शामिल हो। Elasticsearch आपके द्वारा प्रदान किए गए पैरामीटर्स के आधार पर query परिणामों को स्कोर करता है। जबकि हम query relevance को पूरी तरह से अलग ब्लॉग पोस्ट में कवर करते हैं, यह यहां उल्लेख करना महत्वपूर्ण है क्योंकि यदि आपके पास एक तेज़ खोज है लेकिन परिणाम वही नहीं हैं जो आप ढूंढ रहे हैं, तो पूरी खोज समय की बर्बादी थी। तो, आप अपनी खोजों को कैसे तेज़ करते हैं?

Filters

अपनी खोजों के प्रदर्शन को बेहतर बनाने का एक तरीका filters के साथ है। Filtered query आपका सबसे अच्छा दोस्त हो सकता है। पहले filter करना महत्वपूर्ण है क्योंकि खोज में filter दस्तावेज़ स्कोर के परिणाम को प्रभावित नहीं करता है, इसलिए आप खोज क्षेत्र को कम करने के लिए बहुत कम संसाधनों का उपयोग करते हैं।

Filtered query के साथ, boolean matches के साथ काम करते हुए, आप उन सभी दस्तावेज़ों को खोज सकते हैं जिनमें X है, इससे पहले कि आप स्कोर करें कि उनमें Y है या नहीं। साथ ही, आप filters को कैश कर सकते हैं।

Filters Elasticsearch queries को तेज़ करने का एकमात्र तरीका नहीं हैं। हम एक भविष्य के ब्लॉग में query प्रदर्शन को बेहतर बनाने के लिए उपयोग किए जा सकने वाले अधिक तरीकों को कवर करेंगे।

सारांश

आप कुछ सरल चरणों में अपने queries को अनुकूलित कर सकते हैं:

  • धीमे लॉगिंग सक्षम करें ताकि आप लंबे समय तक चलने वाले queries की पहचान कर सकें
  • पहचाने गए खोजों को _profiling API के माध्यम से चलाएँ ताकि व्यक्तिगत घटकों के समय को देखा जा सके
  • Filter, filter, filter

Elasticsearch प्रबंधन के बारे में प्रश्न हैं? हम हर इंस्टेंस के साथ, यहां तक कि मुफ्त परीक्षणों के साथ भी, गहरी Elasticsearch विशेषज्ञता वाले डेटाबेस प्रशासकों तक पहुंच शामिल करते हैं। विकास पर ध्यान केंद्रित करना शुरू करें और हमें Elasticsearch प्रबंधन संभालने दें।

Kibana के साथ Elasticsearch 6 के मुफ्त परीक्षण के साथ खेलना चाहते हैं? शुरू करें और हमें बताएं कि क्या आपके कोई प्रश्न हैं।

कोई टिप्पणी करने या प्रश्न पूछने के लिए Feedback टैब का उपयोग करें। आप Sales Chat पर क्लिक करके अभी चैट कर सकते हैं और बातचीत शुरू कर सकते हैं।

  1. आपका मैक क्यों धीमा हो रहा है - बेहतर परफॉर्मेंस के लिए त्वरित सुधार आपका मैक क्यों धीमा हो रहा है - बेहतर परफॉर्मेंस के लिए त्वरित सुधार

    हां, हर मैक समय के साथ हार्डवेयर समस्याओं का सामना करता है जो इसकी परफॉर्मेंस को धीमा कर देती हैं। लेकिन, जब आप अचानक समय से पहले इस बदलाव का अनुभव करना शुरू करते हैं, तो शायद यह आपकी अपने मैक के प्रति लापरवाही है जिसने इस चिंता को आपके सामने ला खड़ा किया है। आपके मैक को धीमा करने के कई कारण हैं जिन

  1. मेरा Mac धीमा क्यों चल रहा है? प्रदर्शन बहाल करने के सिद्ध समाधान मेरा Mac धीमा क्यों चल रहा है? प्रदर्शन बहाल करने के सिद्ध समाधान

    हर दूसरा कंप्यूटर, चाहे वह Windows हो या Mac, दैनिक उपयोग और कैश संचय के साथ धीमा हो जाता है। अंततः आपके कंप्यूटर की गति धीमी हो जाती है, आपके Mac के प्रदर्शन को कम कर देती है। अगर आप इसके बारे में चिंतित हैं और जानना चाहते हैं कि इसे कैसे ठीक किया जाए, तो हमारे पास आपके लिए कुछ टिप्स और ट्रिक्स हैं

  1. होम इंटरनेट धीमा क्यों है और इसकी स्पीड कैसे बढ़ाएं होम इंटरनेट धीमा क्यों है और इसकी स्पीड कैसे बढ़ाएं

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