احتمالا براتون پیش اومده که لازم باشه تا توی پروژتون جایی پایگاه داده پروژه ریلیشنال رو به یک پایگاه داده نوریلیشنال وصل کنین. خب این قضیه از جنبه های مختلفی باید بررسی بشه تا بشه براش یک راه حل منطقی با هزینه درست بدست آورد.
این جنبه ها میتونه شامل براورد هزینه های این کار برای پروژه باشه (زمان ، ...) یا حتی scale پایگاه داده اون پروژه که ایا امکان انجام همچین کاری رو داره یا نه . بطورکلی این مسأله چیزی که باید با دقت بهش فکر کرد. اما بطورکلی یکی از راههایی که وجود داره برای اینکار استفاده از ابزار لاگ استش برای این کاره.
بانگاهی به وبسایت الستیک، لاگ استش اینطوری تعریف میشه:لاگ استش قسمتی از الستیک استک می باشد که همراه با مجموعه ابزار بیت عرضه میشود.لاگ استش یک پردازش گر داده سمت سرور میباشد که داده هارا از ورودی های مختلف بصورت همزمان دریافت و تبدیل و به خروجی دلخواه ارسال مینماید.
خب توی این سناریو که میخوام اینجا راجع بهش بنویسم اینطوری که من یه پروژه ای دارم که بنا به نیاز پروژه میخوام قسمتی از اون رو وصل کنم به الستیک سرچ. این پروژه یک پروژه در حوزه حمل و نقل به این صورت که یک فروشگاه زنجیره ای بزرگ که خورده فروشی داره مجبور محصول رو بصورت عمده از تولید کننده بخره، داخل انبارش ذخیره کنه و در مرحله اخر در زمان نیاز محصولات رو بین فروشگاه هاش تقسیم کنه.
بصورت پیش فرض من برای همچین سناریویی پارامتر های مختلفی دارم که به ازای هربار کوئری روی دیتابیس مجبورم از اونها استفاده کنم در نتیجه جداول زیادی درگیر میشن تا محاسبه لازم انجام بشه، پس لود سنگینی رو دیتابیس دارم.
کارفرما میخواد که یک فیچر جدید که یک باکس جستجو رو به پروژش اضافه کنم در نتیجه مجبورم از جداول مختلفی استفاده کنم که این ویژگی اضافه بشه،حالا راه حل چیه ؟
همونطوری که قبلا هم گفتم برای اینکار راه حل های مختلفی وجود داره و باید جنبه های مختلفی رو سنجید تا به راه حل درست رسید در هر حال یکی از این راه حل ها استفاده از کتابخانه JDBC که میخوام راجع بهش بنویسم.
برای اینکه این نوشته طولانی نشه پیشنهاد میکنم توضیحات این کتابخانه از داخل وبسایتش بخونین تا با جزییاتش بیشتر آشنا بشین.
من برای اینکه بتونم باکس جستجو رو پیاده سازی کنم میخوام که باکس جستجو از اینجین الستیک استفاده کنه برای اینکار نیاز دارم به دیتاهای داخل پایگاه دادم، پس چطوری باید اونهارو بکشم بیرون و بریزمشون داخل الستیک .
همونطوری که در تعریف لاگ استش نوشتم :
داده هارا از ورودی های مختلف بصورت همزمان دریافت و تبدیل و به خروجی دلخواه ارسال مینماید.
پس توی این معماری بین الستیک و پایگاه داده، لاگ استش قرار میگیره، که دیتا هارو بخونه و به الستیک منتقل کنه اما هنوز یه مشکل بزرگتر داریم و اون اینکه پایگاه داده من داخل پروژه یک پایگاه داده ریلیشنال اما الستیک یک پایگاه داده نو ریلیشنال پس راه حل چیه ؟ اینجاست که از کتابخانه jdbc باید استفاده کنیم.
برای اینکار نیاز داریم تا تنظیمات لاگ استش رو تغییر بدیم به صورت زیر:
input { jdbc { jdbc_user => "postgres" jdbc_driver_class => "org.postgresql.Driver" jdbc_connection_string => "jdbc:postgresql://localhost:5432/project_development user=hadii" jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/postgresql-42.2.22.jar" jdbc_password => "postgres" statement => "select *, id from orders;" #schedule => "0 0 * * MON" } } output { elasticsearch { hosts => "http://elasticsearch:9200" index => "shipment_order_%{+YYYY_MM_dd}" } stdout {} }
خب برای درک بهتر تنظیمات بالا اونها رو بصورت خط به براتون توضیح میدم:
بصورت کلی لاگ استش دارای یک ورودی و یک خروجی میباشد که اصلاحالا به اونها input و output میگیم.
input { } output { }
در مرحله بعد jdbc تنظیمات اتصال به لاگ استش که هرکدوم بصورت زیر تعریف میشن:
jdbc { jdbc_user => "postgres"
نام کاربری پایگاه داده داخل پروژتونه
jdbc_driver_class => "org.postgresql.Driver"
کلاس کتابخونه jdbc این کلاس به ازای پایگاه داده های مختلف فرق میکنه
jdbc_connection_string => "jdbc:postgresql://localhost:5432/project_development user=hadii"
این قسمت URL پایگاه داده پروژست که داخل پروژه تعریف شده ، فراموش نکنین که در اخر این URL حتما اسم یوزر پایگاه دادتون رو هم اضافه کنن jdbc نیاز داره تا بهش وصل بشه
jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/postgresql-42.2.22.jar"
مسیر قرار گیری فایل کتابخونست و چون من اینجا از داکر استفاده کرده بودم مسیر داخل داکر رو وارد کردم، یادتون نره که اگه مثل من از داکر استفاده کردین توی فایل راه انداز داکر ادرس بیرون فایل کتابخونه رو هم اضافه کنین
jdbc_password => "postgres"
رمز عبور پایگاه داده پروژتونه
statement => "select *, id from orders;"
این قسمت رو به دو صورت میتونین استفاده کنین یا مستقیما کوئری sql رو اینجا بنویسین تا کتابخونه jdbc اون رو اجرا کرده و دیتای مد نظر رو براتون بیاره و یا اینکه اگه این کوئری ممکن تغییر بکنه میتونین اون رو داخل یک فایل بزارین و ادرس و اون فایل رو بدین تا فایل پارس شده کوئری اجرا و در نهایت دیتا به الستیک منقل بشه.
#schedule => "0 0 * * MON" }
این خط رو هم که من اون رو کامنت کردم برای تعریف زمان اجرای فچ کردن دیتاست .
و در نهایت هم خروجی لاگ استش شما میشه الستیک سرچ که بصورت زیر من اون رو تعریف کردم
output { elasticsearch { hosts => "http://elasticsearch:9200" index => "shipment_order_%{+YYYY_MM_dd}" }
همونطور که بارها هم در طول این نوشته توضیح دادم برای استفاده از این کتابخونه حتما باید جنبه های مختلف رو بررسی کنین بعد اقدام به استفاده بکنین چرا که هربار استفاده از این کتابخونه لود اضافی سمت پایگاه داده اصلیتون میاره که ممکن تاثیر منفی روی پروژتون داشته باشه.