ক্রম সংখ্যা বিতরণ বিতরণ?


103

আমি সাধারণত অতীতে ডাটাবেস সিকোয়েন্স ব্যবহার করে সিকোয়েন্স নম্বর প্রজন্ম প্রয়োগ করেছি ।

যেমন পোস্টগ্রিস সিরিয়াল টাইপ ব্যবহার করে http://www.neilconway.org/docs/sequences/

আমি উত্সাহী যদিও বৃহত্তর বিতরণকারী সিস্টেমে যেখানে কোনও ডাটাবেস নেই সিকোয়েন্স নম্বরগুলি কীভাবে তৈরি করা যায়। একাধিক ক্লায়েন্টের জন্য থ্রেড নিরাপদ পদ্ধতিতে সিক্যুয়েন্স নম্বর জেনারেশন অর্জনের জন্য কারও কাছে কি সেরা অনুশীলনের কোনও পরামর্শ বা পরামর্শ আছে ?


এই প্রশ্নটি পুরানো, তবে প্লিজ
জেস্পার এম

আপনি Nextval.org কীভাবে ব্যবহার করবেন? ওয়েবসাইটটি কিছুটা অদ্ভুত এবং আমি জানি না কী সম্পর্কে। এটি কিছু ইউনিক্স আদেশ আছে? বা কিছু মেঘ পরিষেবা?
ডায়গোসাসw

উত্তর:


116

ঠিক আছে, এটি একটি খুব পুরানো প্রশ্ন, যা আমি এখন প্রথম দেখছি।

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

অনন্য আইডি হ'ল অন্য বিষয়, বিকেন্দ্রীভূত পদ্ধতিতে অনন্য আইডি তৈরির বেশ কয়েকটি ভাল উপায় রয়েছে:

ক) আপনি টুইটারের স্নোফ্লেক আইডি নেটওয়ার্ক পরিষেবাটি ব্যবহার করতে পারেন । স্নোফ্লেক হ'ল:

  • নেটওয়ার্ক সার্ভিস, অর্থাত আপনি একটি অনন্য আইডি পেতে একটি নেটওয়ার্ক কল করেন;
  • যা bit৪ বিট অনন্য আইডি উত্পাদন করে যা প্রজন্মের সময় অনুসারে অর্ডার করা হয়;
  • এবং পরিষেবাটি অত্যন্ত স্কেলযোগ্য এবং (সম্ভাব্য) অত্যন্ত উপলব্ধ; প্রতিটি উদাহরণ প্রতি সেকেন্ডে অনেক হাজার আইডি তৈরি করতে পারে এবং আপনি আপনার ল্যান / ডাব্লুএনে একাধিক ইনস্ট্যান্স চালাতে পারেন;
  • স্কালায় লিখিত, জেভিএম-এ চলে।

খ) আপনি ইউআইডি এবং স্নোফ্লেকের আইডি কীভাবে তৈরি করা হয় তা থেকে প্রাপ্ত একটি পদ্ধতির ব্যবহার করে আপনি নিজেরাই ক্লায়েন্টগুলিতে অনন্য আইডি তৈরি করতে পারেন। একাধিক বিকল্প রয়েছে তবে এর লাইনে কিছু রয়েছে:

  • সর্বাধিক উল্লেখযোগ্য 40 বা বিট: একটি টাইমস্ট্যাম্প; আইডি প্রজন্মের সময়। (আমরা প্রজন্মের সময় অনুসারে আইডিগুলিকে বাছাই-করতে সক্ষম করার জন্য টাইমস্ট্যাম্পের জন্য সর্বাধিক উল্লেখযোগ্য বিট ব্যবহার করছি))

  • পরবর্তী 14 বা তত বিট: প্রতি জেনারেটর কাউন্টার, যা প্রতিটি জেনারেটর প্রতিটি নতুন আইডি তৈরির জন্য বাড়িয়ে তোলে। এটি নিশ্চিত করে যে একই মুহুর্তে উত্পন্ন আইডিগুলি (একই টাইমস্ট্যাম্পগুলি) ওভারল্যাপ না করে।

  • সর্বশেষ 10 বা তত বিট: প্রতিটি জেনারেটরের জন্য একটি অনন্য মান। এটি ব্যবহার করে, আমাদের জেনারেটরগুলির মধ্যে কোনও সমন্বয় করার দরকার নেই (যা অত্যন্ত শক্ত), কারণ সমস্ত জেনারেটর এই মানটির কারণে নন-ওভারল্যাপিং আইডি উত্পাদন করে।

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

  • সর্বাধিক উল্লেখযোগ্য 32 টি বিট: টাইমস্ট্যাম্প, আইডিটির প্রজন্মের সময়।
  • সর্বনিম্ন উল্লেখযোগ্য 32 টি বিট: 32-বিট এলোমেলো করে প্রতিটি আইডির জন্য নতুন তৈরি করে।

ঘ) সহজ উপায়, ইউআইডি / জিইউডি ব্যবহার করুন


ক্যাসান্দ্রা কাউন্টারগুলি সমর্থন করে ( cassandra.apache.org/doc/cql3/CQL.html#counters ), যদিও এর কিছু সীমাবদ্ধতা রয়েছে।
পীযূষ কানসাল

ক্রম সংখ্যা বিটম্যাপ সূচক জন্য অবস্থান নির্ধারণ করা সহজ, তবে অনন্য আইডি কখনও কখনও খুব দীর্ঘ (64 বিট বা 128 বিট) হয় কীভাবে বিটম্যাপ সূচক অবস্থানে ইউনিক আইডি ম্যাপিং করতে পারে? ধন্যবাদ।
ব্রুসেনান

2
সত্যিই পছন্দ করা বিকল্প # বি ..... এটি উচ্চ স্কেলের জন্য অনুমতি দেয় এবং সমঝোতা ইস্যুতে অনেক কারণ না ঘটায়
পুনেতে

2
twitter/snowflakeআর রক্ষণাবেক্ষণ করা হয় না
নবীন

আপনার বিকল্প বি একজন apache2 লাইসেন্সপ্রাপ্ত বাস্তবায়ন চান, খুঁজে বার করো bitbucket.org/pythagorasio/common-libraries/src/master/... এছাড়াও আপনি ম্যাভেন io.pythagoras.common থেকে এটা পেতে পারেন: বিতরণ-ক্রম-আইডি-জেনারেটর: 1.0 .0
Wpigott

16

এখন আরও বিকল্প আছে।

যদিও এই প্রশ্নটি "পুরানো", তবে আমি এখানে এসেছি, তাই আমি মনে করি যে আমি জানি (এখন অবধি) যে বিকল্পগুলি জানলাম তা ছেড়ে দেওয়া কার্যকর হতে পারে:

  • আপনি হ্যাজেলকাস্ট চেষ্টা করতে পারেন । এটির 1.9 প্রকাশে এটি java.util.concurrent.AtomicLong এর বিতরণ বাস্তবায়ন অন্তর্ভুক্ত করে
  • আপনি চিড়িয়াখানা ব্যবহার করতে পারেন । এটি সিকোয়েন্স নোডগুলি তৈরি করার জন্য পদ্ধতি সরবরাহ করে (নামগুলি জোনডে যুক্ত করা হয়, যদিও আমি নোডের সংস্করণ সংখ্যা ব্যবহার করতে পছন্দ করি)। যদিও এটির সাথে সাবধানতা অবলম্বন করুন: আপনি যদি নিজের ক্রমটিতে মিস নম্বরগুলি না চান তবে এটি আপনি যা চান তা নাও হতে পারে।

চিয়ার্স


3
চিড়িয়াখানাটি আমি যে বিকল্পগুলি দিয়েছিলাম সেগুলি ছিল, আমি যে মেইলিং তালিকাটি শুরু করেছি তাতে তার একটি ভাল বিবরণ এবং লেখার ব্যবস্থা রয়েছে - mail-archive.com/zookeeper-user@hadoop.apache.org/msg01967.html
জন

জোন, এই থ্রেডের দিকে ইঙ্গিত করার জন্য ধন্যবাদ, ঠিক এই ধরণের সমাধানের জন্য আমি ভাবছিলাম। বিটিডাব্লু, আপনি কি ম্যাক্সএনপিটি সীমাবদ্ধতা কাটিয়ে উঠতে কোড তৈরি করেছেন?
পাওলো

15

আপনার প্রতিটি নোডের একটি অনন্য আইডি থাকতে পারে (যা আপনার যে কোনও উপায়ে থাকতে পারে) এবং তারপরে এটি ক্রম সংখ্যায় প্রিপেন্ড করুন।

উদাহরণস্বরূপ, নোড 1 001-00001 001-00002 001-00003 ইত্যাদি ক্রম উত্পন্ন করে এবং নোড 5 005-00001 005-00002 উত্পন্ন করে

অনন্য :-)

পর্যায়ক্রমে আপনি যদি কিছু কেন্দ্রীভূত সিস্টেম চান তবে আপনি নিজের সিকোয়েন্স সার্ভারটি ব্লকগুলিতে দেওয়ার কথা বিবেচনা করতে পারেন। এটি ওভারহেড উল্লেখযোগ্যভাবে হ্রাস করে। উদাহরণস্বরূপ, নির্ধারিত প্রতিটি আইডির জন্য কেন্দ্রীয় সার্ভার থেকে একটি নতুন আইডি অনুরোধ করার পরিবর্তে, আপনি কেন্দ্রীয় সার্ভার থেকে 10,000 এর ব্লকগুলিতে আইডির অনুরোধ করুন এবং তারপরে আপনি রান আউট হয়ে যাওয়ার পরে কেবল অন্য একটি নেটওয়ার্ক অনুরোধ করতে হবে।


1
আমি ব্যাচ আইডি জেনারেশন সম্পর্কে আপনার মতামত পছন্দ করি তবে এটি কেবল কোনও বাস্তব সময়ের গণনার সম্ভাবনা সীমাবদ্ধ করে।
ইশান

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

11

এটি রেডিসন দিয়ে করা যেতে পারে । এটি এর বিতরণযোগ্য এবং স্কেলযোগ্য সংস্করণ প্রয়োগ করে AtomicLong। এখানে উদাহরণ:

Config config = new Config();
config.addAddress("some.server.com:8291");

Redisson redisson = Redisson.create(config);
RAtomicLong atomicLong = redisson.getAtomicLong("anyAtomicLong");
atomicLong.incrementAndGet();

8

যদি সত্যিই এটি বিশ্বব্যাপী ক্রমযুক্ত হতে হয়, এবং কেবল অনন্য নয়, তবে আমি এই সংখ্যাগুলি সরবরাহের জন্য একটি একক, সহজ পরিষেবা তৈরির বিষয়টি বিবেচনা করব।

বিতরণ করা সিস্টেমগুলি প্রচুর সংক্ষিপ্ত পরিষেবাদিগুলির সাথে ইন্টারঅ্যাক্ট করার উপর নির্ভর করে এবং এই সাধারণ ধরণের কাজের জন্য আপনার কি সত্যই প্রয়োজন বা অন্য কিছু জটিল, বিতরণ সমাধান থেকে সত্যই উপকার পাবেন?


3
... এবং সার্ভারটি যখন এই পরিষেবাটি চালাচ্ছে তখন কী নামবে?
নবীন

একটি সতর্কতা আছে যা কাউকে অন্যটি শুরু করতে বলে? কখনও কখনও যে ঠিক হয়ে যাবে। আমি মনে করি উত্তরটি "জিনিসগুলিকে দৃষ্টিভঙ্গিতে রাখুন" বলার চেষ্টা করছে। নিখুঁত বিতরণ সমাধানের নিজস্ব ত্রুটি রয়েছে এবং কখনও কখনও সহজ আরও ভাল।
নিক ফেরিয়ার

6

কয়েকটি কৌশল আছে; তবে আমি জানি যে কিছুই সত্যই বিতরণ করা যায় না এবং সত্যিকারের অনুক্রম দেওয়া যায়।

  1. একটি কেন্দ্রীয় নম্বর জেনারেটর আছে। এটি একটি বড় ডাটাবেস হতে হবে না। memcachedএকটি দ্রুত পারমাণবিক কাউন্টার রয়েছে, বেশিরভাগ ক্ষেত্রে এটি আপনার পুরো ক্লাস্টারের পক্ষে পর্যাপ্ত দ্রুত।
  2. প্রতিটি নোডের জন্য একটি পূর্ণসংখ্যার পরিসর পৃথক করুন ( স্টিভেন শ্লানস্ক্টারের উত্তরের মতো) )
  3. এলোমেলো সংখ্যা বা ইউআইডি ব্যবহার করুন
  4. নোডের আইডি সহ একসাথে কিছু টুকরো ডেটা ব্যবহার করুন এবং এটি সমস্ত হ্যাশ করুন (বা এটি এইচএমএক )

ব্যক্তিগতভাবে, আমি ইউআইডিগুলিতে ঝুঁকে যাব, বা যদি আমি বেশিরভাগ ক্ষেত্রে একটি স্পষ্ট জায়গা পেতে চাই তবে ম্যাকচেড করব।


5

কেন একটি (থ্রেড নিরাপদ) ইউআইডি জেনারেটর ব্যবহার করবেন না?

আমার সম্ভবত এটি উপর প্রসারিত করা উচিত।

ইউআইডিগুলি বিশ্বব্যাপী অনন্য বলে গ্যারান্টিযুক্ত (আপনি যদি এলোমেলো সংখ্যার ভিত্তিতে এগুলি এড়িয়ে যান, যেখানে স্বতন্ত্রতা কেবলমাত্র সম্ভাব্য)।

প্রতিটি ইউআইডি-র বৈশ্বিক স্বতন্ত্রতার দ্বারা আপনি কতগুলি ইউইউডি জেনারেটর ব্যবহার না করেই আপনার "বিতরণ" প্রয়োজনীয়তা পূরণ করা হয়।

আপনার "থ্রেড নিরাপদ" প্রয়োজনীয়তা "থ্রেড নিরাপদ" ইউআইডি জেনারেটর চয়ন করে পূরণ করা যেতে পারে।

আপনার "সিকোয়েন্স নম্বর" প্রয়োজনীয়তা প্রতিটি ইউইউডি-র গ্যারান্টিযুক্ত বৈশ্বিক স্বাতন্ত্র্য দ্বারা পূরণ করা হবে বলে ধরে নেওয়া হয়।

নোট করুন যে অনেকগুলি ডাটাবেস সিকোয়েন্স নম্বর বাস্তবায়ন (উদাঃ ওরাকল) মনোটোনিকভাবে বৃদ্ধি বা (এমনকি) ক্রম সংখ্যা বাড়িয়ে (প্রতি "সংযোগ" ভিত্তিতে) গ্যারান্টি দেয় না। কারণ ক্রম সংখ্যার একটানা ব্যাচ প্রতি সংযোগের ভিত্তিতে "ক্যাশেড" ব্লকে বরাদ্দ পেয়েছে। এটি বিশ্বব্যাপী স্বতন্ত্রতার গ্যারান্টি দেয় এবং পর্যাপ্ত গতি বজায় রাখে। কিন্তু একাধিক সংযোগের জন্য বরাদ্দকৃত ক্রম সংখ্যা আসলে (সময়ের সাথে সাথে) বরফ করা যায়!


1
ইউআইডি-র কাজ করার সময়, তাদের সাথে সমস্যা হ'ল আপনার যদি চূড়ান্তভাবে উত্পন্ন কীগুলি সূচীকরণ করতে হয় তবে আপনি কীভাবে সেগুলি সংরক্ষণ করবেন সে বিষয়ে আপনাকে সতর্কতা অবলম্বন করতে হবে। তারা সাধারণত একঘেয়ে বর্ধিত ক্রমের চেয়ে অনেক বেশি জায়গা গ্রহণ করবে। মাইএসকিউএল দিয়ে সেগুলি সংরক্ষণ সম্পর্কে আলোচনার জন্য পারকোনা.com/blog/2014/12/19/store-uuid-optimised-way দেখুন ।
পাভেল

2

বিতরণ করা আইডি প্রজন্মকে রেডিস এবং লুয়ার সাহায্যে সংরক্ষণাগারভুক্ত করা যেতে পারে। বাস্তবায়ন গিথুব এ উপলব্ধ । এটি একটি বিতরণ করা হয় এবং কে-বাছাইযোগ্য অনন্য আইডি উত্পাদন করে।


2

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমরাও একই প্রয়োজনের মুখোমুখি হয়েছি এবং আমাদের প্রয়োজনীয়তা পূরণ করে এমন সমাধান খুঁজে পেতে পারিনি। আমাদের প্রয়োজনটি ছিল আইডির একটি অনন্য ক্রম (0,1,2,3 ... এন) পাওয়ার এবং তাই স্নোফ্লেক কোনও সহায়তা করেনি। আমরা রেডিস ব্যবহার করে এইডস তৈরি করতে আমাদের নিজস্ব সিস্টেম তৈরি করেছি। রেডিস এককভাবে থ্রেডেড তাই এর তালিকা / সারি প্রক্রিয়াটি সবসময় আমাদের একবারে 1 টি পপ দেয়।

আমরা যা করি তা হ'ল, আমরা আইডিগুলির একটি বাফার তৈরি করি, প্রাথমিকভাবে, কাতারে 0 থেকে 20 আইডি থাকবে যা অনুরোধ করার সময় প্রেরণের জন্য প্রস্তুত। একাধিক ক্লায়েন্ট একটি আইডি অনুরোধ করতে পারেন এবং পুনরায় redis একবারে 1 আইডি পপ হবে, বাম থেকে প্রতিটি পপ পরে, আমরা ডানদিকে BUFFER + কারেন্টইড sertোকান, যা বাফার তালিকাটি চালিয়ে যায়। এখানে বাস্তবায়ন


0

আমি একটি সহজ পরিষেবা লিখেছি যা আধা-অনন্য অ-অনুক্রমিক 64 বিট দীর্ঘ সংখ্যা তৈরি করতে পারে। এটি রিডানডেন্সি এবং স্কেলিবিলিটির জন্য একাধিক মেশিনে স্থাপন করা যেতে পারে। এটি মেসেজিংয়ের জন্য জিরোমিকিউ ব্যবহার করে। এটি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য গিথুব পৃষ্ঠাটি দেখুন: জুইড


0

একটি ডাটাবেস ব্যবহার করে আপনি একক কোর দিয়ে প্রতি সেকেন্ডে 1.000+ বৃদ্ধি পেতে পারেন। এটা বেশ সহজ। আপনি এই নম্বরটি তৈরি করতে ব্যাকএন্ড হিসাবে তার নিজস্ব ডাটাবেসটি ব্যবহার করতে পারেন (এটি ডিডিডির ক্ষেত্রে এটির নিজস্ব সমষ্টি হওয়া উচিত)।

আমি একই সমস্যা বলে মনে হচ্ছে। আমার বেশ কয়েকটি পার্টিশন ছিল এবং আমি প্রত্যেকটির জন্য একটি অফসেট কাউন্টার পেতে চাই। আমি এরকম কিছু বাস্তবায়ন করেছি:

CREATE DATABASE example;
USE example;
CREATE TABLE offsets (partition INTEGER, offset LONG, PRIMARY KEY (partition));
INSERT offsets VALUES (1,0);

তারপরে নিম্নলিখিত বিবৃতি কার্যকর করা:

SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE;
UPDATE offsets set offset=@offset+1 WHERE partition=1;

যদি আপনার অ্যাপ্লিকেশন আপনাকে অনুমতি দেয় তবে আপনি একবারে একটি ব্লক বরাদ্দ করতে পারেন (এটি আমার ক্ষেত্রে ছিল)।

SELECT @offset := offset from offsets WHERE partition=1 FOR UPDATE;
UPDATE offsets set offset=@offset+100 WHERE partition=1;

আপনার যদি আরও থ্রুপুট দরকার হয় তবে আগে থেকে অফসেট বরাদ্দ করতে পারবেন না রিয়েল টাইম প্রসেসিংয়ের জন্য ফ্লিংক ব্যবহার করে আপনি নিজের পরিষেবাটি প্রয়োগ করতে পারেন। আমি পার্টিশনটিতে প্রায় 100K ইনক্রিমেন্ট পেতে সক্ষম হয়েছি।

আশা করি এটা সাহায্য করবে!


0

সমস্যাটির অনুরূপ: ইস্কি বিশ্বে, যেখানে প্রতিটি লুন / ভলিউম ক্লায়েন্টের পাশে চলমান সূচনাবিদদের দ্বারা স্বতন্ত্রভাবে চিহ্নিত করতে হবে identi আইসসিসি স্ট্যান্ডার্ড বলছে যে প্রথম কয়েকটি বিটগুলিতে স্টোরেজ প্রদানকারী / প্রস্তুতকারকের তথ্য উপস্থাপন করতে হবে এবং বাকিগুলি একঘেয়েভাবে বাড়ছে।

একইভাবে, নোডের উপস্থাপনের জন্য নোডগুলির বিতরণ ব্যবস্থায় প্রাথমিক বিটগুলি ব্যবহার করতে পারেন এবং বাকীগুলি একঘেয়েভাবে বাড়তে পারে।


1
দয়া করে আরও বিশদ যুক্ত করুন
বেদ প্রকাশ

0

শালীন একটি সমাধান দীর্ঘ সময় ভিত্তিক প্রজন্ম ব্যবহার করা। এটি একটি বিতরণ করা ডাটাবেসের সমর্থন দিয়ে করা যেতে পারে।

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