এই পোস্টটি হার্ট হুভার এবং রায়ান ওয়াকার দ্বারা সহ-লেখা হয়েছে
সম্প্রতি, Rackspace DevOps অটোমেশন দল একটি পরিষেবা ঘোষণা করেছে যা নিউ রিলিক থেকে Rackspace সমর্থনে সতর্কতা পাঠায়। এই সতর্কতাগুলি আমাদের DevOps ইঞ্জিনিয়ারদের প্রতিক্রিয়া জানাতে টিকিট তৈরি করবে, যাতে সকাল 3 টায় সতর্কতা জেনারেট হলে আমাদের গ্রাহকরা নিশ্চিন্তে ঘুমাতে পারেন। আমাদের গ্রাহকদের পরিবেশ সম্পর্কে সংগৃহীত অন্যান্য ডেটা পয়েন্টের সাথে একত্রিত হলে, আমাদের প্রকৌশলীরা সমস্যাগুলি কোথায় রয়েছে তা শনাক্ত করবে এবং তারপরে যথাযথ পদক্ষেপ কার্যকর করবে৷
এই পরিষেবার জন্য পরিকাঠামো ডিজাইন করার সময়, আমরা একটি সাধারণ, কিন্তু আকর্ষণীয় সমস্যার সম্মুখীন হয়েছিলাম যেটিতে আমাদের নিরাপত্তার জন্য র্যাকস্পেসের অভ্যন্তরীণ সিস্টেমগুলিতে অ্যাক্সেস সীমিত করতে হবে এবং এখনও একটি পাবলিক এন্ডপয়েন্ট বজায় রাখতে হবে যেখানে নিউ রেলিক কথা বলতে পারে। আমাদের সমাধান ছিল পাবলিক API এন্ডপয়েন্ট এবং বেসরকারী কর্মীদের একে অপরের থেকে সম্পূর্ণ আলাদা করে একটি পরিষেবা ডিজাইন করা। পাবলিক API এন্ডপয়েন্ট নিউ রিলিক থেকে সতর্কতা গ্রহণ করে এবং একটি সারি হিসাবে কাজ করে একটি অবজেক্ট রকেট রেডিস ইনস্ট্যান্সে প্রেরণ করে। কর্মী পরিষেবাগুলি অভ্যন্তরীণভাবে একটি RackConnect ফায়ারওয়ালের পিছনে চলে এবং সারি থেকে বার্তাগুলি টেনে আনে এবং সতর্কতা তৈরি করে৷
এটি পরিবেশগুলিকে খুব ভালভাবে বিভাজন করে, কিন্তু লগ একত্রিতকরণের ক্ষেত্রে আমাদের জন্য একটি সমস্যা তৈরি করে। আমরা আমাদের ব্যক্তিগত পরিবেশে একটি ইলাস্টিক সার্চ/কিবানা স্ট্যাক চালাই। ফায়ারওয়ালের পিছনে, আমরা লগগুলি সরাসরি ইলাস্টিক সার্চে পুশ করতে fluentd ব্যবহার করি। ফায়ারওয়ালের বাইরে, EK স্ট্যাকে পৌঁছানো যাবে না। এটি সমাধান করার জন্য, আমরা আমাদের পাবলিক API পরিষেবাগুলি থেকে একটি ObjectRocket MongoDB দৃষ্টান্তে লগ পুশ করতে fluentd ব্যবহার শুরু করেছি। অভ্যন্তরীণভাবে, আমরা ObjectRocket থেকে ইলাস্টিক সার্চে লগগুলি টানতে আবার fluentd ব্যবহার করি। এটি আমাদের পরিবেশের সমস্ত কার্যকলাপের জন্য একটি একক গন্তব্য দেয়৷
৷Fluentd কি?
Fluentd হল একটি ওপেন সোর্স ডেটা সংগ্রাহক যা যতটা সম্ভব JSON হিসাবে ডেটা গঠন করার চেষ্টা করে। এর মানে হল যে একই বিন্যাসে লগিং ডেটা পেতে আপনাকে একগুচ্ছ স্ক্রিপ্ট লিখতে এবং বজায় রাখতে হবে না। এটা সব JSON।
সাবলীল শক্তি একাধিক উত্স এবং গন্তব্যের জন্য এর সমর্থনে। উদাহরণস্বরূপ, আপনি টুইটার স্ট্রীম থেকে ডেটা সংগ্রহ করতে পারেন এবং আইআরসি-তে এটি সম্পর্কে আপনাকে অবহিত করতে পারেন। সেখানে প্রচুর কমিউনিটি প্লাগইন উপলব্ধ।
ডকারের সাথে Fluentd ব্যবহার করা
MongoDB fluentd প্লাগইন ব্যবহার করে, কেউ সহজেই ObjectRocket-এ লগ পুশ করতে পারে। প্রথমত, উত্স সংজ্ঞায়িত করা আবশ্যক। যেহেতু আমাদের সমস্ত পরিষেবা ডকার ব্যবহার করছে আমাদের কন্টেইনার লগগুলি সাবলীলভাবে পেতে হবে। এখানে একটি দুর্দান্ত পোস্ট রয়েছে যা ডকার-জেনের সাথে লগ একত্রিতকরণ এবং এখানে জেসন ওয়াইল্ডার দ্বারা সাবলীলভাবে কীভাবে সম্পাদন করা যায় তার পরিপূরক। একবার ফ্লুয়েন্ট কন্টেইনার চালু হয়ে গেলে (এবং ডকার-জেন ফ্লুয়েন্ট কনফিগারেশন তৈরি করেছে), আপনার প্রতিটি চলমান কন্টেইনারের জন্য এইরকম একটি বিভাগ থাকা উচিত:
<source>
type tail
format json
time_key time
path /var/lib/docker/containers/abcdef/abcdef-json.log
pos_file /var/lib/docker/containers/abcdef/abcdef-json.log.pos
tag docker.container.abcdef
rotate_wait 5
</source>
এটি কন্টেইনার লগকে লেজ করে এবং একটি অবস্থান ফাইলের সাহায্যে লগে কোথায় আছে তা ট্র্যাক করে। এটি লক্ষ করা গুরুত্বপূর্ণ যে এই কনফিগারেশন বিভাগে উপস্থিত ট্যাগটি একটি সাবলীল ট্যাগ, এটি যে ডেটা একত্রিত করে তার সাথে কী করতে হবে তা বলতে ব্যবহৃত হয়৷
MongoDB এর সাথে Fluentd ব্যবহার করা
জনসাধারণের দিক থেকে, আমরা সাবলীলভাবে বলি যে একটি "ম্যাচ" সহ ডেটা দিয়ে কী করতে হবে৷ এই ক্ষেত্রে, একই কনফিগারেশন ফাইলে আপনার ObjectRocket ডাটাবেস থেকে প্রকৃত তথ্য দিয়ে ভেরিয়েবলগুলি প্রতিস্থাপন করুন:
<match docker.**>
type mongo
database $DBNAME
collection prod
host $HOSTNAME
port $PORT
ssl
capped
capped_size 100m
user $MONGOUSER
password $MONGOPASS
include_tag_key true
</match>
অন্তর্ভুক্ত_ট্যাগ_কি সেটিংটি মঙ্গোডিবি-তে লগের জন্য ট্যাগটি অন্তর্ভুক্ত করতে ফ্লুয়েন্টডকে বলে। এইভাবে আমরা ঠিক জানি কোন লগ এন্ট্রি কোন পাত্রের অন্তর্গত। Fluentd ডাটা দিয়ে MongoDB তৈরি করা শুরু করবে, যা আমরা আমাদের অ্যাপ্লিকেশনের ব্যক্তিগত দিকে নামিয়ে আনতে পারি।
ব্যক্তিগত দিক থেকে, আমরা এখনও সাবলীল MongoDB প্লাগইন ব্যবহার করি, কিন্তু এবার এটি একটি উৎস হিসেবে সেট করুন:
<source>
type mongo_tail
database $DBNAME
collection prod
host $HOSTNAME
port $PORT
user $MONGOUSER
password $MONGOPASS
ssl
time_key time
wait_time 5
tag prod
id_store_file /app/prod_last_id
</source>
তারপরে, আমরা আমাদের লগগুলির জন্য একটি "ম্যাচ" প্রদান করি যাতে সেগুলিকে ইলাস্টিক সার্চে পুশ করা যায়:
<match **>
type forest
subtype elasticsearch
<template>
host elasticsearch.domain.com
port 9200
index_name fluentd
logstash_format true
buffer_type memory
type_name ${tag}
flush_interval 3
retry_limit 17
retry_wait 1.0
num_threads 1
</template>
</match>
আমরা ফরেস্ট ফ্লুয়েন্টড প্লাগইনও ব্যবহার করছি যা একাধিক পরিবেশে আমাদের ট্যাগিং কনফিগারেশনকে সহজ করে।
Fluentd হল একাধিক হোস্ট জুড়ে আপনার ডকার লগগুলিকে একত্রিত করার এবং একটি MongoDB ডাটাবেসে পুশ করার একটি দুর্দান্ত উপায়। আমাদের ক্ষেত্রে, অবজেক্ট রকেট হল লগ এগ্রিগেশনের জন্য আমাদের পাবলিক এবং প্রাইভেট পরিবেশের মধ্যে একটি পথ স্টেশন। অন্যান্য ব্যবহারের ক্ষেত্রে আপনি যে ডেটা সংগ্রহ করছেন তার রিয়েল-টাইম বিশ্লেষণ অন্তর্ভুক্ত করতে পারে। আমাদের দলের জন্য সবচেয়ে ভালো দিক হল আমাদের MongoDB পরিচালনা করতে হবে না, ObjectRocket-এর নির্ভরযোগ্যতা এবং জ্ঞানের জন্য ধন্যবাদ৷