Alireza Shirmohammadi
Alireza Shirmohammadi
خواندن ۴ دقیقه·۳ سال پیش

Reindex data from a remote cluster in elasticsearch

بزارید قبل از هر چیزی یه عذرخواهی کنم بابت اینکه این چند وقت به دلیل مشغله ی زیاد ، پستی نذاشتم . از این به بعد سعی میکنم حداقل ۲ پست رو تو ماه منتشر کنم.

برگردیم سر اصل مطلب ، تو این پست قراره در مورد ری ایندکس (reindex) داده ها از ریموت سرور در الستیک بپردازم .

ولی اصلا reindex چی هست ؟

ری ایندکس (reindex) به یک روش یا متد برای کپی کردن دیتاهای موجود از یک ایندکس (index) مبدأ به یک ایندکس(index) مقصد گفته میشه .

اگه قبلا با الستیک سرچ کار کرده باشید ممکنه براتون پیش بیاد که لازم باشه دیتا رو از یه کلاستر(cluster) و یا نود (node) به دیگری منتقل کنید بزارید یه مثال بزنم .

فرض کنید که ما یه دیتابیس الستیک داریم که ورژنش قدیمی شده و میخوایم دیتا رو به یک نسخه جدیدتر منتقل کنیم یکی از روش ها برای این کار ، reindex هست.

قبل از هرچیزی یک ایندکس با mapping دلخواه تو دیتابیس جدید بسازید.

نکته ۱ : در صورتی که mapping رو تعریف نکنید خوده الستیک براتون میسازه پس بهتره که تعریفش کنید.

نکته ۲ :‌ هنگام ساختن ایندکس جدید ترجیحا replica رو صفر قرار بدید تا عملیات reindex سریع تر انجام شود بعدا در صورت تمایل میتوانیدآنرا عوض کنید .

بعد از ساخت ایندکس وارد کانفیگ فایل دیتابیس جدید بشید و تغییرات زیر رو اعمال کنید .

  • اگر به صورت داکری بالاست :

دستور زیر رو در قسمت environment داکر کامپوز وارد کنید :

reindex.remote.whitelist= OldHost : Port

به جای OldHost آدرس دیتابیس قدیمی و به جای Port ، پورت آنرا وارد کنید.

  • اگر به صورت پکیچ نصبی هست :‌

دستور زیر را در فایل elasticsearch.yml وارد کنید :

reindex.remote.whitelist: OldHost:Port

نکته ۳ :‌ معمولا فایل کانفیگ در مسیر زیر قرار دارد :

usr/share/elasticsearch/config/elasticsearch.yml

نکته ۴ : در صورتی که دیتابیس جدید به صورت کلاستر (cluster) بود لازم نیست تغییرات رو ، روی تک تک نود ها پیاده سازی کنید

بعد از اعمال تغییرات دیتابیس جدید رو ریستارت کنید سپس وارد کیبانا (kibana) بشید و api زیر رو با تغییرات لازمه کال کنید .

POST _reindex
{
"source": {
"remote": {
"host": "http://oldhost:9200",
"username": "user",
"password": "pass"
},
"index": "source"
},
"dest": {
"index": "dest"
}
}

روبه روی host آدرس دیتابیس قدیمی رو به همراه پروتکل http وارد کنید.

نکته ۵ :در صورت داشتن رمز در قسمت username و password وارد کنید .

به جای source اینکس مبدأ و به جای dest ایندکس مقصد را وارد کنید .

نکته ۶ : ری ایندکس دیتا از ریموت سرور ، slicing به روش دستی و خودکار رو پشتیبانی نمیکنه .

در صورتی که بعد از اعمال تغییرات دستور بالا رو ران کنید احتمالا به ارور server timeout بر میخورید

لازم نیست نگران بشید تسک تو بگراند داره انجام میشه .

برای اینکه به ارور نخورید و مراحل انجام تسک رو بعدا دنبال کنید میتونید به دستور بالا پارامتر wait_for_completion=false اضافه کنید . به صورت زیر :

POST _reindex?wait_for_completion=false
{
"source": {
"remote": {
"host": "http://oldhost:9200",
"username": "user",
"password": "pass"
},
"index": "source",
"query": {
"match": {
"test": "data"
}
}
},
"dest": {
"index": "dest"
}
}

نکته ۷: در صورتی که دیتاهای خاصی رو میخواید منتقل کنید میتونید مثل دستور بالا داخل query مشخص کنید.

در جواب دستور بالا یک تسک ایدی دریافت میکنید که میتونید با دستور زیر وضعیت انجام تسک رو دنبال کنید.

GET _tasks/task_id

نکته ۸ :‌به جای task_id ایدی تسک رو وارد کنید.

نکته ۹ : میتونید در قسمت index مبدأ به جای یک index چندین index را به صورت یک لیست وارد کنید .

با دستور زیر میتوانید تمامی تسک های مربوط به reindex رو مشاهده کنید .

GET _tasks?actions=*reindex&detailed

بعد از انجام تمامی مراحل بالا و بعد از اتمام عملیات reindex میتونید index قدیمی رو حذف کنید.


تا جایی که میشد سعی کردم مطلب بالا رو ساده و در عین حال کامل توضیح بدم ولی در صورتی میخواید بیشتر با مراحل اشنا بشید میتونید به سایت elasticsearch مراجعه کنید.

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

نقل قول هفته از Bill Gates:

سنجش میزان برتری در کدنویسی با تعداد خطوط کد مثل سنجش میزان وزن در حین ساخت هواپیماست؛ پس هرچه کمتر بهتر.


Enter to exit . . . .















elasticsearchindexreindexremote cluster
شاید از این پست‌ها خوشتان بیاید