Data Partitioning & Sharding
যখন আপনার ডেটাবেসের সাইজ এবং ট্রাফিক একটি সিঙ্গেল সার্ভারের ধারণক্ষমতা ছাড়িয়ে যায়, তখন 'Partitioning' এবং 'Sharding' ই একমাত্র সমাধান।
১. Data Partitioning (পার্টিশনিং)
পার্টিশনিং হলো একটি বড় ডেটাবেস টেবিলকে ছোট ছোট লজিক্যাল অংশে ভাগ করা। এটি মূলত একটি সার্ভারের মধ্যেই মেমোরি বা স্টোরেজ ভালোমতো ম্যানেজ করার জন্য করা হয়।
প্রকারভেদ:
- Vertical Partitioning: টেবিলের কলামগুলোকে আলাদা করা। (যেমন: ইউজারের প্রোফাইল ফটো একটি আলাদা টেবিলে রাখা আর নাম-ইমেইল অন্য টেবিলে)।
- Horizontal Partitioning: টেবিলের রোগুলোকে (Rows) আলাদা করা। (যেমন: ১ থেকে ১০০ ইউজার এক জায়গায়, ১০১ থেকে ২০০ ইউজার অন্য জায়গায়)।
২. Database Sharding (শার্ডিং)
শার্ডিং হলো হরাইজন্টাল পার্টিশনিং এর একটি অ্যাডভান্সড রূপ, যেখানে ডেটা বিভিন্ন সার্ভারে ভাগ করে দেওয়া হয়। শার্ডিং এর ফলে প্রতিটি সার্ভার স্বাধীনভাবে কাজ করতে পারে।
শার্ডিং কিভাবে কাজ করে? (Sharding Key)
ডেটাকে কিভাবে ভাগ করা হবে তা একটি 'Shard Key' এর ওপর নির্ভর করে।
- Range-based: ইউজারের আইডির রেঞ্জ অনুযায়ী ভাগ করা (যেমন: এশিয়া রিজিয়ন এর ইউজার এক সার্ভারে, আমেরিকা অন্য সার্ভারে)।
- Hash-based: ইউজারের আইডিকে হ্যাশ ফাংশনে পাঠিয়ে পাওয়া ভ্যালু অনুযায়ী সার্ভার সিলেক্ট করা। এতে ডেটা সমানভাবে ডিস্ট্রিবিউটেড থাকে।
৩. শার্ডিং এর চ্যালেঞ্জসমূহ
- Complexity: অ্যাপ্লিকেশন কোডকে জানতে হবে কোন ডেটা কোন শার্ডে (সার্ভারে) আছে। এর জন্য একটি 'Routing Layer' প্রয়োজন হতে পারে।
- Joins across Shards: বিভিন্ন শার্ড বা সার্ভারের মধ্যে জয়েন (Join) অপারেশন চালানো অসম্ভব বা অত্যন্ত সময়সাপেক্ষ।
- Rebalancing: যদি কোনো শার্ড একদম পূর্ণ হয়ে যায়, তবে ডেটা নতুন করে ভাগ করা (Resharding) বেশ কঠিন কাজ।
পার্থক্য একনজরে
| তুলনা | Partitioning | Sharding |
|---|---|---|
| অবস্থান | একটি সিঙ্গেল সার্ভারে হতে পারে | অবশ্যই একাধিক ডিস্ট্রিবিউটেড সার্ভারে |
| উদ্দেশ্য | ডেটা ম্যানেজমেন্ট সহজ করা | স্কেলেবিলিটি ও পারফরম্যান্স বাড়ানো |
| নির্ভরতা | মেইন ডিবি সার্ভারের ওপর নির্ভর | প্রতিটি শার্ড স্বাধীন |
IMPORTANT
বড় সিস্টেমের ক্ষেত্রে Sharding হলো শেষ আশ্রয়। শার্ডিং করার আগে অবশ্যই ইনডেক্সিং এবং ক্যাশিং অপটিমাইজ করা উচিত, কারণ শার্ডিং সিস্টেমের জটিলতা বহুগুণ বাড়িয়ে দেয়।