Hadi Varposhti
Hadi Varposhti
خواندن ۹ دقیقه·۱ سال پیش

همه اون چیزی که در رابطه با کلاسترینگ الستیک سرچ باید بدونین


من به تناسب نیازی که داشتم مدتها درگیر این بودم که چطور میشه یک از ابزاری مثل الستیک سرچ بدرستی استفاده کرد.از اونجایی که تقریبا هیچ مستندفنی فارسی درستی که بتونه کمک بکنه اصلا وجود نداره و قالب مستند ها مقالات فنی موجود هم تقریبا کلی گویی کردن یا بعضا خیلی نقص دارن و گاهی حتی تکرارین سعی کردم، توی این مقاله بصورت خلاصه همه اون چیزی که شما لازم دارین تا یک الستیک سرچ پایدار از نظر منابع، قابل توسعه با کمتر هزینه داشته باشین رو براتون اماده کنم امیدوارم که بدردتون بخوره.

از روزی که شروع کردم به خوندن راجع به این ابزار یکی از عمده مواردی که بهش برخوردم، مسئله کلاستر کردن بود که به جد میشه گفت تقریبا هیچ کجا شما نمیتونین منبعی پیدا کنین توضیح درستی بده که کلاسترینگ اصلا یعنی چی ؟ خیلی سر راست بگه ایا شما نیاز دارین که الستیک سرچ خودتون رو کلاسترکنین یا نه و خیلی سوالای دیگه.

توی این نوشته میخوام بهتون توضیح بدم که چطور میتونین چنتا نود الستیک سرچ رو باهم کلاستر کنین. قبلش باید اضافه کنم که این روش رو روی Fedora ۳۰/Fedora ۲۹/CentOS ۷ هم تست کردم، پس خیالتون راحت باشه از بابتش.

خب در قدم اول باید بگم که کلاستر کردن الستیک سرچ اصلا یعنی چی؟ کلاستر الستیک سرچ رو به گروهی از نودها میگن که cluster.name یکسانی داشته باشن.هرنودی که به کلاستر اضافه و کم میشه، کلاستر بصورت اتوماتیک خودش رو باز سازماندهی میکنه تا توزیع داده ها روی نودها رو مدیریت کنه. اینکار باعث افزایش ظرفیت و تضمین پایداری کلاستر میشه.

هر نودی توی کلاستر الستیک سرچ وظیفه خاصی رو برعهده داره که به ترتیب توضیح میدم:

  • مستر نود (Master-eligible node) - به نودی گفته میشه که صفت node.master بصورت پیش فرض بر روی اون true باشه. این نود در کلاستر مسئول کارهایی مثل حذف یا ایجاد ایندکس ها، رهگیری (tracking) نودهایی که عوضی از کلاستر هستن و تصمیم اینکه کدوم شارد باید به کدوم نود الحاق بشه بر عهده مستر نود.
  • نود داده (Date node) - به نودی گفته میشه که صفت node.data بصورت پیش فرض بر روی اون true باشه. این نود داده ها رو بروی خودش نگه میداره و وظایفی مثل جستجو، تجمیع داده (aggregations)‌ و اعمالی مثل CRUD رو روی داده ها اعمال میکنه.
  • اینگست نود (Ingest node) - به نودی گفته میشه که صفت node.ingest بصورت پیش فرض بر روی اون true باشه. اینگست نود وظیفه داره تا اینگست پایپ لاین ها رو بر روی ایندکس، قبل از اینکه ساخته بشه اعمال بکنه.
  • نود هماهنگ کننده (Coordinating node) - وظیفه اصلی این نود مسیریابی جستجو و فهرست بندی درخواست ها از مشتریان به دادهاست، که درواقع داره مثل یک لود بالانسر برای ما عمل میکنه.

راه اندازی کلاستر الستیک سرچ

توی این نوشته ، من میخوام یک کلاستر Elasticsearch با سه تا نود راه‌اندازی کنم که هر نود واجد شرایط مستر نود باشه.

نصب الستیک سرچ بر روی فدورا

از اونجایی که این نوشته قرار فقط در رابطه با توضیح روش کلاستر کردن باشه وارد جزئیات نصب نمیشم اما شما میتونین با کمک لینک هایی که قرار میدم روش نصب روی فدورای ۲۹ و فدورای ۳۰ رو یاد بگیرین.

راه اندازی کلاستر الستیک سرچ

زمانی که فرایند نصب الستیک سرچ بر روی نودهاتون انجام شد، زمان شروع کلاستر کردن نودها میشه.

نام گذاری در کلاستر الستیک سرچ

تو این مرحله لازمه که توی تمامی نودهاتون فایل تنظیمات الستیک رو باز کنین و اسمی رو که برای کلاسترتون در نظر دارین روی اون ست کنین.

مسیری که باید فاید تنظیمات رو توی اون پیدا کنین

vim /etc/elasticsearch/elasticsearch.yml

> نود اول

... # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: es-nodes-01 ...

> نود دوم

... # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: es-nodes-02 ...

> نود سوم

... # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: es-nodes-03 ...

غیرفعال کردن Swapping حافظه

قبل از هرچیزی باید بگم که Swapping بر روی پایداری کلاستر الستیک سرچ تاثیر داره، و حتی ممکن باعث کند شدن نودها و یا جدا شدن اونها از کلاستر بشه. یکی از راههای غیرفعال کردن Swapping حافظه، فعال کردن مموری لاک روی کلاسترتونه. فقط کافیه که خط bootstrap.memory_lock: true از کامنت خارج کنین.

... # ----------------------------------- Memory ----------------------------------- # # Lock the memory on startup: # bootstrap.memory_lock: true ...

البته پشنهادم به شما اینه که اگه الستیک رو بصورت سرویس نصب کردین، swapping رو از طریق ویرایش فایل سرویس، الستیک سرچ با کمک systemd و اضافه کردن خط زیر بهش غیر فعال کنین

systemctl edit elasticsearch
[Service] LimitMEMLOCK=infinity

احتمالا میدونین هرباری که یه سرویسی رو ویرایش میکنین، بعد از ویرایش باید اونو یکبار reload کنین تا تغییراتتون اعمال بشه، اینکارم با کمک دستور زیر انجام میشه.

sudo systemctl daemon-reload

یکی دیگه از روشهای پیشنهادی هم غیرفعال کردن کامل swapping روی سیستم عامله البته بشرطی که الستیک سرچ تنها سرویسی باشه که قرار روی اون سیستم عامل کار کنه. اینکارم میتونین از طریق دستور زیر انجام بدین.

swapoff -a

مشخص کردن وظیفه نودها

همانطور که در بالاترم گفتم، می توانین به هر نود یه وظیفه مشخص اختصاص بدین. در این تنظیمات، من هر سه نود رو به گونه ای پیکربندی می کنم که هم به عنوان مستر نود و هم به عنوان نود داده عمل کنند.

... # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: es-nodes node.master: true node.data: true ...

وصل کردن نودها بهم

لازمه که اشاره کنم، الستیک سرچ بصورت پیش فرض از پروتکل TCP و پورت ۹۲۰۰ برای ارتباط با بیرون استفاده میکنه و پروتکل TCP هم از پورت ۹۳۰۰ - ۹۴۰۰ برای ارتباط بین نود ها استفاده میکنه.

تنظیمات کلاستر

در تنظیمات الستیک سرچ دو نکته مهم وجود داره که باید قبل از شروع بکار کلاسترمون پیکربندی بشن تا نود ها بتونند همدیگرو ببینن و نود اصلی رو انتخاب کنن.

discovery.seed_hosts و cluster.initial_master_nodes

گزینه discovery.seed_hosts لیستی از نودهای اصلی داخل کلاسترو نگه میداره و به صورت host:port و یا host نمایششون میده. البته مقدار پورت رو توی نسخه های جدید برابر با مقدار transport.profiles.default.port قرار میدن و بصورت جداگونه ای نمایش داده میشه اما توی نسخه های قدیمی تر این مقدار برابر بوده با discovery.zen.ping.unicast.hosts.

... # --------------------------------- Discovery ---------------------------------- # # Pass an initial list of hosts to perform discovery when this node is started: # The default list of hosts is [&quot127.0.0.1&quot, &quot[::1]&quot] # discovery.seed_hosts: [&quotnode1:ip&quot, &quotnode2:ip&quot, &quotnode3:ip&quot] ...

اما در رابطه با گزینه cluster.initial_master_nodes باید بگم که وظیفش مشخص کردن مستر نود اصلی برای اولین بار. این اتفاق زمانی مهم میشه که برای اولین بار دارین کلاسترتون رو بالا میارین. و اینکه این گزینه وقتی که کلاسترتون پایدار شد توسط خود کلاستر کنار گذاشته میشه.

... # Bootstrap the cluster using an initial set of master-eligible nodes: # # #cluster.initial_master_nodes: [&quotnode-1&quot, &quotnode-2&quot] cluster.initial_master_nodes: [&quotes-node-01&quot, &quotes-node-02&quot, &quotes-node-03&quot] ...

مشخص کردن اندازه Heap size

الستیک سرچ مقدار heap size رو بصورت پیش فرض ۱GB قرار میده، اما بر اساس قانون thump مقدار Xmx نباید از ۵۰ درصد از حافظه فیزیکی بیشتر بشه اما نه بیشتر از ۳۲GB این به این معنی که شما در بیشتر حالت مقدار heap size رو میتونین ۱۶GB قرار بدین.

vim /etc/elasticsearch/jvm.options
... ################################################################ # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms1g -Xmx1g ...

سایر تنظیمات مهم

تنظیمات حافظه مجازی

الستیک سرچ بطور پیش فرض از تنظیمات mmapfs برای ذخیره ایندکس ها استفاده میکنه. برای اینکه مطمئن بشین بیشتر از مقدار حافظه مجازیتون استفاده نمیشه لازمه که فایل etc/sysctl.conf/ ویرایش کنین و مقدار vm.max_map_cpunt همونطوری که پایینتر توضیح میدم قرار بدین.

لازمه که اضافه کنم این تنظیمات قبل از راه اندازی کلاستر توسط کلاستر چک میشه و درصورتی که تنظیم نباشه کلاسترتون شروع به کار نمیکنه.

vm.max_map_count=262144

راه دیگه ای که میتونین این مقدار روتنظیم کنین با استفاده از دستوری که اینجا مینویسم

echo &quotvm.max_map_count=262144&quot >> /etc/sysctl.conf

سیستم را مجددا راه اندازی کنین تا تغییراتی که دادین اعمال بشه و بعد دستور sysctl vm.max_map_count را برای اینکه مطمئن بشیم تنظیماتمون درست انجام شده اجرا میکنیم.

sysctl vm.max_map_count vm.max_map_count = 262144

باز کردن پورت های الستیک سرچ در فایروال

همونطور که در بالاتر گفتم، الستیک سرچ از طریق پورت TCP ۹۲۰۰ و به نود ها اجازه می ده ارتباط با بیرون و از طریق پورت TCP ۹۳۰۰-۹۴۰۰ بین نودهای داخل کلاستر باهم ارتباط برقرار کنن. باید این پورت ها را روی فایروال باز باشن.

firewall-cmd --add-port={9200,9300-9400}/tcp --permanent firewall-cmd --reload

اجرای الستیک سرچ

تو قدم اول یکبار systemd رو reload کنین

systemctl daemon-reload

الستیک سرچ رو تنظیم کنین که با بالا اومدن سیستم عامل فعال بشه.

systemctl enable elasticsearch

درنهایت الستیک سرچ رو استارت کنین

systemctl start elasticsearch

میتونین وضعیت الستیک رو با کمک دستور زیر چک کنین که ایا شروع به کار کرده یا نه

systemctl status elasticsearch.service

برای بررسی خطا ها هم میتونین از دستور زیر کمک بگیرین

tail /var/log/elasticsearch/<cluster-name>.log

چک کردم وضعیت سلامت کلاستر ها

curl -X GET &quotnode:ip:9200/_cluster/health?pretty&quot
{ &quotcluster_name&quot : &quotes-nodes&quot, &quotstatus&quot : &quotgreen&quot, &quottimed_out&quot : false, &quotnumber_of_nodes&quot : 3, &quotnumber_of_data_nodes&quot : 3, &quotactive_primary_shards&quot : 0, &quotactive_shards&quot : 0, &quotrelocating_shards&quot : 0, &quotinitializing_shards&quot : 0, &quotunassigned_shards&quot : 0, &quotdelayed_unassigned_shards&quot : 0, &quotnumber_of_pending_tasks&quot : 0, &quotnumber_of_in_flight_fetch&quot : 0, &quottask_max_waiting_in_queue_millis&quot : 0, &quotactive_shards_percent_as_number&quot : 100.0 }

وضعیت سلامت نودها عبارتند از: سبز، زرد یا قرمز. وضعیت قرمز نشان می‌ده که شاردها خاص در نود تخصیص داده نمی‌شن، زرد به این معنی که شاردهای اصلی تخصیص داده شدن اما کپی‌ها اختصاص داده نمیشن، و سبز به این معنی است که همه شاردها تخصیص داده شده‌اند.

در اخر:

  • توی نوشتن این مطلب از جاهای مختلفی کمک گرفتم که بتونم کامل ترین نسخه ممکن براتون اماده کنم
  • اگه جایی از این نوشته براتون سخت و یا نامفهوم خوشحال میشم که بتونم براتون توضیح بدم و کمک به درک بهترش کنم.
  • قطعا از من ادمهای متخصص تری وجود داره اگه ایرادی توی این نوشته دیدن خوشحال میشم بهم بگین تا بتونم اصلاح کنم تا ادمای بیشتری بتونن از این مطلب استفاده کنن.
  • سعی کردم مثل همیشه به ساده ترین حالت ممکن بنویسم اما خب مطلب تا حدی تخصصی و یجاهایی واقعا سخت میشه.
  • و اینکه احتمالا این اخرین نوشتم در رابطه به الستیک سرچ باشه مگه اینکه عنوانی ببینم که حس کنم لازم باشه در رابطه باهاش بنویسم.
  • و در نهایت هم امیدوارم براتون مفید باشه، بتونین ازش کمک بگیرین توی پروژهاتون اگه هم به مشکل خوردین خوشحال میشم بتونم کمکتون کنم.
الستیک سرچکلاسترینگجستجوپایداری
سعی میکنم چیزی رو بنویسم که نیاز آدما باشه
شاید از این پست‌ها خوشتان بیاید