काफ्का के साथ डेटा मॉडलिंग? विषय और विभाजन


168

एक नई सेवा (जैसे कि एक गैर-आरडीबीएमएस डेटा स्टोर या एक संदेश कतार) का उपयोग करते समय मैं जिन चीजों के बारे में सोचता हूं उनमें से एक है: "मुझे अपने डेटा की संरचना कैसे करनी चाहिए?"।

मैंने कुछ परिचयात्मक सामग्रियों को पढ़ा और देखा है। विशेष रूप से, उदाहरण के लिए, काफ्का: लॉग प्रोसेसिंग के लिए एक वितरित संदेश प्रणाली , जो लिखते हैं:

  • "एक विषय वह कंटेनर है जिसके साथ संदेश जुड़े हुए हैं"
  • "समानता की सबसे छोटी इकाई एक विषय का विभाजन है। इसका तात्पर्य यह है कि सभी संदेश ... जो किसी विषय के एक विशेष विभाजन से संबंधित हैं, उपभोक्ता समूह में उपभोक्ता द्वारा उपभोग किए जाएंगे।"

यह जानना, एक अच्छा उदाहरण क्या होगा जो दिखाता है कि विषयों और विभाजन का उपयोग कैसे करें? कुछ विषय कब होना चाहिए? विभाजन कब होना चाहिए?

उदाहरण के रूप में, मान लें कि मेरा (क्लीजुर) डेटा ऐसा दिखता है:

{:user-id 101 :viewed "/page1.html" :at #inst "2013-04-12T23:20:50.22Z"}
{:user-id 102 :viewed "/page2.html" :at #inst "2013-04-12T23:20:55.50Z"}

विषय पर आधारित होना चाहिए user-id? viewed? at? विभाजन के बारे में क्या?

मैं कैसे तय करूं?


3
अजीब बात है कि यह विषय और विभाजन के बारे में बात करता है, लेकिन जरूरी नहीं कि उनके भीतर डेटा का विकास हो। क्या होगा यदि आप उपयोगकर्ता एजेंटों या हेडर को उन "उपयोगकर्ता दृश्य" घटनाओं में संलग्न करना चाहते हैं? आप कैसे विकसित और संचार करते हैं जो एक तरह से उपभोक्ताओं को प्रभावित करता है?
OneCricketeer

जवाबों:


136

जब काफ्का के लिए आपके डेटा को संरचित किया जाता है, तो यह वास्तव में इस बात पर निर्भर करता है कि इसका उपभोग करने का क्या मतलब है।

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

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

दूसरी ओर विभाजन संदेशों की खपत को समानांतर बनाने का एक तरीका है और एक ब्रोकर क्लस्टर में विभाजन की कुल संख्या कम से कम एक उपभोक्ता समूह में उपभोक्ताओं की संख्या के बराबर होनी चाहिए ताकि विभाजन की सुविधा का एहसास हो सके। एक उपभोक्ता समूह में उपभोक्ता विभाजन के अनुसार अपने बीच के विषय को संसाधित करने का बोझ अलग कर देगा ताकि एक उपभोक्ता केवल विभाजन में संदेशों के साथ संबंधित होगा जो "असाइन किया गया" है।

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


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


4
@RavindranathAkila Kafka is designed to have of the order of few thousands of partitions roughly less than 10,000. And the main bottleneck is zookeeper. A better way to design such a system is to have fewer partitions and use keyed messages to distribute the data over a fixed set of partitions. मुझे लगता है कि आपने जो वर्णन किया है, उसके लिए यह सही उपकरण नहीं है - लेकिन अधिक, विषय "पेज व्यू इवेंट्स" होगा? और सभी पृष्ठ दृश्य उस "विषय" में होंगे। विभाजन समानता और प्रतिकृतियां और सामान के बारे में अधिक लगता है?
दिम्बिंस्की

धन्यवाद :) अंत में मेरे पास एक उत्तर है: पी
रविन्द्रनाथ अकीला

62

एक बार जब आप जानते हैं कि अपनी ईवेंट स्ट्रीम को कैसे विभाजित किया जाए, तो विषय का नाम आसान होगा, तो आइए पहले उस प्रश्न का उत्तर दें।

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

उदाहरण के लिए:

  1. यदि आप उपयोगकर्ताओं के औसत समय-साइट के बारे में परवाह करते हैं, तो आपको विभाजन करना चाहिए :user-id। इस तरह, एक ही उपयोगकर्ता की साइट गतिविधि से संबंधित सभी घटनाएँ एक ही विभाजन के भीतर उपलब्ध होंगी। इसका मतलब यह है कि एक अपाचे सामजा जैसे एक स्ट्रीम प्रोसेसिंग इंजन किसी दिए गए उपयोगकर्ता के लिए एक ही विभाजन में घटनाओं को देखकर औसत समय साइट की गणना कर सकता है। यह किसी भी प्रकार के महंगे विभाजन-वैश्विक प्रसंस्करण को करने से बचता है
  2. यदि आप अपनी वेबसाइट पर सबसे लोकप्रिय पृष्ठों की परवाह करते हैं, तो आपको :viewedपृष्ठ द्वारा विभाजन करना चाहिए । फिर से, समज़ा किसी एक विभाजन में होने वाली घटनाओं को देखते हुए किसी दिए गए पृष्ठ के विचारों की गणना कर सकेगा

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

यदि आपको उपरोक्त दोनों उपयोग के मामलों की आवश्यकता है, तो कफका के साथ एक सामान्य पैटर्न पहले विभाजन को कहना है :user-id, और फिर प्रसंस्करण के अगले चरण के लिए तैयार होकर फिर से विभाजन करना है :viewed

विषय के नाम पर - एक स्पष्ट यहाँ eventsया होगा user-events। अधिक विशिष्ट होने के लिए आप events-by-user-idऔर / या के साथ जा सकते हैं events-by-viewed


8
मैंने उन संदर्भों को देखा है जहां आप घटनाओं को दो विषयों में प्रकाशित करेंगे: एक प्रति कार्यकर्ता / इच्छित उपयोग। इस मामले में, दो अलग-अलग विभाजन योजनाओं के साथ दो विषय हो सकते हैं।
फ्रांस्वा ब्यूसोइल

7

यह वास्तव में सवाल से संबंधित नहीं है, लेकिन यदि आपने पहले से ही विषयों के आधार पर रिकॉर्ड के तार्किक अलगाव पर फैसला कर लिया है, और काफ्का में विषय / विभाजन गणना का अनुकूलन करना चाहते हैं, तो यह ब्लॉग काम आ सकता है।

संक्षेप में मुख्य takeaways:

  • सामान्य तौर पर, कफका क्लस्टर में जितने अधिक विभाजन होते हैं, उतना ही उच्चतर थ्रूपुट प्राप्त कर सकता है। उत्पादन हो के लिए एक एकल विभाजन पर प्राप्त भर अधिकतम चलो पी और खपत हो । चलो का कहना है कि अपने लक्ष्य प्रवाह क्षमता है टी । फिर आपको कम से कम अधिकतम ( टी / पी , टी / सी ) विभाजन करने की आवश्यकता है।

  • वर्तमान में, काफ्का में, प्रत्येक ब्रोकर इंडेक्स और हर लॉग सेगमेंट की डेटा फ़ाइल दोनों का एक फ़ाइल हैंडल खोलता है। इसलिए, अधिक विभाजन, अंतर्निहित ऑपरेटिंग सिस्टम में खुली फ़ाइल हैंडल सीमा को कॉन्फ़िगर करने के लिए जितना अधिक होगा। हमारी उत्पादन प्रणाली में, हमने एक बार एक त्रुटि कहते हुए देखा too many files are open, जबकि हमारे पास लगभग 3600 विषय विभाजन थे।

  • जब एक दलाल अशुद्ध रूप से बंद हो जाता है (उदाहरण के लिए, किल -9), तो देखा गया अनुपलब्धता विभाजन की संख्या के लिए आनुपातिक हो सकती है।

  • काफ्का में एंड-टू-एंड लेटेंसी को उस समय से परिभाषित किया जाता है, जब निर्माता द्वारा संदेश को उपभोक्ता द्वारा संदेश पढ़े जाने पर प्रकाशित किया जाता है। अंगूठे के एक नियम के रूप में, यदि आप विलंबता के बारे में परवाह करते हैं, तो संभवतः ब्रोकर की प्रति विभाजन की संख्या को 100 x b x r तक सीमित करना एक अच्छा विचार है , जहां b एक काफ्का क्लस्टर में दलालों की संख्या है और r प्रतिकृति कारक है।


4

मुझे लगता है कि विषय का नाम एक तरह के संदेशों का निष्कर्ष है, और निर्माता विषय के लिए संदेश प्रकाशित करते हैं और सदस्यता विषय के माध्यम से उपभोक्ता सदस्यता संदेश।

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

कफका लॉग एकत्रीकरण और वितरण के लिए लिंक्डइन द्वारा विकसित किया गया है। यह दृश्य एक उदाहरण के रूप में बहुत अच्छा है।

आपके वेब या ऐप पर उपयोगकर्ता की घटनाओं को आपके वेब से लॉग इन किया जा सकता है और फिर निर्माता के माध्यम से काफ्का दलाल को भेजा जा सकता है। निर्माता में, आप विभाजन विधि को निर्दिष्ट कर सकते हैं, उदाहरण के लिए: इवेंट प्रकार (अलग-अलग ईवेंट को अलग-अलग पार्टीशन में सहेजा जाता है) या ईवेंट टाइम (अपने ऐप लॉजिक के अनुसार अलग-अलग अवधि में एक दिन में विभाजन) या उपयोगकर्ता प्रकार या सिर्फ कोई तर्क नहीं और सभी लॉग को संतुलित करें कई विभाजन में।

प्रश्न में आपके मामले के बारे में, आप "पृष्ठ-दृश्य-घटना" नामक एक विषय बना सकते हैं, और समान रूप से सभी विभाजनों में लॉग वितरित करने के लिए हैश कुंजी के माध्यम से एन विभाजन बना सकते हैं। या आप अपनी आत्मा द्वारा लॉग वितरण करने के लिए एक विभाजन तर्क चुन सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.