System Design শেখো
শেখো / মৌলিক ধারণা

Consistent Hashing (কনসিস্টেন্ট হ্যাশিং)

8 মিনিট Module 1 · Fundamentals
এক নজরে
  • অনেকগুলো server-এর মধ্যে ডেটা ভাগ করার একটা চতুর পদ্ধতি, যা একটা গোল 'ring' ব্যবহার করে।
  • সাধারণ পদ্ধতিতে (modulo) একটা server যোগ/বাদ দিলে প্রায় সব ডেটা সরাতে হয় — এটা ভয়ংকর।
  • Consistent hashing-এ server যোগ/বাদ দিলে শুধু অল্প কিছু ডেটা সরে।

সমস্যাটা কী?

ধরো তোমার ৩টা server আছে আর অনেক ডেটা। কোন ডেটা কোন server-এ রাখবে?

সহজ উপায়: server = hash(key) % 3। মানে key-টাকে একটা সংখ্যায় বদলে, ৩ দিয়ে ভাগ করে যা ভাগশেষ থাকে সেই server।

কাজ করে। কিন্তু একটা নতুন server যোগ করলে (এখন ৪টা) সূত্রটা হয়ে যায় % 4। এখন প্রায় প্রতিটা key-এর হিসাব বদলে গেল! মানে প্রায় সব ডেটা এক জায়গা থেকে আরেক জায়গায় সরাতে হবে। 😱 বিশাল system-এ এটা বিপর্যয়।

সমাধান: একটা গোল Ring কল্পনা করো

Consistent hashing এই সমস্যা সমাধান করে। ধারণাটা সুন্দর:

  1. একটা গোল বৃত্ত (ring) কল্পনা করো — ০ থেকে শুরু করে আবার ০-তে শেষ।
  2. প্রতিটা server-কে hash করে ring-এর কোনো একটা জায়গায় বসাও।
  3. প্রতিটা ডেটা (key)-কেও hash করে ring-এ বসাও।
  4. একটা key যেখানে বসেছে, সেখান থেকে ঘড়ির কাঁটার দিকে এগিয়ে প্রথম যে server পাবে — সেই server-এ ডেটাটা জমা হবে।
সহজ উদাহরণ: গোল টেবিল

একটা গোল টেবিলে কয়েকজন বসে আছে (server)। তুমি একটা চিঠি (key) টেবিলের কোথাও রাখলে। নিয়ম: চিঠিটা তার ডানদিকে প্রথম যে ব্যক্তিকে পায়, সে-ই সেটা রাখবে। এবার একজন নতুন লোক টেবিলে বসলে — শুধু তার আশেপাশের কয়েকটা চিঠির মালিক বদলায়, বাকিদের কিছু হয় না।

নিজে দেখো

Node যোগ ও বাদ দিয়ে দেখো — কত কম key তাদের server বদলায়:

টুল লোড হচ্ছে…

কেন এটা এত ভালো?

যখন একটা নতুন server যোগ হয়, সে ring-এর শুধু একটা জায়গায় বসে। ফলে শুধু তার ঠিক আগের অংশের কিছু key তার দায়িত্বে আসে — বাকি কোটি কোটি key যেখানে ছিল সেখানেই থাকে।

একইভাবে একটা server বাদ গেলে শুধু তার key-গুলো পাশের server-এ চলে যায়, আর কারো নড়াচড়া নেই।

গড়ে মাত্র (ডেটা সংখ্যা / server সংখ্যা) পরিমাণ key সরে — পুরো system নয়।

Virtual Nodes — একটা উন্নতি

সমস্যা: কয়েকটা server হয়তো ring-এ কাছাকাছি বসে গেল, ফলে চাপ অসমান (কেউ বেশি ডেটা পায়, কেউ কম)।

সমাধান: প্রতিটা server-কে একবার নয়, অনেকবার (অনেক virtual node হিসেবে) ring-এ বসাও। এতে ডেটা সব server-এ অনেক সমানভাবে ছড়িয়ে পড়ে।

টিপস

ইন্টারভিউতে যখন database sharding বা distributed cache (যেমন একাধিক Redis node) নিয়ে কথা হবে, consistent hashing উল্লেখ করলে ভালো ছাপ পড়ে — কারণ এটাই node যোগ/বাদ সামলানোর আদর্শ পদ্ধতি।

বাস্তব উদাহরণ

Amazon-এর DynamoDB, Apache Cassandra, আর অনেক distributed cache system — সবাই ডেটা ভাগ করতে consistent hashing (বা তার উন্নত রূপ) ব্যবহার করে। এজন্যই তারা সহজে server যোগ/বাদ করতে পারে, পুরো system না নাড়িয়ে।

মূল শব্দ (Key Terms)

মিনি কুইজ

1. Consistent hashing-এর মূল সুবিধা কী?

2. সাধারণ 'hash mod N' পদ্ধতিতে একটা নতুন server যোগ করলে কী সমস্যা?