2010-02-04 31 views
7

के लिए अनुशंसित दस्तावेज़ संरचना हम वर्तमान में उपयोग निगरानी अनुप्रयोग के लिए पोस्टग्रेस से कोच डीबी में परिवर्तन पर विचार कर रहे हैं। कुछ संख्या:CouchDB

लगभग 2000 कनेक्शन, प्रति दिन लगभग 600,000 नई पंक्तियों के लिए, हर 5 मिनट में मतदान किया जाता है।

t_usage {service_id, टाइमस्टैम्प, data_in, data_out}
t_usage_20100101 t_usage विरासत: Postgres में, हम इस डेटा, दिन-ब-विभाजित की दुकान।
t_usage_20100102 t_usage विरासत में आता है। आदि

हम एक आशावादी संग्रहित प्रो के साथ डेटा लिखते हैं जो विभाजन को मानता है और आवश्यक होने पर इसे बनाता है। हम बहुत जल्दी सम्मिलित कर सकते हैं।

डेटा, हमारे उपयोग के मामलों, महत्व और वर्तमान प्रदर्शन के क्रम में की पढ़ने के लिए कर रहे हैं:
* एकल सेवा, एकल दिवस उपयोग: अच्छा प्रदर्शन
* एकाधिक सेवा, महीना उपयोग: गरीब प्रदर्शन
* सिंगल सेवा, महीना उपयोग: गरीब प्रदर्शन
* कई सेवाओं, एकाधिक महीने: बहुत गरीब प्रदर्शन
* कई सेवाओं, एकल दिन: अच्छा प्रदर्शन

यह समझ में आता है क्योंकि विभाजन जो अब तक है, दिनों के लिए अनुकूलित कर रहे हैं हमारे सबसे अधिक imp ऑर्टेंट उपयोग केस। हालांकि, हम माध्यमिक आवश्यकताओं में सुधार के तरीकों को देख रहे हैं।

हमें अक्सर घंटे के साथ क्वेरी को पैरामीटर करने की आवश्यकता होती है, उदाहरण के लिए, केवल 8am और 6pm के बीच परिणाम देना, इसलिए सारांश तालिका सीमित उपयोग के हैं। (ये पैरामीटर पर्याप्त आवृत्ति के साथ बदलते हैं जो डेटा की कई सारांश सारणी बनाते हैं)।

उस पृष्ठभूमि के साथ, पहला सवाल यह है: क्या इस डेटा के लिए कॉच डीबी उपयुक्त है? यदि ऐसा है, तो उपरोक्त उपयोग के मामलों को देखते हुए, आप कोचडीबी दस्तावेजों में डेटा का सबसे अच्छा मॉडल कैसे मॉडल करेंगे? कुछ विकल्प मैं एक साथ रख दिया अब तक है, जो हम बेंच मार्किंग की प्रक्रिया में हैं (_ id, _rev छोड़कर) कर रहे हैं:

एक प्रति दिन प्रति कनेक्शन

{ 
    service_id:555 
    day:20100101 
    usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}} 
} 

लगभग 60,000 नए दस्तावेज़ों के एक महीने दस्तावेज़। नए दस्तावेज़ों के बजाय, अधिकांश नए डेटा मौजूदा दस्तावेजों के अपडेट होंगे।

(यहां, उपयोग की वस्तुओं को मतदान के टाइमस्टैम्प पर रखा जाता है, और बाइट्स और बाईस के मूल्यों को महत्व दिया जाता है)। प्रति माह प्रति कनेक्शन

{ 
    service_id:555 
    month:201001 
    usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}} 
} 

लगभग 2,000 नए दस्तावेज़ों के एक महीने

एक दस्तावेज़। मौजूदा दस्तावेजों के लिए आवश्यक अद्यतन। प्रति डाटा की पंक्ति

एक दस्तावेज़ एक महीने

{ 
    service_id:555 
    timestamp:1265248762 
    in:584 
    out:11342 
} 
{ 
    service_id:555 
    timestamp:1265249062 
    in:94 
    out:1242 
} 

लगभग 15,000,000 नए दस्तावेज़ों एकत्र। सभी डेटा एक नए दस्तावेज़ में एक डालने होगा। तेज़ आवेषण, लेकिन मेरे पास प्रश्न हैं कि यह एक वर्ष या 2 वर्षों के बाद लाखों दस्तावेजों के साथ कितना कुशल होगा। फ़ाइल IO निषिद्ध प्रतीत होता है (हालांकि मैं स्वीकार करने वाला पहला हूं कि मैं इसके मैकेनिक्स को पूरी तरह से समझ नहीं पा रहा हूं)।

मैं इसे दस्तावेज़-उन्मुख तरीके से संपर्क करने की कोशिश कर रहा हूं, हालांकि आरडीएमएस आदत को तोड़ना मुश्किल है :) तथ्य यह है कि आप केवल न्यूनतम रूप से पैरामीटर विचार कर सकते हैं और साथ ही मुझे थोड़ा चिंतित भी है। उस ने कहा, उपरोक्त में से कौन सा सबसे उपयुक्त होगा? क्या ऐसे अन्य प्रारूप हैं जिन्हें मैंने नहीं माना है जो बेहतर प्रदर्शन करेंगे?

अग्रिम धन्यवाद,

जेमी।

उत्तर

10

मुझे नहीं लगता कि यह एक भयानक विचार है।

चलिए आपके कनेक्शन/माह परिदृश्य पर विचार करें।

यह देखते हुए कि एक प्रविष्टि ~ 40 (वह उदार है) वर्ण लंबे हैं, और आपको प्रति माह ~ 8,200 प्रविष्टियां मिलती हैं, तो आपका अंतिम दस्तावेज़ आकार महीने के अंत में ~ 350K लंबा होगा।

इसका मतलब है, पूर्ण बोर जा रहा है, आप हर 5 मिनट में 2000 350 के दस्तावेज़ पढ़ और लिख रहे हैं।

I/O बुद्धिमान, यह 5 एमबी/एस से कम है, पढ़ने और लिखने पर विचार, समय की 5 मीटर खिड़की के लिए औसत। यह आज भी कम अंत हार्डवेयर के भीतर अच्छी तरह से है।

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

अंतिम चिंता डेटाबेस के साथ रह रही है। यह महीने के अंत में हर 5 मिनट में 700 एमबी लिखेंगे। सोफे आर्किटेक्चर (केवल संलग्न करें) के साथ, आप हर 5 मिनट में 700 एमबी डेटा लिखेंगे, जो प्रति घंटे 8.1 जीबी और 24 घंटे के बाद 201 जीबी होगा।

डीबी संपीड़न के बाद, यह 700 एमबी (एक महीने के लिए) तक गिर जाता है, लेकिन उस प्रक्रिया के दौरान, वह फ़ाइल बड़ी हो रही है, और काफी जल्दी हो जाएगी।

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

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

हर तरह से हमारे हार्डवेयर पर अपने परीक्षण चलाएं, लेकिन इन सभी विचारों को दिल में लें।

संपादित करें:

अधिक प्रयोगों के बाद ...

दिलचस्प टिप्पणियों के युगल।

बड़े दस्तावेज़ों के आयात के दौरान सीपीयू I/O गति के लिए समान रूप से महत्वपूर्ण है। यह जेएसओएन को विचारों के उपयोग के लिए आंतरिक मॉडल में परिवर्तित करके मार्शलिंग और सीपीयू की खपत की वजह से है। बड़े (350 के) दस्तावेज़ों का उपयोग करके, मेरे सीपीयू काफी अधिक (350%) थे। इसके विपरीत, छोटे दस्तावेजों के साथ, वे 200% पर हमला कर रहे थे, भले ही, कुल मिलाकर, यह वही जानकारी थी, जो अलग-अलग हो गईं।

350 के दस्तावेज़ों के दौरान I/O के लिए, मैं 11 एमबी/सेकेंड के बीच था, लेकिन छोटे दस्तावेज़ों के साथ, यह केवल 8 एमबी/सेकंड था।

कॉम्पैक्शन लगभग I/O बाध्य दिखाई दिया। मेरे आई/ओ क्षमता पर अच्छी संख्या प्राप्त करना मेरे लिए मुश्किल है। एक कैश की गई फ़ाइल की एक प्रति 40 + एमबी/सेकंड धक्का देती है। कॉम्पैक्शन लगभग 8 एमबी/सेकेंड पर चला। लेकिन यह कच्चे भार के साथ संगत है (माना जाता है कि सोफे संदेश द्वारा सामान संदेश ले जा रहा है)। सीपीयू कम है, क्योंकि यह कम प्रसंस्करण कर रहा है (यह जेएसओएन पेलोड्स की व्याख्या नहीं कर रहा है, या विचारों का पुनर्निर्माण नहीं कर रहा है), साथ ही यह एक सीपीयू काम कर रहा था।

अंत में, पढ़ने के लिए, मैंने पूरे डेटाबेस को डंप करने का प्रयास किया। इसके लिए एक एकल सीपीयू लगाया गया था, और मेरा I/O बहुत कम था। मैंने यह सुनिश्चित करने के लिए एक बिंदु बना दिया कि कॉच डीबी फ़ाइल वास्तव में कैश नहीं की गई थी, मेरी मशीन में बहुत मेमोरी है, इसलिए बहुत सी चीजें कैश की जाती हैं। _all_docs के माध्यम से कच्चा डंप केवल 1 एमबी/सेकंड था। यह लगभग सभी की तुलना में लगभग सभी तलाश और घूर्णन देरी है। जब मैंने बड़े दस्तावेजों के साथ ऐसा किया, तो आई/ओ 3 एमबी/सेकंड मार रहा था, जो सिर्फ स्ट्रीमिंग प्रभाव को दिखाता है, मैंने बड़े दस्तावेजों के लिए लाभ का उल्लेख किया है।

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

अंत में, अंतिम प्रदर्शन उतना महत्वपूर्ण नहीं है जितना कि आपके हार्डवेयर के साथ एप्लिकेशन के लिए पर्याप्त प्रदर्शन करना उतना ही महत्वपूर्ण नहीं है। जैसा कि आपने बताया है, आप कर रहे हैं कि आप स्वयं परीक्षण कर रहे हैं, और यह सब वास्तव में मायने रखता है।

+0

कॉच डीबी दृश्य सर्वर को दृश्य को संसाधित करने के लिए कई सिस्टम प्रक्रियाएं लॉन्च करेगा, इसलिए यह कई कोरों में ठीक है। बाकी कॉच डीबी एरलांग में है और कई कोरों का उपयोग करने में भी बढ़िया है। – mikeal

+0

आप सही हैं। मैंने एक परीक्षण चलाया, और मैं इन बड़े दस्तावेजों में से 2000 (20 प्रक्रियाओं को एक साथ 100, एक साथ) एक v0.9 सोफे उदाहरण में डालता हूं। 4 कोर 2.66 जी मैक प्रो पर, इन्हें मूल रूप से 3m30s में डाला गया था। सोफे ने 350% सीपीयू लिया। अंत में डिस्क फ़ाइल ~ 2 जी थी। कॉम्पैक्शन के बाद भी, यह शायद ही कभी बदल गया। इसके विपरीत, 2000 "एकल दिन" दस्तावेजों को डालने में ~ 18s लगे। ज़ाहिर है, बहुत तेज़। 3 एम 30 एस उनके पास 5 मीटर खिड़की के बहुत करीब है। 18 एस बहुत बेहतर है। हालांकि कॉम्पैक्टिंग ने लगभग 3 मीटर लिया। –

+0

इसके लिए बहुत बहुत धन्यवाद, यह शुरू करने के लिए एक शानदार जगह है। हमने कुछ मानक चलाए हैं और आपके जैसा ही पाया है। हमारे पास जो मुख्य मुद्दा होगा, वह डेटा के निरंतर अपडेट है - ऐसा लगता है कि यह "पूरे महीने" दस्तावेज़ों के लिए निषिद्ध रूप से धीमा हो जाएगा। जब तक हम नियमित रूप से कॉम्पैक्ट कर सकते हैं, उम्मीद है कि हम ठीक रहेगा। यह शर्म की बात है कि हम डेटा प्रति डेटा के लिए नहीं जा सकते हैं, लेकिन जैसा कि आपको संदेह है कि फ़ाइल IO निषिद्ध लगता है। दुर्भाग्यवश किसी अन्य प्रकार के दस्तावेज़ को अपडेट करने के लिए, हमें लिखने से पहले पढ़ने की जरूरत है, _rev ... – majelbstoat