من به تناسب نیازی که داشتم مدتها درگیر این بودم که چطور میشه یک از ابزاری مثل الستیک سرچ بدرستی استفاده کرد.از اونجایی که تقریبا هیچ مستندفنی فارسی درستی که بتونه کمک بکنه اصلا وجود نداره و قالب مستند ها مقالات فنی موجود هم تقریبا کلی گویی کردن یا بعضا خیلی نقص دارن و گاهی حتی تکرارین سعی کردم، توی این مقاله بصورت خلاصه همه اون چیزی که شما لازم دارین تا یک الستیک سرچ پایدار از نظر منابع، قابل توسعه با کمتر هزینه داشته باشین رو براتون اماده کنم امیدوارم که بدردتون بخوره.
از روزی که شروع کردم به خوندن راجع به این ابزار یکی از عمده مواردی که بهش برخوردم، مسئله کلاستر کردن بود که به جد میشه گفت تقریبا هیچ کجا شما نمیتونین منبعی پیدا کنین توضیح درستی بده که کلاسترینگ اصلا یعنی چی ؟ خیلی سر راست بگه ایا شما نیاز دارین که الستیک سرچ خودتون رو کلاسترکنین یا نه و خیلی سوالای دیگه.
توی این نوشته میخوام بهتون توضیح بدم که چطور میتونین چنتا نود الستیک سرچ رو باهم کلاستر کنین. قبلش باید اضافه کنم که این روش رو روی Fedora ۳۰/Fedora ۲۹/CentOS ۷ هم تست کردم، پس خیالتون راحت باشه از بابتش.
خب در قدم اول باید بگم که کلاستر کردن الستیک سرچ اصلا یعنی چی؟ کلاستر الستیک سرچ رو به گروهی از نودها میگن که cluster.name یکسانی داشته باشن.هرنودی که به کلاستر اضافه و کم میشه، کلاستر بصورت اتوماتیک خودش رو باز سازماندهی میکنه تا توزیع داده ها روی نودها رو مدیریت کنه. اینکار باعث افزایش ظرفیت و تضمین پایداری کلاستر میشه.
هر نودی توی کلاستر الستیک سرچ وظیفه خاصی رو برعهده داره که به ترتیب توضیح میدم:
توی این نوشته ، من میخوام یک کلاستر 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 حافظه، فعال کردن مموری لاک روی کلاسترتونه. فقط کافیه که خط 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 ["127.0.0.1", "[::1]"] # discovery.seed_hosts: ["node1:ip", "node2:ip", "node3:ip"] ...
اما در رابطه با گزینه cluster.initial_master_nodes باید بگم که وظیفش مشخص کردن مستر نود اصلی برای اولین بار. این اتفاق زمانی مهم میشه که برای اولین بار دارین کلاسترتون رو بالا میارین. و اینکه این گزینه وقتی که کلاسترتون پایدار شد توسط خود کلاستر کنار گذاشته میشه.
... # Bootstrap the cluster using an initial set of master-eligible nodes: # # #cluster.initial_master_nodes: ["node-1", "node-2"] cluster.initial_master_nodes: ["es-node-01", "es-node-02", "es-node-03"] ...
الستیک سرچ مقدار 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 "vm.max_map_count=262144" >> /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 "node:ip:9200/_cluster/health?pretty"
{ "cluster_name" : "es-nodes", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
وضعیت سلامت نودها عبارتند از: سبز، زرد یا قرمز. وضعیت قرمز نشان میده که شاردها خاص در نود تخصیص داده نمیشن، زرد به این معنی که شاردهای اصلی تخصیص داده شدن اما کپیها اختصاص داده نمیشن، و سبز به این معنی است که همه شاردها تخصیص داده شدهاند.
در اخر: