سعی میکنم چیزی رو بنویسم که نیاز آدما باشه
فایل بیت چیه و به چه دردی میخوره؟
خب از اونجایی که یه مدت دارم سعی میکنم چیزایی که یادگرفتم رو بنویسم تا یادم نره اینبار میخوام راجع به ابزاری به اسم فایل بیت بنویسم چرایی استفاده ازش رو توضیح بدم.
تعریف:
فایل بیت بنا به تعریفی که خود وبسایت رسمیش میده : یک انتقال دهنده سبک برای ارسال و متمرکز کردن داده هاست. فایل بیت به عنوان یک عامل بر روی سرور نصب و لاگ فایل ها و یا محل لاگ فایل هارا مورد بررسی قرار میدهد، لاگ هارا جمع آوری کرده و آنها رو به الستیک و یا لاگ استش ارسال میکند.
حالا داستان چیه؟ داستان اینه که اصلا فایل بیت به چه دردی میخوری در صورتی که خود ابزار، لاگ استش هم یکی از وظایفش جمع آوری لاگ هاست.(در رابطه با لاگ استش سعی میکنم بیشتر توضیح بدم بعدا)
در حالت کلی وقتی متوجه شدم که این دو ابزار دارن تقریبا یه کار انجام میدن یکی از ابروهامو بالا انداختم که الان واقعا چرا باید فایل بیت نصب کنم ولی این قضیه فرای مقایسه است و ما در بیشتر سناریو ها که مستقیما درگیر استفاده از الستیک استک هستیم نیاز به استفاده از فایل بیت در کنار لاگ استش داریم، توضیح میدم چرا.
در واقع قبل از تولد فایل بیت، لاگ استش توسط جوردن سیسل برای مدیریت، خواندن لاگ فایل های سنگین از ورودی های مختلف بوجود اومد و بعد از اینکه هم جوردن به تیم الستیک اضافه شد لاگ استش از یه ابزار مستقل تبدیل به قسمتی از یه ابزار جامع تر به اسم الستیک استک ( لاگ استش، الستیک ، کیبانا) شد.
نقش لاگ استش توی این ابزار به این صورت بود که برای پیاده سازی یک سیستم متمرکز جمع اوری لاگ ها نیاز به ابزاری بود که لاگ هارو بتونه از منابع مختلفی بخونه و اونها رو بصورت متمرکز به یکجا منتقل کنه، بصورت کلی این اتفاق عالی برای هر برنامه نویسیه که لاگ های پروژش متمرکز جمع بشن اما ایراد ماجرا برمیگرده به پرفورمنس لاگ استش.
لاگ استش برای اجرا شدن روی سرور نیاز به JVM داره و این نیاز در کنار روبی میشه اصلیترین عامل افزایش مصرف مموری [این وسط ها این رو هم اضافه کنم که عدم تنظیم درست در زمان نصب در کنار افزایش مصرف مموری باعث بوجود اومدن خطای Pool connection هم میشه ] خصوصا زمانی که چنتا ورودی داشته باشین و فیلترینگ روی ورودی ها اعمال کنین.[این رو هم باید اضافه کنم که منظورم از روبی پروژه هایی هستش که سورس کدشون به زبان روبی نوشته شده]
پروتکل Lumberjack و بهینه سازی های اولیه :
لامبرجک بعنوان اولین تجربه ها برای ایجاد یه لاگ کالکتور سبک قبل از ارسال به یه پلتفرم دیگه برای پردازش به حساب میاد. ایده پشت لامبرجک این بودش که اگه یه پروتکل شبکه توسعه بدیم، برای جمع آوری حجم زیادی از داده ها هم کارامدتره هم حافظه کمتری مصرف میکنه و هم از رمزگذاری هم پشتیبانی میکنه. البته لامبرجک بعدا به logstash-forwarder تغییر اسم داد، ایده پشت سرش هم یه مقداری تغییر کرد (که بعدا راجع بهش بیشتر توضیح میدم، فعلا تا همین جا کافیه)
تولد Beats :
نسخه دوم لامبرجک یا همون Logstash-Forwarder که الان دیگه منسوخ شده شده پایه اصلی خانواده Beats.تفاوت اصلی بین این دو نسخه توی ویژگی هایی مثل پشتیبانی از json تودرتو و یا کنترل بهتر فشار بودش.(البته خانواده Beats گستره ای از محصولات مختلف هستن و از اونجایکه توی این نوشته فقط فایل بیت هدف اصلی راجع به اونها هم بعدا توضیح میدم).
خب پس کی از لاگ استش و یا فایل بیت استفاده کنیم :
ساده ترین جواب اینه که وقتی لاگ هاتون هنوز زیاد نشدن،شما نیاز به استفاده از هردوی اونهارو دارین اما چرا؟ چون از لاگ استش به عنوان ابزاری برای جمع آوری و متمرکز کردن لاگ ها و از فایل بیت به عنوان ابزاری برای انتقال لاگ ها نیاز دارین چرا که فایل بیت یک ابزار کاملا سبک ، که از روش های رمزنگاری مثل ssl پشتیبانی میکنه و بشدت هم قابل اعتماده ( اینم باید اضافه کنم که ساختار فایل بیت اینطوری که یک queue از اخرین وضعیت لاگ ها توی خودش داره که همیش از طریق اون از آخرین لاگ موجود توی سیستم خبر دار در نتیجه شما هیچوقت لاگ تکراری به خاطر بازخوانی دوباره لاگ فایل ها ندارین)
توی تصویر زیر رابطه بین لاگ استش و فایل بیت رو بهتر متوجه میشین:
تنظیمات فایل بیت برای اتصال به لاگ استش :
فایل بیت تنظیم میشه که لاگ هارو بسمت لاگ استش بفرسته تا از طریق فایل بیت بره به سمت الستیک، یادتون باشه که حتما پورت خروجی فایل بیت رو روی ۵۰۴۴ قرار بدین. در زیر من میخوام لاگ های apache رو برای خودم جمع آوری کنم
filebeat.inputs:
- input_type: log
paths:
- /var/log/httpd/access.log
document_type: apache-access
fields_under_root: true
output.logstash:
hosts: ["127.0.0.1:5044"]
یچیز رو هم که باز باید اینجا اضافه کنم ورودی هایی که فایل بیت ازشون پشتیبانی میکنه به سه دسته تقسیم میشه :
- خوندن از فایل های بصورت استاتیک
- خوندن از فایل ها بصورت استریم برای مواردی که حجم فایل ها زیاده
- و از طریق سوکت ( که فعلا در حالت آزمایشی ولی توی پروژه من که بدون مشکل داره کار میکنه، باز برای رفتن سمتش با احتیاط برین)
تنظیمات لاگ استش برای دریافت از فایل بیت و ارسال به الستیک:
توی تنظیمات لاگ استش شما باید ورودی تون رو روی پورت ۵۰۴۴ قرار بدین، برای لاگ ها فیلتر بنویسین تا بر اساس اون بتونین ایندکس دلخواهتون رو بسازین و خروجی رو هم روی پورت ۹۲۰۰ تنظیم کنین تا خروجی فایل بیت بشه الستیک.
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
}
جمع بندی :
روش دیگه ای که از طریق اون میتونین لاگ هارو جمع کنین و توی این مقاله نمی گنجه بهش میگن Ingest node که البته برای حجم زیاده دیتا اصلا پیشنهاد نمیکنمش.
توی این مقاله سعی کردم که کلیتی از چرایی استفاده از فایل بیت بگم و اینکه مثال هایی هم از مدل تنظیماتشون بیارم که شاید بدردتون بخوره. البته طبق روال باز هم میگم لزوما استفاده از این سناریو چیز قطعی نیست و شما حتما باید قبل از شروع نیازسنجی لازم برای پروژتون رو انجام بدین.
دست آخر هم اگه حوصله خوندن ندارین این اینفوگرافی رو ببینین که مقایسه ای کرده بین لاگ استش و فایل بیت که میتونه دید خوبی برای شروع بهتون بده.
پینوشت :
کلمه harvesting که توی تصویر دوم دیدین، رو اینطوری میشه تعریف کرد که ؛ به پروسه خوانش لاگ ها توسط فایل بیت harvesting گفته میشه به زبون ساده تر هرباری که فایل بیت داره لاگ هارو میخونه درواقع داره harvest میکنه.
لازمه که یه نکته ای رو هم اینجا اضافه کنم همونطور که بالاتر هم گفتم لامبرجک پایه اولیه از خانواده Beats به حساب میاد اما ارتباطش صرفا نوعی پروتکل ارتباطی اختصاصی بین لاگ استش و فایل بیته که قرار نیازمندی هایی مثل امکان رمزگذاری رو پوشش بده .
مطلبی دیگر از این انتشارات
بهترین منابع یادگیری برنامه نویسی اندروید(فارسی و انگلیسی)
مطلبی دیگر از این انتشارات
دیگه معطل بَک نشو! (Don't think about Back-end) ?
مطلبی دیگر از این انتشارات
شیوه های گوناگون فرمت کردن رشته ها در پایتون