यह पोस्ट Hart Hoover और Ryan Walker द्वारा सह-लिखित है
हाल ही में, Rackspace DevOps ऑटोमेशन टीम ने एक सेवा की घोषणा की जो New Relic से Rackspace सपोर्ट को अलर्ट भेजती है। ये अलर्ट हमारे DevOps इंजीनियरों के जवाब देने के लिए टिकट जनरेट करेंगे, ताकि हमारे ग्राहक 3 बजे अलर्ट जनरेट होने पर चैन की नींद सो सकें। जब हमारे ग्राहकों के वातावरण के बारे में एकत्र किए गए अन्य डेटा बिंदुओं के साथ जोड़ा जाता है, तो हमारे इंजीनियर पहचानेंगे कि समस्याएं कहां हैं और फिर उचित कार्रवाई करेंगे।
इस सेवा के लिए बुनियादी ढांचे को डिजाइन करते समय, हमें एक सामान्य, लेकिन दिलचस्प समस्या का सामना करना पड़ा: हमें सुरक्षा के लिए Rackspace आंतरिक सिस्टम तक पहुंच सीमित करने की आवश्यकता थी, जबकि अभी भी एक पब्लिक एंडपॉइंट बनाए रखना था जिससे New Relic बात कर सके। हमारा समाधान पब्लिक API एंडपॉइंट्स और प्राइवेट वर्कर्स के साथ एक सेवा डिजाइन करना था जो एक-दूसरे से पूरी तरह से अलग हों। पब्लिक API एंडपॉइंट्स New Relic से अलर्ट प्राप्त करते हैं और उन्हें ObjectRocket Redis इंस्टेंस को कतार के रूप में कार्य करने के लिए पास करते हैं। वर्कर सेवाएं RackConnect फायरवॉल के पीछे आंतरिक रूप से चलती हैं और कतार से संदेश खींचती हैं और अलर्ट बनाती हैं।
यह वातावरण को बहुत अच्छी तरह से विभाजित करता है, लेकिन लॉग एग्रीगेशन के संबंध में हमारे लिए एक समस्या पैदा करता है। हम अपने प्राइवेट वातावरण के अंदर एक ElasticSearch/Kibana स्टैक चलाते हैं। फायरवॉल के पीछे, हम लॉग को सीधे ElasticSearch में पुश करने के लिए fluentd का उपयोग करते हैं। फायरवॉल के बाहर, EK स्टैक तक नहीं पहुंचा जा सकता। इसे हल करने के लिए, हमने अपने पब्लिक API सेवाओं से ObjectRocket MongoDB इंस्टेंस में लॉग पुश करने के लिए fluentd का उपयोग करना शुरू किया। आंतरिक रूप से, हम ElasticSearch में ObjectRocket से लॉग खींचने के लिए फिर से fluentd का उपयोग करते हैं। यह हमारे वातावरण की सभी गतिविधियों के लिए एक सिंगल डेस्टिनेशन देता है।
Fluentd क्या है?
Fluentd एक ओपन सोर्स डेटा कलेक्टर है जो जितना संभव हो उतना डेटा को JSON के रूप में संरचित करने का प्रयास करता है। इसका मतलब है कि आपको लॉगिंग डेटा को समान प्रारूप में प्राप्त करने के लिए स्क्रिप्ट लिखने और बनाए रखने की आवश्यकता नहीं है। यह सब JSON है।
Fluentd की शक्ति इसके कई स्रोतों और गंतव्यों के समर्थन में है। उदाहरण के लिए, आप ट्विटर स्ट्रीम से डेटा एकत्र कर सकते हैं और IRC में इसके बारे में सूचित कर सकते हैं। टन कम्युनिटी प्लगइन्स उपलब्ध हैं।
Docker के साथ Fluentd का उपयोग करना
MongoDB fluentd प्लगइन का उपयोग करके, कोई भी आसानी से ObjectRocket में लॉग पुश कर सकता है। पहले, स्रोतों को परिभाषित किया जाना चाहिए। चूंकि हमारी सभी सेवाएं Docker का उपयोग कर रही हैं, हमें अपने कंटेनर लॉग को fluentd में प्राप्त करना होगा। Jason Wilder द्वारा docker-gen और 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 का उपयोग करना
पब्लिक साइड पर, हम 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 **> 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 प्लगइन का भी उपयोग कर रहे हैं जो कई वातावरणों में हमारे टैगिंग कॉन्फिगरेशन को सरल बनाता है।
Fluentd कई होस्ट पर अपने Docker लॉग को एग्रीगेट करने और उन्हें MongoDB डेटाबेस में पुश करने का एक शानदार तरीका है। हमारे मामले में, ObjectRocket हमारे पब्लिक और प्राइवेट वातावरण के लिए लॉग एग्रीगेशन के बीच एक वे स्टेशन है। अन्य उपयोग के मामलों में आपके द्वारा एकत्र किए जा रहे डेटा पर रीयल-टाइम एनालिटिक्स शामिल हो सकते हैं। हमारी टीम के लिए सबसे अच्छी बात यह है कि हमें MongoDB मैनेज नहीं करना पड़ता, ObjectRocket की विश्वसनीयता और ज्ञान के लिए धन्यवाद।