Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

एक PHP अनुप्रयोग से पृष्ठ अनुरोध डेटा लॉग करने का स्केलेबल तरीका?

यह निश्चित रूप से विभिन्न तरीकों से करने योग्य है। मैं प्रत्येक सूचीबद्ध विकल्प के साथ-साथ कुछ अतिरिक्त टिप्पणियों को संबोधित करूंगा।

1) अगर NGinx कर सकता है, तो उसे करने दें। मैं इसे अपाचे के साथ-साथ जेबीओएसएस और टॉमकैट के साथ करता हूं। मैं फिर उन्हें केंद्रीय रूप से एकत्र करने और वहां से संसाधित करने के लिए syslog-ng का उपयोग करता हूं। इस मार्ग के लिए मैं एक सीमित लॉग संदेश प्रारूप का सुझाव दूंगा जैसे कि टैब से अलग किया गया क्योंकि यह पार्स और पढ़ना आसान बनाता है। मैं इसके बारे में PHP चर लॉगिंग के बारे में नहीं जानता, लेकिन यह निश्चित रूप से शीर्षलेख और कुकी जानकारी लॉग कर सकता है। यदि आप एनजीआईएनएक्स लॉगिंग का बिल्कुल भी उपयोग करने जा रहे हैं, तो यदि संभव हो तो मैं इस मार्ग की सिफारिश करूंगा - दो बार लॉग क्यों करें?

2) "बाद की तारीख को क्वेरी करने की क्षमता की कमी" नहीं है, और नीचे।

3) यह एक विकल्प है लेकिन यह उपयोगी है या नहीं यह इस बात पर निर्भर करता है कि आप कितने समय तक डेटा रखना चाहते हैं और आप कितना क्लीनअप लिखना चाहते हैं। अधिक नीचे।

4) MongoDB निश्चित रूप से काम कर सकता है। आपको क्वेश्चन लिखने होंगे, और वे साधारण SQL कमांड नहीं हैं।

अब, डेटा को रेडिस में संग्रहीत करने के लिए। मैं वर्तमान में नोट किए गए syslog-ng के साथ चीजों को लॉग करता हूं और डेटा को पार्स करने और इसे रेडिस में भरने के लिए प्रोग्राम गंतव्य का उपयोग करता हूं। मेरे मामले में मेरे पास कई समूह मानदंड हैं जैसे कि vhost और क्लस्टर द्वारा, इसलिए मेरी संरचनाएं थोड़ी भिन्न हो सकती हैं। आपको पहले जिस प्रश्न को संबोधित करने की आवश्यकता है वह है "मुझे इस डेटा से कौन सा डेटा चाहिए"? इसमें से कुछ काउंटर होंगे जैसे ट्रैफिक रेट। इसमें से कुछ समुच्चय होंगे, और अभी भी "मेरे पृष्ठों को लोकप्रियता के आधार पर क्रमित करें" जैसी चीजें होंगी।

मैं इसे आसानी से रेडिस (और इस तरह वापस बाहर) में लाने के लिए कुछ तकनीकों का प्रदर्शन करूँगा।

सबसे पहले, आइए समय के साथ यातायात के आंकड़ों पर विचार करें। पहले ग्रैन्युलैरिटी पर फैसला करें। क्या आप प्रति-मिनट के आँकड़े चाहते हैं या प्रति-घंटे के आँकड़े पर्याप्त होंगे? किसी दिए गए URL के ट्रैफ़िक को ट्रैक करने का एक तरीका यहां दिया गया है:

इस सॉर्ट किए गए सेट में "ट्रैफ़िक-बाय-यूआरएल:URL:YYYY-MM-DD" कुंजी का उपयोग करके डेटा को सॉर्ट किए गए सेट में स्टोर करें, आप ज़िन्क्रबी कमांड का उपयोग करेंगे और सदस्य "एचएच:एमएम" की आपूर्ति करेंगे। उदाहरण के लिए पायथन में जहां "r' आपका रेडिस कनेक्शन है:

r.zincrby("traffic-by-url:/foo.html:2011-05-18", "01:04",1)

यह उदाहरण 18 मई को सुबह 1:04 बजे url "/foo.html" के लिए काउंटर को बढ़ाता है।

किसी विशिष्ट दिन के लिए डेटा पुनर्प्राप्त करने के लिए, आप कम से कम लोकप्रिय से सबसे लोकप्रिय तक क्रमबद्ध सेट प्राप्त करने के लिए कुंजी (""ट्रैफिक-बाय-यूआरएल:यूआरएल:वाई वाई वाई वाई-एमएम-डीडी") पर zrange को कॉल कर सकते हैं। शीर्ष 10 प्राप्त करने के लिए , उदाहरण के लिए, आप zrevrange का उपयोग करेंगे और इसे रेंज देंगे। Zrevrange एक रिवर्स सॉर्ट देता है, सबसे हिट सबसे ऊपर होगा। कई और सॉर्ट किए गए सेट कमांड उपलब्ध हैं जो आपको पेजिनेशन जैसे अच्छे प्रश्न करने की अनुमति देते हैं, एक प्राप्त करें न्यूनतम स्कोर आदि के आधार पर परिणामों की श्रेणी..

आप विभिन्न अस्थायी विंडो को संभालने के लिए बस अपना मुख्य नाम बदल या बढ़ा सकते हैं। इसे ज़ूनियनस्टोर के साथ जोड़कर आप स्वचालित रूप से कम बारीक समय अवधि के लिए रोल-अप कर सकते हैं। उदाहरण के लिए आप एक सप्ताह या महीने में सभी चाबियों का एक संघ कर सकते हैं और "ट्रैफिक-बाय-यूआरएल:मासिक:यूआरएल:वाई वाई वाई-एमएम" जैसी नई कुंजी में स्टोर कर सकते हैं। किसी दिए गए दिन में सभी URL पर उपरोक्त करके आप दैनिक प्राप्त कर सकते हैं। बेशक, आपके पास दैनिक कुल ट्रैफ़िक कुंजी और वृद्धि भी हो सकती है। यह ज्यादातर इस बात पर निर्भर करता है कि आप डेटा को कब इनपुट करना चाहते हैं - लॉगफाइल आयात के माध्यम से ऑफ़लाइन या उपयोगकर्ता अनुभव के हिस्से के रूप में।

मैं वास्तविक उपयोगकर्ता सत्र के दौरान बहुत कुछ करने के खिलाफ अनुशंसा करता हूं क्योंकि यह आपके उपयोगकर्ताओं को इसका अनुभव करने में लगने वाले समय को बढ़ाता है (और सर्वर लोड)। अंतत:यह कॉल ट्रैफिक के स्तर और संसाधनों पर आधारित होगी।

जैसा कि आप कल्पना कर सकते हैं कि उपरोक्त भंडारण योजना किसी भी काउंटर आधारित स्टेट पर लागू की जा सकती है जिसे आप चाहते हैं या निर्धारित करते हैं। उदाहरण के लिए URL को userID में बदलें और आपके पास प्रति-उपयोगकर्ता ट्रैकिंग है।

आप रेडिस में कच्चे लॉग भी स्टोर कर सकते हैं। मैं इसे JSON स्ट्रिंग्स के रूप में संग्रहीत कुछ लॉग के लिए करता हूं (मेरे पास उन्हें कुंजी-मूल्य जोड़े के रूप में है)। फिर मेरे पास दूसरी प्रक्रिया है जो उन्हें बाहर खींचती है और डेटा के साथ काम करती है।

कच्चे हिट को संग्रहीत करने के लिए आप युग समय का उपयोग रैंक के रूप में एक क्रमबद्ध सेट का भी उपयोग कर सकते हैं और आसानी से zrange/zrevrange कमांड का उपयोग करके एक अस्थायी विंडो को पकड़ सकते हैं। या उन्हें एक कुंजी में स्टोर करें जो यूजर आईडी पर आधारित हो। सेट इसके लिए काम करेंगे, जैसे कि सॉर्ट किए गए सेट।

एक अन्य विकल्प जिसकी मैंने चर्चा नहीं की है, लेकिन आपके कुछ डेटा उपयोगी हो सकते हैं, वह हैश के रूप में संग्रहीत करना। उदाहरण के लिए किसी दिए गए सत्र के बारे में विस्तृत जानकारी संग्रहीत करने के लिए यह उपयोगी हो सकता है।

यदि आप वास्तव में डेटाबेस में डेटा चाहते हैं, तो रेडिस की पब/सब सुविधा का उपयोग करने का प्रयास करें और एक ग्राहक है जो इसे एक सीमित प्रारूप में पार्स करता है और फ़ाइल में डंप करता है। फिर एक आयात प्रक्रिया है जो थोक में आयात करने के लिए कॉपी कमांड (या आपके डीबी के बराबर) का उपयोग करती है। आपका DB आपको धन्यवाद देगा।

यहां अंतिम सलाह (मैंने शायद पहले ही पर्याप्त मानसिक समय ले लिया है) समय सीमा समाप्त आदेश का विवेकपूर्ण और उदार उपयोग करना है। Redis 2.2 या नए का उपयोग करके आप काउंटर कुंजियों पर भी समाप्ति सेट कर सकते हैं। यहां बड़ा फायदा स्वचालित डेटा सफाई है। कल्पना कीजिए कि आप एक योजना का पालन करते हैं जैसे मैंने ऊपर उल्लिखित किया है। समाप्ति आदेशों का उपयोग करके आप पुराने डेटा को स्वचालित रूप से शुद्ध कर सकते हैं। शायद आप 3 महीने तक के लिए प्रति घंटा आँकड़े चाहते हैं, उसके बाद केवल दैनिक आँकड़े; 6 महीने के लिए दैनिक आँकड़े तो केवल मासिक आँकड़े। तीन महीने (86400*90) के बाद बस अपनी प्रति घंटा कुंजियों को समाप्त करें, आपका दैनिक 6 (86400*180) पर और आपको सफाई करने की आवश्यकता नहीं होगी।

जियोटैगिंग के लिए मैं आईपी की ऑफलाइन प्रोसेसिंग करता हूं। इस प्रमुख संरचना के साथ एक क्रमबद्ध सेट की कल्पना करें:"ट्रैफ़िक-बाय-आईपी:YYYY-MM-DD" आईपी को तत्व के रूप में उपयोग करते हुए और ऊपर बताए गए ज़िन्क्रीबी कमांड का उपयोग करके आपको प्रति-आईपी ट्रैफ़िक डेटा मिलता है। अब, अपनी रिपोर्ट में, आप क्रमबद्ध सेट प्राप्त कर सकते हैं और आईपी का लुकअप कर सकते हैं। रिपोर्ट करते समय ट्रैफ़िक बचाने के लिए, आप रेडिस में एक हैश सेट कर सकते हैं जो आईपी को आपके इच्छित स्थान पर मैप करता है। उदाहरण के लिए "जियो:कंट्री" कुंजी के रूप में और आईपी हैश सदस्य के रूप में देश कोड के साथ संग्रहीत मूल्य के रूप में।

एक बड़ी चेतावनी जो मैं जोड़ूंगा वह यह है कि यदि आपका ट्रैफ़िक स्तर बहुत अधिक है तो आप रेडिस के दो उदाहरण (या ट्रैफ़िक के आधार पर अधिक) चलाना चाह सकते हैं। पहला लेखन उदाहरण होगा, इसमें bgsave विकल्प सक्षम नहीं होगा। यदि आपका ट्रैफ़िक बहुत अधिक है तो आप हमेशा एक bgsave करते रहेंगे। यही वह है जिसके लिए मैं दूसरे उदाहरण की अनुशंसा करता हूं। यह पहले का गुलाम है और यह डिस्क पर सेव करता है। आप लोड वितरित करने के लिए दास के विरुद्ध अपने प्रश्न भी चला सकते हैं।

मुझे आशा है कि यह आपको कुछ विचार और कोशिश करने के लिए चीजें देता है। यह देखने के लिए कि आपकी विशिष्ट आवश्यकताओं के लिए सबसे अच्छा क्या काम करता है, विभिन्न विकल्पों के साथ खेलें। मैं रेडिस में एक उच्च यातायात वेबसाइट (और एमटीए लॉग आंकड़े) पर बहुत सारे आंकड़े ट्रैक कर रहा हूं और यह खूबसूरती से प्रदर्शन करता है - Django और Google के विज़ुअलाइजेशन एपीआई के साथ संयुक्त मुझे बहुत अच्छे दिखने वाले ग्राफ मिलते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. अजगर 3.5 . में json.loads और Redis

  2. क्या डेटा संरचनाओं पर रेडिस ऑपरेशन थ्रेड सुरक्षित हैं

  3. क्या सर्विसस्टैक आरईएसटी एपीआई पर रेडिस के लिए यह एक अच्छा उपयोग-मामला है?

  4. पैटर्न से मेल खाने वाली चाबियों की संख्या कैसे गिनें?

  5. रेडिस + एक्शनकंट्रोलर ::लाइव थ्रेड मर नहीं रहे हैं