কাফকার সাথে ডেটা মডেলিং? বিষয় এবং পার্টিশন


168

নতুন পরিষেবা (যেমন কোনও আরডিবিএমএস ডেটা স্টোর বা কোনও বার্তার সারি) ব্যবহার করার সময় আমি প্রথমে যা চিন্তা করি তা হ'ল: "কীভাবে আমার ডেটা গঠন করা উচিত?"।

আমি কিছু প্রাথমিক উপকরণ পড়েছি এবং দেখেছি। বিশেষত, উদাহরণস্বরূপ, কাফকা: লগ প্রসেসিংয়ের জন্য বিতরণকারী মেসেজিং সিস্টেমটি নিন , যা লিখেছেন:

  • "একটি বিষয় হ'ল সেই বার্তাগুলি যা বার্তাগুলির সাথে জড়িত"
  • "সমান্তরালতার ক্ষুদ্রতম একক হ'ল একটি বিষয়ের বিভাজন This এটি বোঝাচ্ছে যে সমস্ত বার্তাগুলি ... যা কোনও বিষয়ের নির্দিষ্ট বিভাজনের সাথে সম্পর্কিত গ্রাহকরা গ্রাহক দলের গ্রাহক দ্বারা গ্রাস করবেন" "

এটি জানার পরে, একটি ভাল উদাহরণ কী হতে পারে যা বিষয় এবং পার্টিশনগুলি কীভাবে ব্যবহার করবেন তা বোঝায়? কোন বিষয় কখন হওয়া উচিত? কিছু যখন একটি পার্টিশন করা উচিত?

উদাহরণস্বরূপ, আসুন আমার (ক্লোজার) ডেটা দেখে মনে হচ্ছে:

{: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
বিষয় এবং পার্টিশন সম্পর্কে এই আলোচনাটি অদ্ভুত করুন তবে অগত্যা তাদের মধ্যে থাকা ডেটাগুলির বিবর্তন নয়। আপনি যদি সেই "ব্যবহারকারী দর্শন" ইভেন্টগুলিতে ব্যবহারকারী এজেন্ট বা শিরোনাম সংযুক্ত করতে চান? আপনি কীভাবে এই বিকাশ এবং যোগাযোগ করতে পারেন যাতে একচেটিয়াভাবে গ্রাহকরা ডাউনস্ট্রিম হন?
ওয়ানক্রিষ্টার

উত্তর:


136

কাফকার জন্য আপনার ডেটা কাঠামো করার সময় এটি কীভাবে গ্রাস করা হত তার উপর নির্ভর করে।

আমার মনে, একটি বিষয় হ'ল একই ধরণের বার্তাগুলির একটি গোষ্ঠী যা একই ধরণের গ্রাহক গ্রাস করবেন তাই উপরের উদাহরণে আমার কেবল একটি বিষয় হবে এবং যদি আপনি অন্য কোনও ধরণের ধাক্কা দেওয়ার সিদ্ধান্ত নেন কাফকার মাধ্যমে ডেটা, আপনি পরে এটির জন্য একটি নতুন বিষয় যুক্ত করতে পারেন।

বিষয়গুলি চিড়িয়াখানায় নিবন্ধিত হয়েছে যার অর্থ আপনি যদি খুব বেশি সংখ্যক যুক্ত করার চেষ্টা করেন তবে আপনি সমস্যার সমাধান করতে পারেন, উদাহরণস্বরূপ যেখানে আপনার মিলিয়ন ব্যবহারকারী রয়েছে এবং ব্যবহারকারী হিসাবে প্রতি বিষয় তৈরি করার সিদ্ধান্ত নিয়েছেন।

অন্যদিকে পার্টিশনগুলি বার্তাগুলির ব্যবহারের সাথে সামঞ্জস্য করার একটি উপায় এবং ব্রোকার ক্লাস্টারে পার্টিশনের মোট সংখ্যা বিভাজন বৈশিষ্ট্যটি অনুধাবন করার জন্য গ্রাহক দলের গ্রাহকের সংখ্যা কমপক্ষে একই হওয়া উচিত। একটি গ্রাহক গ্রুপের গ্রাহকরা পার্টিশন অনুযায়ী বিষয়টির প্রক্রিয়াকরণের বোঝাটিকে নিজেদের মধ্যে ভাগ করে দেবেন যাতে কোনও গ্রাহক কেবলমাত্র সেই বিভাগে থাকা বার্তাগুলির সাথেই উদ্বিগ্ন হবেন "অর্পণ করা হয়েছে"।

পার্টিশনটি হয় নির্মাতাদের পার্টিশন কী ব্যবহার করে স্পষ্টভাবে সেট করা যেতে পারে বা যদি সরবরাহ না করা হয় তবে প্রতিটি বার্তার জন্য একটি এলোমেলো পার্টিশন নির্বাচন করা হবে।


5
সুতরাং, বিষয়গুলি ব্যবহারকারী ব্যবহারকারীর আইডি প্রতি ডেটা পাওয়ার উপায় হিসাবে ব্যবহার করার পরিবর্তে চিড়িয়াখানার উপর চাপ দেওয়া, ব্যবহারকারী আইডি দ্বারা বিভাজন করা ভাল, এবং যদি ব্যবহারকারী আইডি ভিত্তিক গ্রাহকরা প্রতিটি পার্টিশনে সাবস্ক্রাইব করে থাকেন?
রবীন্দ্রনাথ আকিলা


4
@ রবীন্দ্রনাথ আকিলা 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

একবার আপনি কীভাবে আপনার ইভেন্ট স্ট্রিমটি বিভাজন করবেন তা জানার পরে বিষয়টির নামটি সহজ হবে, সুতরাং প্রথমে সেই প্রশ্নের উত্তর দেওয়া যাক।

@ লড সঠিক - আপনি যে পার্টিশন কাঠামোটি বেছে নিয়েছেন তা আপনি কীভাবে ইভেন্ট স্ট্রিমটি প্রক্রিয়া করতে চান তার উপর নির্ভর করে depend আদর্শভাবে আপনি একটি পার্টিশন কী চান যার অর্থ আপনার ইভেন্ট প্রক্রিয়াটি পার্টিশন-লোকাল

উদাহরণ স্বরূপ:

  1. যদি আপনি সাইটে ব্যবহারকারীদের গড় সময় বিবেচনা করে থাকেন তবে আপনার দ্বারা বিভাজন করা উচিত :user-id। এইভাবে, একক ব্যবহারকারীর সাইটের ক্রিয়াকলাপ সম্পর্কিত সমস্ত ইভেন্ট একই পার্টিশনের মধ্যে উপলব্ধ। এর অর্থ হ'ল অ্যাপাচি সামাজার মতো স্ট্রিম প্রসেসিং ইঞ্জিন কোনও একক পার্টিশনে ইভেন্টগুলি দেখে কোনও প্রদত্ত ব্যবহারকারীর জন্য গড়ে টাইম অন-সাইটে গণনা করতে পারে। এটি কোনও ধরণের ব্যয়বহুল পার্টিশন-গ্লোবাল প্রক্রিয়াজাতকরণ করা এড়ানো যায়
  2. আপনি যদি আপনার ওয়েবসাইটের সর্বাধিক জনপ্রিয় পৃষ্ঠাগুলি সম্পর্কে চিন্তা করেন তবে আপনার এই :viewedপৃষ্ঠাটি দ্বারা বিভাজন করা উচিত । আবার, সামজা কেবলমাত্র একটি বিভাগে ইভেন্টগুলি দেখে কোনও প্রদত্ত পৃষ্ঠাগুলির মতামত গণনা করতে সক্ষম হবে

সাধারণত, আমরা বৈশ্বিক রাষ্ট্রের উপর নির্ভর করা (যেমন ডায়নামোডিবি বা ক্যাসান্দ্রার মতো দূরবর্তী ডাটাবেসে গণনা রাখা) এড়াতে চাইছি এবং পরিবর্তে পার্টিশন-স্থানীয় রাষ্ট্র ব্যবহার করে কাজ করতে সক্ষম হব। এটি কারণ স্থানীয় রাষ্ট্র স্ট্রিম প্রসেসিংয়ে মৌলিক আদিম

যদি আপনার উপরের উভয় ব্যবহারের ক্ষেত্রে প্রয়োজন হয় তবে কাফকার সাথে একটি সাধারণ প্যাটার্ন হ'ল প্রথমে বলে পার্টিশন করা :user-idএবং তারপরে প্রক্রিয়াটির পরবর্তী ধাপের জন্য প্রস্তুত হয়ে পুনরায় বিভাজন করা :viewed

বিষয় নাম অন - একটি সুস্পষ্ট এখানে হবে eventsবা user-events। আরও সুনির্দিষ্ট হওয়ার জন্য আপনি events-by-user-idএবং / অথবা সাথে যেতে পারেন events-by-viewed


8
আমি উল্লেখগুলি দেখেছি যেখানে আপনি ইভেন্ট দুটি ইভেন্টে প্রকাশ করবেন: প্রতি শ্রমিক / উদ্দেশ্যে ব্যবহারের জন্য একটি। এই ক্ষেত্রে দুটি পৃথক বিভাজনমূলক স্কিম সহ দুটি বিষয় থাকতে পারে।
ফ্রাসোয়া Beausoleil

7

এটি প্রশ্নের সাথে একেবারেই সম্পর্কিত নয়, তবে আপনি যদি ইতিমধ্যে বিষয়গুলির উপর ভিত্তি করে রেকর্ডগুলির যৌক্তিক পৃথককরণের বিষয়ে সিদ্ধান্ত নিয়েছেন এবং কাফকার টপিক / পার্টিশন গণনাটি অনুকূল করতে চান তবে এই ব্লগটি কার্যকর হতে পারে।

সংক্ষেপে কী টেকওয়েস:

  • সাধারণভাবে, কাফকা ক্লাস্টারে যত বেশি পার্টিশন থাকে তত বেশি থ্রুপুট অর্জন করতে পারে। উত্পাদনের জন্য একক পার্টিশনে সর্বোচ্চ অর্জনযোগ্য হ'ল পি এবং গ্রাহক হ'ল সি । ধরা যাক আপনার টার্গেট থ্রুপুট টি । তারপরে আপনার কমপক্ষে সর্বোচ্চ ( টি / পি , টি / সি ) পার্টিশন থাকা দরকার।

  • কাফকার বর্তমানে প্রতিটি ব্রোকার সূচি এবং প্রতিটি লগ সেগমেন্টের ডেটা ফাইল উভয়ের ফাইল হ্যান্ডেল খুলবে। সুতরাং, তত বেশি পার্টিশন, তত বেশি যেটিকে অন্তর্নিহিত অপারেটিং সিস্টেমে ওপেন ফাইল হ্যান্ডেল সীমাটি কনফিগার করতে হবে। উদাহরণস্বরূপ, আমাদের উত্পাদন ব্যবস্থায় আমরা একবার ত্রুটি বলতে দেখেছি too many files are open, যখন আমাদের প্রায় 3600 বিষয় পার্টিশন রয়েছে।

  • যখন কোনও ব্রোকার অশুচিভাবে বন্ধ হয়ে যায় (যেমন, কিল -9), লক্ষ্য করা যায় না এমন উপলভ্যতা পার্টিশনের সংখ্যার সাথে সমানুপাতিক হতে পারে।

  • কাফকার শেষ-শেষের বিলম্বটিকে সেই সময় দ্বারা সংজ্ঞায়িত করা হয় যখন প্রযোজক যখন কোনও বার্তা গ্রাহক দ্বারা বার্তা পড়েন তখন প্রযোজক দ্বারা প্রকাশিত হয়। একটি চলতি নিয়ম, যদি আপনি লেটেন্সি যত্নশীল, তাহলে সম্ভবত 100 এক্স দালাল প্রতি পার্টিশন সংখ্যা সীমিত করতে একটি ভাল ধারণা এক্স , যেখানে একটি কাফকা ক্লাস্টারের মধ্যে দালাল সংখ্যা এবং R রেপ্লিকেশন ফ্যাক্টর।


4

আমি মনে করি বিষয়টির নাম এক ধরণের বার্তাগুলির সমাপ্তি এবং প্রযোজক সাবস্ক্রাইব বিষয়ের মাধ্যমে গ্রাহককে সাবস্ক্রাইব বার্তা প্রবন্ধটি প্রকাশ করে।

একটি বিষয়ের অনেকগুলি পার্টিশন থাকতে পারে। সমান্তরাল জন্য পার্টিশন ভাল। বিভাজনও প্রতিরূপের একক, সুতরাং কাফকায় নেতা ও অনুসারীকেও বলা যায় পার্টিশনের স্তরে। প্রকৃতপক্ষে একটি বিভাজন একটি আদেশযুক্ত সারি যা আদেশটি বার্তা আগত আদেশ arrived এবং বিষয়টি একটি সহজ কথায় এক বা একাধিক সারি দ্বারা রচিত। এটি আমাদের কাঠামোর মডেল করার জন্য দরকারী।

কাফকা লগডইন দ্বারা লগ সংগ্রহ এবং বিতরণের জন্য তৈরি করা হয়েছে। এই দৃশ্য উদাহরণ হিসাবে খুব ভাল।

আপনার ওয়েব বা অ্যাপ্লিকেশন ব্যবহারকারীর ইভেন্টগুলি আপনার ওয়েব সেভার দ্বারা লগইন করা যেতে পারে এবং তারপরে প্রযোজকের মাধ্যমে কাফকা ব্রোকারের কাছে প্রেরণ করা যায়। প্রযোজক হিসাবে, আপনি পার্টিশন পদ্ধতি নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ: ইভেন্টের ধরণ (বিভিন্ন বিভাগে আলাদা আলাদা ইভেন্ট সংরক্ষণ করা হয়) বা ইভেন্টের সময় (আপনার অ্যাপ্লিকেশন যুক্তি অনুসারে এক দিন আলাদা আলাদা পার্টিশন করা) বা ব্যবহারকারীর টাইপ বা কোনও লজিক নেই এবং সমস্ত লগের ভারসাম্য বজায় রাখা উচিত অনেক পার্টিশনের মধ্যে।

প্রশ্নে আপনার কেস সম্পর্কে, আপনি "পৃষ্ঠা-ভিউ-ইভেন্ট" নামক একটি বিষয় তৈরি করতে পারেন এবং সমস্ত পার্টিশনে লগগুলি সমানভাবে বিতরণের জন্য হ্যাশ কীগুলির মাধ্যমে এন পার্টিশন তৈরি করতে পারেন। অথবা আপনি আপনার আত্মার দ্বারা লগ বিতরণ করতে পার্টিশন যুক্তি যুক্ত করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.