यह पोस्ट हार्ट हूवर और रयान वॉकर द्वारा सह-लिखा गया था
हाल ही में, रैकस्पेस देवओप्स ऑटोमेशन टीम ने एक ऐसी सेवा की घोषणा की जो न्यू रेलिक से रैकस्पेस समर्थन के लिए अलर्ट भेजती है। ये अलर्ट हमारे DevOps इंजीनियर्स को जवाब देने के लिए टिकट जेनरेट करेंगे, ताकि सुबह 3 बजे अलर्ट जेनरेट होने पर हमारे ग्राहक अच्छी तरह सो सकें। हमारे ग्राहकों के परिवेश के बारे में एकत्र किए गए अन्य डेटा बिंदुओं के साथ संयुक्त होने पर, हमारे इंजीनियर यह पहचानेंगे कि समस्याएँ कहाँ हैं और फिर उचित कार्रवाई को अंजाम देंगे।
इस सेवा के लिए बुनियादी ढांचे को डिजाइन करते समय, हमें एक सामान्य, लेकिन दिलचस्प समस्या का सामना करना पड़ा, जिसमें हमें सुरक्षा के लिए रैकस्पेस आंतरिक प्रणालियों तक पहुंच सीमित करने की आवश्यकता थी, जबकि अभी भी एक सार्वजनिक समापन बिंदु बनाए रखा गया था जिससे न्यू रेलिक बात कर सकता था। हमारा समाधान सार्वजनिक एपीआई एंडपॉइंट और निजी कर्मचारियों के साथ एक दूसरे से पूरी तरह से अलग एक सेवा डिजाइन करना था। सार्वजनिक एपीआई एंडपॉइंट्स न्यू रेलिक से अलर्ट प्राप्त करते हैं और उन्हें एक कतार के रूप में कार्य करने वाले ऑब्जेक्टरॉकेट रेडिस इंस्टेंस में पास करते हैं। कार्यकर्ता सेवाएं रैककनेक्ट फ़ायरवॉल के पीछे आंतरिक रूप से चलती हैं और कतार से संदेश खींचती हैं और अलर्ट बनाती हैं।
यह वातावरण को बहुत अच्छी तरह से विभाजित करता है, लेकिन लॉग एकत्रीकरण के संबंध में हमारे लिए एक समस्या पैदा करता है। हम अपने निजी वातावरण में इलास्टिकसर्च/किबाना स्टैक चलाते हैं। फ़ायरवॉल के पीछे, हम लॉग को सीधे ElasticSearch पर पुश करने के लिए फ्लुएंटड का उपयोग करते हैं। फ़ायरवॉल के बाहर, EK स्टैक तक नहीं पहुँचा जा सकता है। इसे हल करने के लिए, हमने अपनी सार्वजनिक एपीआई सेवाओं से लॉग को ऑब्जेक्टरॉकेट मोंगोडीबी इंस्टेंस में पुश करने के लिए फ्लुएंटड का उपयोग करना शुरू कर दिया। आंतरिक रूप से, हम ऑब्जेक्टरॉकेट से लोचदार खोज में लॉग खींचने के लिए फिर से फ्लुएंट का उपयोग करते हैं। यह हमें हमारे पर्यावरण की सभी गतिविधियों के लिए एक ही गंतव्य देता है।
फ्लुएंटड क्या है?
Fluentd एक खुला स्रोत डेटा संग्राहक है जो डेटा को यथासंभव JSON के रूप में संरचित करने का प्रयास करता है। इसका मतलब है कि आपको एक समान प्रारूप में लॉगिंग डेटा प्राप्त करने के लिए स्क्रिप्ट का एक गुच्छा लिखने और बनाए रखने की आवश्यकता नहीं है। यह सब JSON है।
धाराप्रवाह की शक्ति कई स्रोतों और गंतव्यों के लिए इसके समर्थन में है। उदाहरण के लिए, आप ट्विटर स्ट्रीम से डेटा एकत्र कर सकते हैं और आईआरसी में आपको इसके बारे में सूचित कर सकते हैं। बहुत सारे सामुदायिक प्लगइन्स उपलब्ध हैं।
Docker के साथ Fluentd का उपयोग करना
MongoDB फ्लुएंट प्लगइन का उपयोग करके, कोई भी आसानी से ऑब्जेक्टरॉकेट में लॉग को पुश कर सकता है। सबसे पहले, स्रोतों को परिभाषित किया जाना चाहिए। चूंकि हमारी सभी सेवाएं डॉकर का उपयोग कर रही हैं, इसलिए हमें अपने कंटेनर लॉग को फ्लुएंट में लाना होगा। यहां एक महान पोस्ट है जो इसे डॉकर-जेन के साथ लॉग एकत्रीकरण को पूरा करने के तरीके को पूरा करती है और यहां जेसन वाइल्डर द्वारा धाराप्रवाह है। एक बार जब फ्लुएंट कंटेनर चल रहा हो (और डॉकर-जेन ने फ्लुएंट कॉन्फ़िगरेशन जेनरेट किया है), तो आपके पास प्रत्येक रनिंग कंटेनर के लिए इस तरह का एक सेक्शन होना चाहिए:
<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 का उपयोग करना
सार्वजनिक पक्ष पर, हम धाराप्रवाह बताते हैं कि "मैच" के साथ डेटा का क्या करना है। इस स्थिति में, वैरिएबल को उसी कॉन्फ़िगरेशन फ़ाइल में अपने ऑब्जेक्टरॉकेट डेटाबेस से वास्तविक जानकारी से बदलें:
<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>
फिर, हम अपने लॉग को ElasticSearch में धकेलने के लिए एक "मिलान" प्रदान करते हैं:
<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 को प्रबंधित करने की आवश्यकता नहीं है।