ভূমিকা
বড় সিস্টেমে ডাটাবেস সবসময় বাধা হয়ে দাঁড়ায়। ট্রাফিক বাড়লে ডাটাবেস দুইভাবে ফেইল করে:
- স্টোরেজ সীমা – ডাটা এত বড় যে একটি মেশিনে ধরে না
- পারফরম্যান্স সীমা – ক্যুয়রি এত বেশি যে একটি মেশিন হ্যান্ডেল করতে পারে না
রেপ্লিকেশন (Replication) এবং শার্ডিং (Sharding) - এই দুই কৌশল একসাথে ব্যবহার করলেই ডাটাবেস স্কেল করা সম্ভব।
সহজ ভাষায়:
রেপ্লিকেশন = একই ডাটার একাধিক কপি তৈরি করা (পড়ার ক্ষমতা বাড়ায়)
শার্ডিং = ডাটাকে ভাগ করে একাধিক মেশিনে ছড়িয়ে দেওয়া (লেখার ক্ষমতা ও স্টোরেজ বাড়ায়)
পর্ব ১: রেপ্লিকেশন (Replication)
রেপ্লিকেশন কী?
রেপ্লিকেশন হলো একই ডাটাকে একাধিক সার্ভারে কপি করে রাখা। একটি প্রাইমারি (মাস্টার) সার্ভার থাকে যেখানে লেখা হয়, আর একাধিক সেকেন্ডারি (স্লেভ) সার্ভার থাকে যারা প্রাইমারির ডাটা কপি করে রাখে।
[ক্লায়েন্ট]
|
↓ (লেখার অনুরোধ)
┌─────────────┐
│ প্রাইমারি │
│ (মাস্টার) │
└──────┬──────┘
│ (রেপ্লিকেশন)
┌──────┴──────┬──────────┐
↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│সেকেন্ডারি│ │সেকেন্ডারি│ │সেকেন্ডারি│
│ (স্লেভ) │ │ (স্লেভ) │ │ (স্লেভ) │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└────────────┴────────────┘
↑
(পড়ার অনুরোধ)
[ক্লায়েন্ট]
রেপ্লিকেশনের প্রকারভেদ
| প্রকার | বর্ণনা | সুবিধা | অসুবিধা |
|---|---|---|---|
| সিঙ্ক্রোনাস | প্রাইমারি লেখার পর সেকেন্ডারি নিশ্চিত না করা পর্যন্ত রেসপন্স দেয় না | ডাটা কখনো হারায় না (কনসিস্টেন্সি) | লেটেন্সি বাড়ে |
| অ্যাসিঙ্ক্রোনাস | প্রাইমারি দ্রুত রেসপন্স দেয়, ব্যাকগ্রাউন্ডে রেপ্লিকেশন হয় | দ্রুত, ভালো পারফরম্যান্স | সাময়িক অমিল থাকতে পারে |
| সেমি-সিঙ্ক্রোনাস | অন্তত একটি সেকেন্ডারি নিশ্চিত হওয়া পর্যন্ত অপেক্ষা করে | ব্যালেন্সড | কনফিগারেশন জটিল |
রেপ্লিকেশন টপোলজি
১. মাস্টার-স্লেভ (এক মাস্টার, একাধিক স্লেভ)
- লেখা শুধু মাস্টারে, পড়া যেকোনো স্লেভে
- সবচেয়ে সাধারণ
২. মাল্টি-মাস্টার (একাধিক মাস্টার)
- একাধিক মাস্টারে লেখা যায়
- কনফ্লিক্ট রেজোলিউশন প্রয়োজন
৩. মাস্টার-মাস্টার (পিয়ার-টু-পিয়ার)
- দুটি মাস্টার, দুটিতেই লেখা যায়
- অ্যাপ্লিকেশন লেভেলে কনফ্লিক্ট হ্যান্ডেল করতে হবে
৪. ক্রেডেবল রেপ্লিকা
- সেকেন্ডারিরাও লেখা নিতে পারে (স্থানীয়ভাবে)
- পরবর্তীতে প্রাইমারির সাথে মিলিয়ে নেয়
রেপ্লিকেশনের সুবিধা
| সুবিধা | ব্যাখ্যা |
|---|---|
| উচ্চ অ্যাভেইলেবিলিটি | একটি সার্ভার ডাউন হলেও অন্য সার্ভার থেকে পড়া যায় |
| স্কেলেবল রিড থ্রুপুট | একাধিক স্লেভ থেকে রিকোয়েস্ট সার্ভ করা যায় |
| ডিজাস্টার রিকভারি | ব্যাকআপ হিসেবে কাজ করে |
| লেটেন্সি কমানো | ইউজারের নিকটবর্তী রেপ্লিকা থেকে পড়া যায় (জিও-ডিস্ট্রিবিউশন) |
| অ্যানালিটিক্স অফলোড | রিপোর্টিং জেনারেশনের জন্য স্লেভ ব্যবহার করা যায় |
রেপ্লিকেশনের চ্যালেঞ্জ
| চ্যালেঞ্জ | সমাধান |
|---|---|
| রেপ্লিকেশন ল্যাগ | অ্যাসিঙ্ক্রোনাস রেপ্লিকেশনে স্লেভ পিছিয়ে পড়তে পারে → মনিটরিং ও থ্রটলিং |
| স্টেল রিড | ইউজার নিজের লেখা ডাটা পড়তে না পারলে? → "রিড আফটার রাইট" কনসিস্টেন্সি |
| কনফ্লিক্ট (মাল্টি-মাস্টারে) | লাস্ট রাইট উইন্স (LWW), ক্রিডিটিবল রেপ্লিকা, বা অ্যাপ্লিকেশন লেভেল রেজোলিউশন |
| ফেইলওভার জটিলতা | মাস্টার ডাউন হলে স্বয়ংক্রিয়ভাবে নতুন মাস্টার নির্বাচন → কনসেনসাস অ্যালগরিদম (Raft, Paxos) |
রেপ্লিকেশন কৌশল নির্বাচন গাইড
| যদি চান | তাহলে ব্যবহার করুন |
|---|---|
| একদম কনসিস্টেন্ট ডাটা | সিঙ্ক্রোনাস রেপ্লিকেশন |
| দ্রুত রেসপন্স, সামান্য অমিল tolerable | অ্যাসিঙ্ক্রোনাস রেপ্লিকেশন |
| যদি লেখাও স্কেল করতে চান | মাল্টি-মাস্টার রেপ্লিকেশন |
| ভৌগোলিকভাবে ছড়ানো ইউজার | জিও-ডিস্ট্রিবিউটেড রেপ্লিকা |
পর্ব ২: শার্ডিং (Sharding)
শার্ডিং কী?
শার্ডিং হলো একটি বড় ডাটাবেসকে ছোট ছোট শার্ডে ভাগ করে একাধিক সার্ভারে ছড়িয়ে দেওয়া। প্রতিটি শার্ড স্বতন্ত্র ডাটাবেস (একটি মেশিনে)। ডাটা কীভাবে ভাগ হবে তা নির্ধারণ করে শার্ড কী।
[অ্যাপ্লিকেশন]
|
(শার্ড কী: user_id)
|
┌────────────────┼────────────────┐
↓ ↓ ↓
┌────────┐ ┌────────┐ ┌────────┐
│ শার্ড ১ │ │ শার্ড ২ │ │ শার্ড ৩ │
│ user_id │ │ user_id │ │ user_id │
│ 1-1000 │ │1001-2000│ │2001-3000│
└────────┘ └────────┘ └────────┘
মেশিন A মেশিন B মেশিন C
শার্ডিং স্ট্রাটেজি
১. রেঞ্জ-বেসড শার্ডিং
- কী-র পরিসর অনুযায়ী ভাগ করা (যেমন: 1-1000, 1001-2000)
- সহজ, রেঞ্জ ক্যোয়ারি সম্ভব
- অসুবিধা: হট স্পট হতে পারে (নতুন ডাটা এক শার্ডে জমে)
২. হ্যাশ-বেসড শার্ডিং
- শার্ড কী-র হ্যাশ নিয়ে modulo করা
- ডাটা সমানভাবে বিতরণ হয়
- অসুবিধা: রেঞ্জ ক্যোয়ারি কঠিন
# হ্যাশ-বেসড শার্ডিং উদাহরণ
shard_id = hash(user_id) % number_of_shards # 0, 1, 2, ...
৩. ডিরেক্টরি-বেসড শার্ডিং
- আলাদা লুকআপ টেবিল রাখা যা বলে কোন কী কোন শার্ডে আছে
- সবচেয়ে ফ্লেক্সিবল
- অসুবিধা: লুকআপ টেবিল নিজেই বটলনেক হতে পারে
৪. জিও-বেসড শার্ডিং
- ভৌগোলিক অবস্থান অনুযায়ী (যেমন: ঢাকা শার্ড, চট্টগ্রাম শার্ড)
- লেটেন্সি কমানোর জন্য
শার্ড কী নির্বাচনের নিয়ম
| নিয়ম | ব্যাখ্যা | উদাহরণ |
|---|---|---|
| কার্ডিনালিটি বেশি | শার্ড কী-র সম্ভাব্য মান অনেক হতে হবে | user_id (ভালো), gender (খারাপ) |
| ইউনিফর্ম ডিস্ট্রিবিউশন | প্রতিটি শার্ডে সমান ডাটা পড়বে | hash(user_id) |
| কোয়েরি প্যাটার্ন | যে ফিল্ড দিয়ে বেশিরভাগ কোয়েরি করবেন তা-ই শার্ড কী | customer_id |
| অ্যাটমিক | পরিবর্তন হওয়ার সম্ভাবনা কম | জন্ম তারিখ (ভালো), বর্তমান শহর (খারাপ) |
শার্ডিংয়ের সুবিধা
| সুবিধা | ব্যাখ্যা |
|---|---|
| অলিমিটেড স্টোরেজ | নতুন শার্ড যোগ করেই ডাটা বাড়ানো যায় (হরাইজন্টাল স্কেলিং) |
| উচ্চ রাইট থ্রুপুট | লেখা একাধিক সার্ভারে ছড়িয়ে যায় |
| ফল্ট টলারেন্স | একটি শার্ড ডাউন হলেও অন্যগুলো কাজ করে |
| কোয়েরি পারফরম্যান্স | প্রতিটি শার্ডে ডাটা কম → দ্রুত কোয়েরি |
শার্ডিংয়ের চ্যালেঞ্জ
| চ্যালেঞ্জ | সমাধান |
|---|---|
| রিশার্ডিং (শার্ড বাড়ানো/কমানো) | কনসিস্টেন্ট হ্যাশিং, লজিক্যাল শার্ড (ফিজিক্যালের ম্যাপিং আলাদা) |
| হট স্পট | শার্ড কী নকশা ভালো করা, বা রাইট শার্ডিংয়ের বিকল্প পদ্ধতি |
| ক্রস-শার্ড কোয়েরি | ডিনরমালাইজেশন, বা ম্যাপ-রিডিউস স্টাইল প্রসেসিং |
| জয়েন করা কঠিন | অ্যাপ্লিকেশন লেভেলে জয়েন বা ডিনরমালাইজেশন |
| অ্যাটমিক ট্রানজেকশন নেই | ডিস্ট্রিবিউটেড ট্রানজেকশন (২ পিএইচ) বা সাগা প্যাটার্ন |
পর্ব ৩: রেপ্লিকেশন + শার্ডিং একসাথে
বাস্তব সিস্টেমে দুটো একসাথে ব্যবহার করতে হয়। এটাকেই বলে কম্বাইন্ড আর্কিটেকচার।
[লোড ব্যালান্সার]
|
┌───────────────────┴───────────────────┐
↓ ↓
[শার্ড এ] [শার্ড বি]
(user_id 1-500) (user_id 501-1000)
| |
(রেপ্লিকেশন) (রেপ্লিকেশন)
↓ ↓
┌────┴────┐ ┌────┴────┐
↓ ↓ ↓ ↓
[মাস্টার এ] [স্লেভ এ১] [মাস্টার বি] [স্লেভ বি১]
[স্লেভ এ২] [স্লেভ বি২]
উদাহরণ: ই-কমার্স অর্ডার সিস্টেম
ধাপ ১: অর্ডার ডাটাকে order_id-এর হ্যাশ অনুযায়ী ৪টি শার্ডে ভাগ করুন (শার্ডিং)।
ধাপ ২: প্রতিটি শার্ডের জন্য ১টি মাস্টার ও ২টি স্লেভ রাখুন (রেপ্লিকেশন)।
ধাপ ৩:
- লেখার অনুরোধ → প্রাসঙ্গিক শার্ডের মাস্টারে যাবে
- পড়ার অনুরোধ → যেকোনো শার্ডের যেকোনো স্লেভে যাবে
ফলাফল:
- ৪টি শার্ড → লেখার ক্ষমতা ৪ গুণ
- প্রতি শার্ডে ৩টি করে সার্ভার (১ মাস্টার + ২ স্লেভ) → পড়ার ক্ষমতা ১২ গুণ
শিল্পে বাস্তব উদাহরণ
| কোম্পানি | পদ্ধতি | বিবরণ |
|---|---|---|
| ফেসবুক | রেঞ্জ শার্ডিং + মাল্টি-মাস্টার | ইউজার আইডি অনুযায়ী শার্ড, প্রতিটি শার্ডের মাল্টি-মাস্টার |
| গুগল (Bigtable) | হ্যাশ + রেঞ্জ | হ্যাশের পর রেঞ্জ শার্ডিং |
| ইউটিউব | ভিডিও আইডি-র হ্যাশ | ভিডিও ভিউ ডাটা শার্ডিং |
| আমাজন (DynamoDB) | হ্যাশ + রেঞ্জ (ADAPTIVE) | স্বয়ংক্রিয়ভাবে পার্টিশন ভাগ করে |
চিটশিট: কখন কোনটা ব্যবহার করবেন
| যদি সমস্যা হয় | সমাধান | কেন? |
|---|---|---|
| পড়ার পরিমাণ বেশি, ডাটার পরিমাণ কম | রেপ্লিকেশন | একাধিক স্লেভ রিড সার্ভ করতে পারে |
| ডাটার পরিমাণ বেশি, লেখার পরিমাণ কম | শার্ডিং | ডাটা একাধিক মেশিনে ভাগ হবে |
| দুই-ই বেশি | শার্ডিং + রেপ্লিকেশন | লেখা শার্ডে, পড়া রেপ্লিকায় |
| ডাটা কম কিন্তু পড়া বেশি | ক্যাশিং + রেপ্লিকেশন | ক্যাশে দ্রুত, রেপ্লিকা ব্যাকআপ |
| ডাটা বিশাল কিন্তু প্রায়ই লেখা হয় না | শার্ডিং | কোল্ড স্টোরেজ |
| ট্রানজেকশন জরুরি | রেপ্লিকেশন (মাস্টার-স্লেভ) | শার্ডিং ক্রস-শার্ড জয়েন কঠিন |
সচরাচর জিজ্ঞাসিত প্রশ্ন (FAQ)
১. শার্ডিং ছাড়া কি রেপ্লিকেশন চলে?
হ্যাঁ। ছোট সিস্টেমে রেপ্লিকেশন দিয়েই কাজ চলে (পড়া স্কেলিংয়ের জন্য)।
২. রেপ্লিকেশন ছাড়া কি শার্ডিং চলে?
না। শার্ড ডাউন হলে পুরো ডাটা হারানোর সম্ভাবনা। রেপ্লিকেশন দরকার।
৩. কোন কোম্পানি কেমন রেপ্লিকেশন ব্যবহার করে?
- GitHub: মাস্টার-স্লেভ (MySQL)
- Netflix: মাল্টি-মাস্টার (Cassandra)
- Uber: শার্ডিং + রেপ্লিকেশন (MySQL)
৪. কনসিস্টেন্ট হ্যাশিং কীভাবে কাজ করে?
হ্যাশ রিংয়ে শার্ড ও কী উভয়কেই স্থাপন করে,শার্ড সংখ্যা বাড়ালে শুধু প্রতিবেশী শার্ড প্রভাবিত হয়।