Hadi Varposhti
Hadi Varposhti
خواندن ۵ دقیقه·۳ سال پیش

لاگ استش، اتصال پایگاه داده RDBMS به پایگاه داده NoSQl

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

این جنبه ها میتونه شامل براورد هزینه های این کار برای پروژه باشه (زمان ، ...) یا حتی scale پایگاه داده اون پروژه که ایا امکان انجام همچین کاری رو داره یا نه . بطورکلی این مسأله چیزی که باید با دقت بهش فکر کرد. اما بطورکلی یکی از راههایی که وجود داره برای اینکار استفاده از ابزار لاگ استش برای این کاره.

لاگ استش:

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

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

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

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

همونطوری که قبلا هم گفتم برای اینکار راه حل های مختلفی وجود داره و باید جنبه های مختلفی رو سنجید تا به راه حل درست رسید در هر حال یکی از این راه حل ها استفاده از کتابخانه JDBC که میخوام راجع بهش بنویسم.

کتابخانه ‌jdbc :

برای اینکه این نوشته طولانی نشه پیشنهاد میکنم توضیحات این کتابخانه از داخل وبسایتش بخونین تا با جزییاتش بیشتر آشنا بشین.

من برای اینکه بتونم باکس جستجو رو پیاده سازی کنم میخوام که باکس جستجو از اینجین الستیک استفاده کنه برای اینکار نیاز دارم به دیتاهای داخل پایگاه دادم، پس چطوری باید اونهارو بکشم بیرون و بریزمشون داخل الستیک .

همونطوری که در تعریف لاگ استش نوشتم :

داده هارا از ورودی های مختلف بصورت همزمان دریافت و تبدیل و به خروجی دلخواه ارسال مینماید.

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

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

برای اینکار نیاز داریم تا تنظیمات لاگ استش رو تغییر بدیم به صورت زیر:

input { jdbc { jdbc_user => &quotpostgres&quot jdbc_driver_class => &quotorg.postgresql.Driver&quot jdbc_connection_string => &quotjdbc:postgresql://localhost:5432/project_development user=hadii&quot jdbc_driver_library => &quot/usr/share/logstash/logstash-core/lib/jars/postgresql-42.2.22.jar&quot jdbc_password => &quotpostgres&quot statement => &quotselect *, id from orders;&quot #schedule => &quot0 0 * * MON&quot } } output { elasticsearch { hosts => &quothttp://elasticsearch:9200&quot index => &quotshipment_order_%{+YYYY_MM_dd}&quot } stdout {} }

خب برای درک بهتر تنظیمات بالا اونها رو بصورت خط به براتون توضیح میدم:

بصورت کلی لاگ استش دارای یک ورودی و یک خروجی میباشد که اصلاحالا به اونها input و output میگیم.

input { } output { }

در مرحله بعد jdbc تنظیمات اتصال به لاگ استش که هرکدوم بصورت زیر تعریف میشن:

jdbc { jdbc_user => &quotpostgres&quot

نام کاربری پایگاه داده داخل پروژتونه

jdbc_driver_class => &quotorg.postgresql.Driver&quot

کلاس کتابخونه jdbc این کلاس به ازای پایگاه داده های مختلف فرق میکنه

jdbc_connection_string => &quotjdbc:postgresql://localhost:5432/project_development user=hadii&quot

این قسمت URL پایگاه داده پروژست که داخل پروژه تعریف شده ، فراموش نکنین که در اخر این URL حتما اسم یوزر پایگاه دادتون رو هم اضافه کنن jdbc نیاز داره تا بهش وصل بشه

jdbc_driver_library => &quot/usr/share/logstash/logstash-core/lib/jars/postgresql-42.2.22.jar&quot


مسیر قرار گیری فایل کتابخونست و چون من اینجا از داکر استفاده کرده بودم مسیر داخل داکر رو وارد کردم، یادتون نره که اگه مثل من از داکر استفاده کردین توی فایل راه انداز داکر ادرس بیرون فایل کتابخونه رو هم اضافه کنین

jdbc_password => &quotpostgres&quot

رمز عبور پایگاه داده پروژتونه

statement => &quotselect *, id from orders;&quot


این قسمت رو به دو صورت میتونین استفاده کنین یا مستقیما کوئری sql رو اینجا بنویسین تا کتابخونه jdbc اون رو اجرا کرده و دیتای مد نظر رو براتون بیاره و یا اینکه اگه این کوئری ممکن تغییر بکنه میتونین اون رو داخل یک فایل بزارین و ادرس و اون فایل رو بدین تا فایل پارس شده کوئری اجرا و در نهایت دیتا به الستیک منقل بشه.

#schedule => &quot0 0 * * MON&quot }

این خط رو هم که من اون رو کامنت کردم برای تعریف زمان اجرای فچ کردن دیتاست .

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

output { elasticsearch { hosts => &quothttp://elasticsearch:9200&quot index => &quotshipment_order_%{+YYYY_MM_dd}&quot }

جمع بندی :

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


logstashelasticsearchkibanapostgressjdbc driver
سعی میکنم چیزی رو بنویسم که نیاز آدما باشه
شاید از این پست‌ها خوشتان بیاید