এই পোস্টটি হার্ট হובר এবং রায়ান ওয়াকার द्वारा সহ-লিখিত
সম্প্রতিতে, র্যাকস্পেস DevOps অটোমেশন টিম একটি সেবা ঘোষণা করেছে যা New Relic থেকে র্যাকস্পেস সাপোর্টে সতর্কতা পাঠায়। এই সতর্কতাগুলি আমাদের DevOps ইঞ্জিনিয়রদের জন্য টিকিট তৈরি করবে যাতে তারা প্রতিক্রিয়া জানাতে পারে, যাতে গ্রাহকরা রাত ৩টায় সতর্কতা তৈরি হলে শান্তভাবে ঘুমাতে পারেন। অন্য ডেটা পয়েন্টগুলির সাথে একত্রিত হলে, আমাদের ইঞ্জিনিয়ররা সমস্যাগুলি শনাক্ত করবে এবং সঠিক ব্যবস্থা গ্রহণ করবে।
আর্কিটেকচারের চ্যালেঞ্জ
এই সেবার জন্য ইনফ্রাস্ট্রাকচার ডিজাইন করার সময়, আমরা একটি সাধারণ কিন্তু আকর্ষণীয় সমস্যার সম্মুখীন হয়েছি: নিরাপত্তার জন্য র্যাকস্পেস অভ্যন্তরীণ সিস্টেমগুলিতে অ্যাক্সেস সীমিত রাখতে হয়, একই সাথে New Relic-এর সাথে যোগাযোগের জন্য একটি পাবলিক এন্ডপয়েন্ট বজায় রাখতে হয়। আমাদের সমাধান ছিল পাবলিক API এন্ডপয়েন্ট এবং প্রাইভেট ওয়ার্কার সম্পূর্ণরূপে পৃথক করে একটি সেবা ডিজাইন করা। পাবলিক API এন্ডপয়েন্ট New Relic থেকে সতর্কতা পেয়েছে এবং সেগুলিকে একটি কিউরূপে কাজ করে ObjectRocket Redis ইন্সট্যান্সে পাস করে। ওয়ার্কার সার্ভিসগুলি র্যাককানেক্ট ফায়ারওয়লের পেছনে অভ্যন্তরীণভাবে চলে এবং কিউ থেকে বার্তা টেনে সতর্কতা তৈরি করে।
এটি পরিবেশগুলিকে খুব ভালোভাবে পার্টিশন করে, কিন্তু লগ অ্যাগ্রিগেশন নিয়ে আমাদের জন্য একটি সমস্যা তৈরি করে। আমরা আমাদের প্রাইভেট পরিবেশে একটি ElasticSearch/Kibana স্ট্যাক চালাই। ফায়ারওয়লের পেছনে, আমরা fluentd ব্যবহার করে সরাসরি ElasticSearch-এ লগ পুশ করি। ফায়ারওয়লের বাইরে, EK স্ট্যাকে পৌঁছানো যায় না। এটি সমাধান করার জন্য, আমরা আমাদের পাবলিক API সার্ভিস থেকে ObjectRocket MongoDB ইন্সট্যান্সে লগ পুশ করতে fluentd ব্যবহার শুরু করেছি। অভ্যন্তরীণভাবে, আমরা আবার fluentd ব্যবহার করে ObjectRocket থেকে ElasticSearch-এ লগ টেনে আনি। এটি আমাদের পরিবেশের সমস্ত কার্যকলাপের জন্য একটি একক গন্তব্য দেয়।
Fluentd কী?
Fluentd হল একটি ওপেন সোর্স ডেটা কালেক্টর যা ডেটাকে যতটা সম্ভব JSON হিসেবে কাঠামোগত করার চেষ্টা করে। এর মানে আপনাকে লগিং ডেটাকে একই ফরম্যাটে পেতে ск্রিপ্ট লিখতে এবং রক্ষণাবেক্ষণ করতে হবে না। সবকিছু JSON।
Fluentd-এর শক্তি在于 এর একাধিক সোর্স এবং ডেস্টিনেশনের জন্য সমর্থন। উদাহরণস্বরূপ, আপনি একটি টুইটার স্ট্রিম থেকে ডেটা সংগ্রহ করতে পারেন এবং IRC-এ সতর্কতা পেতে পারেন। অনেক কমিউনিটি প্লাগইন উপলব্ধ।
Docker-এর সাথে Fluentd ব্যবহার
MongoDB fluentd প্লাগইন ব্যবহার করে, খুব সহজে ObjectRocket-এ লগ পুশ করা যায়। প্রথমে, সোর্সগুলি ডিফাইন করতে হবে। যেহেতু আমাদের সব সার্ভিস Docker ব্যবহার করছে, আমাদের কন্টেইনার লগগুলো fluentd-এ আনতে হবে। জেসন ওয়াইল্ডারের ডকার-জেন এবং fluentd দিয়ে লগ অ্যাগ্রিগেশন নিয়ে একটি চমৎকার পোস্ট আছে যা এই পোস্টের পূরক। fluentd কন্টেইনার চালু হলে (এবং docker-gen fluentd কনফিগারেশন জেনারেট করলে), প্রতিটি রানিং কন্টেইনারের জন্য নিচের সেকশনটি থাকা উচিত:
<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>
এটি কন্টেইনার লগকে টেইল করে এবং একটি পজিশন ফাইলের মাধ্যমে লগে কোথায় আছেন তা ট্র্যাক করে। মনে রাখা গুরুত্বপূর্ণ যে এই কনফিগারেশন সেকশনে থাকা ট্যাগটি একটি fluentd ট্যাগ, যা fluentd-কে বলে যে এটি সংগৃহীত ডেটার সাথে কী করবে।
MongoDB-এর সাথে Fluentd ব্যবহার
পাবলিক সাইডে, আমরা "match" দিয়ে 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>
include_tag_key সেটিং fluentd-কে MongoDB-এ লগের রেকর্ডে ট্যাগটি অন্তর্ভুক্ত করতে বলে। এইভাবে আমরা জানি কোন লগ এন্ট্রি কোন কন্টেইনারের। Fluentd MongoDB-কে ডেটা দিয়ে পপুলেট করা শুরু করবে, যা আমরা তারপর আমাদের অ্যাপ্লিকেশনের প্রাইভেট সাইডে টেনে আনব।
প্রাইভেট সাইডে, আমরা এখনও fluentd 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>
তারপর, আমরা আমাদের লগগুলিকে ElasticSearch-এ পুশ করার জন্য একটি "match" প্রদান করি:
<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 forest প্লাগইনও ব্যবহার করছি যা একাধিক পরিবেশে আমাদের ট্যাগিং কনফিগারেশনকে সহজ করে দেয়।
Fluentd আপনার Docker লগগুলিকে একাধিক হোস্ট জুড়ে অ্যাগ্রিগেট করে MongoDB ডাটাবেসে পুশ করার একটি চমৎকার উপায়। আমাদের ক্ষেত্রে, ObjectRocket আমাদের পাবলিক এবং প্রাইভেট পরিবেশের মাঝপথে একটি ওয়ে স্টেশন হিসেবে লগ অ্যাগ্রিগেশনের জন্য কাজ করে। অন্যান্য ব্যবহারের ক্ষেত্রে রিয়েল-টাইম অ্যানালিটিক্স অন্তর্ভুক্ত থাকতে পারে যা আপনি সংগ্রহ করছেন। আমাদের টিমের জন্য সবচেয়ে ভালো অংশ হলো আমাদের MongoDB ম্যানেজ করতে হচ্ছে না, ObjectRocket-এর विश्वস্ততা এবং দক্ষতার فضل থেকে।