মূলত ২৯ মে, ২০১৮-এ ObjectRocket.com/blog-এ প্রকাশিত।
র্যাকস্পেস টেকনোলজি যে একটিচча ইলাস্টিকসার্চ® সাপোর্ট রিকোয়েস্ট পায় সেটি হল "আপনি কি আমার রেসপন্স টাইমের সাথে সাহায্য করতে পারেন?" অথবা "আমার কোয়ারীগুলো খুব সময় নিচ্ছে, আমি কী করতে পারি?"
দুটি পদ্ধতি
যখন আমরা এই ধরনের প্রশ্ন পাই, আমরা দুটি প্রধান এরিয়া দেখতে শুরু করি:
- অপারেশন সাইড – বর্তমান সিস্টেম রিসোর্স এবং ডিফল্ট ইলাস্টিকসার্চ অপশনগুলো দেখুন।
- ডেভেলপমেন্ট সাইড - কোয়ারীগুলো, তাদের কাঠামো, এবং আপনি যে ডেটা সার্চ করছেন তার ম্যাপিং দেখুন।
ইলাস্টিকসার্চ অপ্টিমাইজেশনে ব্লগ পোস্টের এই সিরিজের প্রথমটি-তে, আমরা utóপরিত গুলোর ওপর ফোকাস করব। আমরা স্লো কোয়ারী কালেক্ট করব, ডোমেন স্পেসিফিক ল্যাঙ্গুয়েজ (DSL) কোয়ারী ল্যাঙ্গুয়েজ নিয়ে আলোচনা করব, এবং আপনার ইলাস্টিকসার্চ কোয়ারী উন্নত করতে সাহায্য করার অপশনগুলো নিয়ে যাব।
আপনার কোয়ারীগুলো কতটুকু ধীর?
প্রথম ধাপ হল দেখা একটি কোয়ারী ক্লাস্টারে পাঠাতে কতক্ষণ লাগে। ইলাস্টিকসার্চ ডক্স স্লো লগ অন করার বিষয়ে স্পষ্ট নন, তাই এই পোস্টে আমি কিছু উদাহরণ দেখাচ্ছি।
প্রথমে, ইলাস্টিকসার্চে স্লো লগের দুটি ভার্সন আছে: ইন্ডেক্স স্লো লগ এবং সার্চ স্লো লগ। যেহেতু আমরা যে সমস্যাটি সমাধান করার চেষ্টা করছি সেটি স্লো কোয়ারী রিগার্ডিং, আমরা সার্চ স্লো লগের ওপর ফোকাস করব। যাইহোক, যদি এটি ইন্ডেক্সিং বা ডকুমেন্ট যোগ করার সময় পারফরম্যান্স ইস্যু রিগার্ডিং হত, তবে আমরা ইন্ডেক্স স্লো লগ দেখতাম।
ইলাস্টিকসার্ভের সব ভার্সন ডিফল্টভাবে স্লো লগ অফ করে রাখে, তাই আপনাকে ক্লাস্টার সেটিংস এবং ইন্ডেক্স সেটিংস উভয়েই কিছু আপডেট করতে হবে। নিচের উদাহরণগুলো ইলাস্টিকসার্চ ৬.২-র সাথে ডিল করে, কিন্তু আপনি আগের ভার্সন সম্পর্কে জানতে পারেন এখানে। আপনার যে ভার্সনে কাজ করছেন সেটি ব্যবহার করে $ES_version রিপ্লেস করুন, উদাহরণস্বরূপ, ভার্সন ৫.৫।
-
_cluster API-তে একটি PUT রিকোয়েস্ট পাঠান স্লো লগের যে লেভেল আপনি অন করতে চান সেটি ডিফাইন করতে: 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” } }'
কারণ ইলাস্টিকসার্চ সব স্লো লগিং ইন্ডেক্স লেভেলে ইনেবল করে, আপনি ইন্ডেক্স _settings API-তে একটি রিকোয়েস্ট পাঠাতে পারেন সেটি অন করতে। আপনাকে আপনার ইন্ডেক্স টেমপ্লেটেও যোগ করতে হবে যদি আপনি আপনার ইন্ডেক্স মাসিক, ত্রৈমাসিক, ইত্যাদি রোটেট করেন।
-
আপনি যে স্লো লগ টাইম থ্রেশহোল্ডে হিট করতে চান সেটি ম্যাচ করতে API কলকে ইন্ডেক্স সেটিংসে আডজাস্ট করুন। আপনি ভ্যালুকে জিরোতে সেট করতে পারেন ইনস্ট্যান্স প্রোফাইল করতে এবং সব পাঠানো কোয়ারী কালেক্ট করতে বা –১ সেট করতে স্লো লগ অফ করতে।
-
_clustersettings-এ আপনি যে লগ-লেভেল সেটিং ব্যবহার করেছেন সেটি ব্যবহার করুন। এই উদাহরণে,
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”,}’
এখন, আপনাকে লগগুলো কালেক্ট করতে হবে। স্লো লগগুলো প্রতি শার্ডে জেনারেট হয় এবং প্রতি ডেটা নোডে গ্য더 হয়। আপনার যদি শুধু একটি ডেটা নোড থাকে যেটি পাঁচটি প্রাইমারি শার্ড ধারণ করে (ডিফল্ট মান), তবে আপনি স্লো লগে একটি কোয়ারীর জন্য পাঁচটি এন্ট্রি দেখবেন। কারণ ইলাস্টিকসার্চে সার্চ প্রতিটি শার্ডের ভিতরে ঘটে, আপনি প্রতিটি শার্ডের জন্য একটি দেখবেন। স্লো লগ ডিফল্টভাবে প্রতি ডেটা নোডে নিচের লোকেশনে স্টোর থাকে: /var/log/elasticsearch/$ClusterID_index_slowlog_query and /var/log/elasticsearch/$ClusterID_index_slowlog_fetch। আপনি দেখতে পাচ্ছেন, সার্চ স্লো লগগুলো আবার সার্চের ফেজ: ফেচ এবং কোয়ারী-ভিত্তিক আলাদা লগ ফাইলে ভাগ করা হয়েছে।
এখন যেহেতু লগে রেজাল্ট আছে, আমরা একটি এন্ট্রি টানতে পারি এবং তা বিশ্লেষণ করতে পারি।
[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"}}]}],
এখানে, আপনি দেখতে পাচ্ছেন:
- ডেট টাইমস্ট্যাম্প
- লগ লেভেল
- স্লোলগ টাইপ
- নোড নাম
- ইন্ডেক্স
- শার্ড নম্বর
- লেগে গেছে টাইম
- কোয়ারীর বডি (_source>)
আমরা যে কোয়ারীটি খুব সময় নিচ্ছে সেটি আইডেন্টিফাই করলে, আমরা নিচের টুলগুলো ব্যবহার করে তা ভাঙতে পারি:
_profile API
_profile API আপনার সার্চ সম্পর্কে পৃষ্ঠা পৃষ্ঠা তথ্য দেয় এবং প্রতিটি শার্ডে কী ঘটেছে সেটি বিস্তারিতভাবে ভাঙে, প্রতিটি সার্চ কম্পোনেন্টের ইন্ডিভিজুয়াল টাইমিং পর্যন্ত—কোয়ারী যত ডিটেইলড, _profile আউটপুট তত_VERBOSE।
Kibana প্রোফাইলিং টুল
Kibana® টুল _profile API-র সাথে হাত ধরে চলে। এটি ইন্ডিভিজুয়াল সার্চ কম্পোনেন্ট এবং সেগুলোকে কমপ্লিট হতে যে সময় লাগে সেটির একটি সুন্দর ভিজ্যুয়াল ওয়াটারফল রিপ্রেজেন্টেশন দেয়। আবার, এটি আপনাকে কোয়ারীর সমস্যা yd২ এলাকা পিক আউট করতে দেয়।
ইলাস্টিকসার্চের দুই ফেজ: কোয়ারী দান ফেচ
এখন, আমরা একটি স্লো কোয়ারী আইডেন্টিফাই করেছি, এবং আমরা এটিকে প্রোফাইলারের মাধ্যমে চালিয়েছি। ইন্ডিভিজুয়াল কম্পোনেন্ট টাইম রেজাল্ট দেখলে আপনার সার্চ দ্রুত হয়নি। এখন কী? কোয়ারী কীভাবে কাজ করে সেটি বুঝতে, নিচের দুই ফেজের মাধ্যমে যাওয়া, আপনাকে আপনার কোয়ারী রিডিজাইন করতে দেবে যেভাবে ইলাস্টিকসার্চ থেকে সেরা রেজাল্ট পাওয়া যায়—গতি এবং প্রাসঙ্গিকতা উভয় দিক থেকে।
কোয়ারী ফেজ
- কোঅর্ডিনেটর নোড কোয়ারীটি গ্রহণ করে।
- কোঅর্ডিনেটর সার্চ করা হচ্ছে সেই ইন্ডেক্স (বা ইন্ডেক্সগুলো) আইডেন্টিফাই করে।
- কোঅর্ডিনেটর সেই নোডের লিস্ট তৈরি করে যেগুলো ইন্ডেক্সের শার্ড ধারণ করে (প্রাইমারি এবং রেপ্লিকার উভয়ের মিশ্রণ)।
- কোঅর্ডিনেটর নোডগুলোর কাছে কোয়ারী পাঠায়।
- নোডগুলোর ওপর শার্ডগুলো কোয়ারী প্রসেস করে।
- কোয়ারী স্কোর করা হয় (ডিফল্টভাবে) টপ ১০ ডকুমেন্ট পর্যন্ত।
- লিস্টটি কোঅর্ডিনেটর নোডে ফেরত পাঠানো হয়।
ফেচ ফেজ
- ফেচ ফেজ কোঅর্ডিনেটর নোডের সাথে শুরু হয়, যা ৫০টি রেজাল্টের মাঝpath (৫ শার্ড x ১০) প্রতিটি শার্ড থেকে পাঠানো হয়েছে সেসবের মাঝ থেকে টপ ১০ ডকুমেন্ট নির্ধারণ করে।
- কোঅর্ডিনেটর টপ ১০ ডকুমেন্টের জন্য একটি রিকোয়েস্ট পাঠায় শার্ডগুলোর কাছে। (এটি একটি শার্ড হতে পারে যেটি টপ-স্কোরিং ডক্স ধারণ করে, অথবা সেগুলো একাধিক শার্ডের জুড়ে ছড়িয়ে থাকতে পারে।)
একটি লিস্ট রিটার্ন হওয়ার পর, মাস্টার কোয়ারী রেসপন্সের _hits সেকশনে ডকুমেন্টগুলো প্রেজেন্ট করে।
রেজাল্ট স্কোর
রেজাল্ট স্কোর ইলাস্টিকসার্চে কী। সাধারণত, যখন আপনি একটি সার্চ ইঞ্জিন ব্যবহার করেন, আপনি সবচেয়ে নির্ভুল রেজাল্ট চান। উদাহরণস্বরূপ, আপনি কিউই ফল খুঁজছেন, আপনি চান না যে রেজাল্টে কিউই জুতা পলিশ অন্তর্ভুক্ত থাকে। ইলাস্টিকসার্চ আপনার সরবরাহ করা প্যারামিটার অনুযায়ী কোয়ারী রেজাল্ট স্কোর করে। যাইহোক, কোয়ারী রিলেভেন্সি আমরা একদম আলাদা একটি ব্লগ পোস্টে কভার করব, এখানে এটি উল্লেখ করা গুরুত্বপূর্ণ কারণ আপনার কাছে একটি দ্রুত সার্চ থাকলেও যদি রেজাল্ট আপনি যা খুঁজছেন সেটি না হয়, তবে পুরো সার্চটি বর্জ্য হবে। তাই, আপনি আপনার সার্চ কীভাবে দ্রুত করবেন?
ফিল্টার
আপনার সার্চের পারফরম্যান্স উন্নত করার একটি উপায় হল ফিল্টার। ফিল্টারড কোয়ারী আপনার সেরা বন্ধু হতে পারে। প্রথমে ফিল্টার করা গুরুত্বপূর্ণ কারণ সার্চে ফিল্টার ডকুমেন্ট স্কোরের ফলাফলকে প্রভাবিত করে না, তাই আপনি খুব কম রিসোর্স ব্যবহার করে সার্চ ফিল্ড কমানো পারেন।
একটি ফিল্টারড কোয়ারীতে, বুলিয়ান ম্যাচের সাথে কাজ করে, আপনি X ধারণ করা সকল ডকুমেন্ট খুঁজে পেতে পারেন Y ধারণ করছে কিনা সেটি স্কোর করার আগে। এছাড়া, আপনি ফিল্টার ক্যাশও করতে পারেন।
ফিল্টার ইলাস্টিকসার্চ কোয়ারী দ্রুত করার একমাত্র উপায় নয়। ভবিষ্যতের ব্লগে কোয়ারী পারফরম্যান্স উন্নত করার আরও পদ্ধতি কভার করব।
সারাংশ
আপনি কয়েকটি সহজ ধাপে আপনার কোয়ারী অপ্টিমাইজ করতে পারেন:
- স্লো লগিং অন করুন যাতে দীর্ঘক্ষণ চলমান কোয়ারী আইডেন্টিফাই করতে পারেন
- আইডেন্টিফাই করা সার্চগুলো _profiling API-এর মাধ্যমে চালান ইন্ডিভিজুয়াল কম্পোনেন্টের টাইমিং দেখতে
- ফিল্টার, ফিল্টার, ফিল্টার
ইলাস্টিকসার্চ ম্যানেজ করার প্রশ্ন আছে? আমরা প্রতিটি ইনস্ট্যান্সের সাথে, এমনকি ফ্রি ট্রায়ালের সাথেও, গভীর ইলাস্টিকসার্চ দক্ষতা সম্পন্ন ডেটাবেস অ্যাডমিনিস্ট্রেটরদের এক্সেস দিই। ডেভেলপমেন্টের ওপর ফোকাস করুন এবং আমাদের ইলাস্টিকসার্চ ম্যানেজমেন্ট হ্যান্ডেল করতে দিন।
Kibana-সহ ইলাস্টিকসার্চ ৬-এর ফ্রি ট্রায়ালে খেলতে চান? শুরু করুন এবং জানান আপনার কোনো প্রশ্ন আছে কিনা।
ফিডব্যাক ট্যাব ব্যবহার করে মন্তব্য করুন বা প্রশ্ন জিজ্ঞাসা করুন। আপনি সেলস চ্যাট-এ ক্লিক করেও এখনই কথা বলার শুরু করতে পারেন।