Distributed key-value store ডিজাইন (Dynamo-ধাঁচ)

Highly available key-value database consistent hashing, replication ও quorum নিয়ম মেলায়। Dynamo-ধাঁচের ডিজাইন ধাপে ধাপে দেখি।

node-এর বৃত্তে ছড়ানো key-value জোড়া

লক্ষ্য: একটি key-value store (put(key, value), get(key)) যা scale out করে, ব্যর্থতার মধ্যেও available থাকে, এবং tune করা যায় এমন consistency দেয়। এটি Amazon-এর Dynamo গবেষণাপত্রের ধারণা অনুসরণ করে, যা Cassandra ও Riak-কে প্রভাবিত করেছে।

Requirement

  • Node যোগ করে বিশাল data ও উচ্চ throughput।
  • কিছু node বন্ধ থাকলেও সবসময় লেখা-পড়া যায় (availability আগে)।
  • কম latency।
  • Tune-যোগ্য consistency।

Partitioning

Virtual node সহ consistent hashing ব্যবহার করুন: key ও node ring-এ বসে, প্রতিটি key ঘড়ির দিকে পরের node-এর। Node যোগ বা বাদ দিলে key-র সামান্য অংশই নড়ে।

Replication

প্রতিটি key ring-এ ধারাবাহিক N টি node-এ থাকে (যেমন N=3)। যেকোনো node request-এর coordinator হতে পারে।

Quorum: R, W ও N

  • W: কতগুলো replica write নিশ্চিত করবে।
  • R: কতগুলো replica read-এর উত্তর দেবে।
  • R + W > N হলে read ও write অন্তত একটি replica-তে মিলে যায়, তাই read সর্বশেষ write দেখে।

N=3 ধরে উদাহরণ: W=2, R=2 consistency দেয়; W=1, R=1 গতি ও availability দেয় কিন্তু পুরোনো read হতে পারে। ব্যবহারের ক্ষেত্র অনুযায়ী বাছুন।

ব্যর্থতায় টিকে থাকা

  • Sloppy quorum ও hinted handoff: replica বন্ধ থাকলে অন্য node সাময়িকভাবে "hint" সহ write নেয় এবং replica ফিরলে এগিয়ে দেয়। এতে write available থাকে।
  • Gossip দিয়ে ব্যর্থতা শনাক্ত: node-রা নিয়মিত heartbeat তথ্য বিনিময় করে, তাই কেন্দ্রীয় master ছাড়াই cluster জানে কে জীবিত।
  • Read repair: read পুরোনো replica ধরলে coordinator সেটি আপডেট করে।
  • Merkle tree দিয়ে anti-entropy: node-রা data-র tree hash তুলনা করে পেছনে সস্তায় পার্থক্য খুঁজে ঠিক করে।

Conflict

Availability আগে হলে দুই client আলাদা replica-তে একই key-তে ভিন্ন মান লিখতে পারে। সমাধান: last-write-wins (সহজ, data হারাতে পারে) অথবা vector clock যা সমান্তরাল সংস্করণ শনাক্ত করে যাতে অ্যাপ (বা CRDT) merge করতে পারে।

প্রতিটি node-এর storage engine

বেশিরভাগ এমন store LSM tree ব্যবহার করে:

  1. Commit log-এ (টেকসই করতে) এবং in-memory memtable-এ লেখা।
  2. ভরে গেলে memtable অপরিবর্তনীয় সাজানো ফাইলে (SSTable) flush।
  3. Read আগে memtable, তারপর SSTable দেখে (Bloom filter key-হীন ফাইল এড়ায়)।
  4. Compaction পেছনে ফাইল merge করে।

Write ক্রমিক বলে খুব দ্রুত।

লেনদেন

কঠোর consistency-র চেয়ে availability ও partition tolerance বাছা হয়। অ্যাপকে পুরোনো read ও conflict সামলাতে হবে।

মূল কথা: consistent hashing, N replica, tune-যোগ্য R/W quorum, hinted handoff, gossip, repair এবং LSM-tree engine মিলে scalable, available key-value store দেয়।


System Design সিরিজ, পর্ব ৪ (infrastructure ডিজাইন): 3 নম্বর (মোট 4)। আগের লেখা: Distributed cache ডিজাইন.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া