> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/databases/sharding.md).

# Sharding

### **শার্ডিং কি?**

শার্ডিং হলো একটি ডাটা স্টোরেজ কৌশল, যেখানে বড় ডাটাবেস বা সিস্টেমকে ছোট ছোট অংশে ভাগ করা হয়, যা প্রতিটি অংশ **শার্ড** নামে পরিচিত। এর মূল উদ্দেশ্য হলো ডাটাবেসের পারফরম্যান্স বৃদ্ধি করা, লোড ভারসাম্য বজায় রাখা এবং বড় আকারের ডাটা দ্রুত প্রোসেসিং করতে সহায়তা করা।

### **কেন শার্ডিং প্রয়োজন?**

যখন একটি সিস্টেম অনেক বড় এবং বিশাল পরিমাণ ডেটা পরিচালনা করে, তখন একটিমাত্র সার্ভারে সব ডাটা রাখতে গেলে সিস্টেমটি ধীর হয়ে যায়। এটি সিস্টেমের স্কেলেবিলিটি এবং পারফরম্যান্সে সমস্যা সৃষ্টি করতে পারে। শার্ডিং সেই সমস্যা সমাধান করে, কারণ এটি ডাটাকে ছোট অংশে ভাগ করে দেয়, যা পৃথক সার্ভারে স্টোর করা হয়, ফলে ডেটা ম্যানেজমেন্ট অনেক সহজ এবং দ্রুত হয়।

### **শার্ডিংয়ের প্রধান সুবিধা:**

1. **স্কেলেবিলিটি**: শার্ডিংয়ের মাধ্যমে সিস্টেম আরও ভালোভাবে স্কেল করা যায়। যেমন, যদি এক সার্ভারে ডেটা রাখা হয় এবং সেই সার্ভারের স্টোরেজ ফুল হয়ে যায়, তখন নতুন একটি শার্ড বা সার্ভার যোগ করা সহজ।
2. **পারফরম্যান্স**: শার্ডিংয়ের কারণে প্রতিটি সার্ভার শুধু নিজের শার্ডটি নিয়ে কাজ করে, তাই সার্ভারের উপর চাপ কমে এবং ডেটা রিড/রাইট অপারেশন অনেক দ্রুত হয়।
3. **লোড ভারসাম্য**: ডেটাকে বিভিন্ন সার্ভারে ভাগ করার কারণে, সিস্টেমের উপর লোড সমানভাবে বণ্টিত থাকে, যা সিস্টেমের স্থায়িত্ব এবং পারফরম্যান্স নিশ্চিত করে।
4. **ফল্ট টলারেন্স**: শার্ডিংয়ে যদি একটি শার্ডে সমস্যা হয়, অন্য শার্ডগুলো স্বাভাবিকভাবে কাজ চালিয়ে যেতে পারে, ফলে পুরো সিস্টেম থেমে যায় না।

### **কিভাবে শার্ডিং কাজ করে?**

শার্ডিং করতে হলে ডেটাকে এমনভাবে ভাগ করতে হয় যাতে প্রতিটি শার্ডের মধ্যে ডেটা প্রপার্টলি বিতরণ হয় এবং অগ্রাধিকার দেয়া যায়। শার্ডিংয়ের কিছু সাধারণ পদ্ধতি হলো:

1. **হ্যাশ শার্ডিং**: এখানে ডেটার একটি নির্দিষ্ট অংশ (যেমন, প্রাথমিক কী বা ID) নিয়ে একটি হ্যাশ ফাংশন প্রয়োগ করা হয়, এবং হ্যাশ ভ্যালুর ভিত্তিতে ডেটা বিভিন্ন শার্ডে বন্টন করা হয়।
2. **রেঞ্জ শার্ডিং**: এই পদ্ধতিতে ডেটাকে রেঞ্জ অনুসারে ভাগ করা হয়। উদাহরণস্বরূপ, যেকোনো ডেটার একটি নির্দিষ্ট পরিসরের উপর ভিত্তি করে শার্ড করা হয়। যেমন, বয়সের উপর ভিত্তি করে ডেটা বিভক্ত করা।
3. **ট্যাগ বা কাস্টম শার্ডিং**: এই পদ্ধতিতে ডেটার মধ্যে নির্দিষ্ট কিছু ট্যাগ বা কাস্টম লজিকের উপর ভিত্তি করে শার্ডিং করা হয়।

### **শার্ডিংয়ের চ্যালেঞ্জ:**

1. **ডেটার কনসিস্টেন্সি**: শার্ডিংয়ের ফলে, ডেটা বিভিন্ন শার্ডে বিভক্ত হয়ে যায়। এটি কনসিস্টেন্সি সমস্যার সৃষ্টি করতে পারে, বিশেষ করে যদি ডিস্ট্রিবিউটেড ট্রানজেকশন না করা হয়।
2. **কমপ্লেক্স কোয়েরি**: যদি ডেটা বিভিন্ন শার্ডে থাকে, তাহলে কোনো কোয়েরি যা একাধিক শার্ডে ডেটা চায়, তা অনেক বেশি জটিল হতে পারে এবং পারফরম্যান্সে প্রভাব ফেলতে পারে।
3. **ব্যাকআপ এবং রিকভারি**: শার্ডিংয়ের মধ্যে যদি কোনো একটি শার্ড ডাউন হয়, বা ডেটা হারিয়ে যায়, তখন পুরো সিস্টেমের রিকভারি কঠিন হতে পারে, কারণ ডেটা বিভক্তভাবে থাকে।

শার্ডিং একটি শক্তিশালী কৌশল যা সিস্টেমের স্কেলেবিলিটি এবং পারফরম্যান্স উন্নত করতে সাহায্য করে। তবে এর সাথে কিছু চ্যালেঞ্জও থাকে, যেমন ডেটার কনসিস্টেন্সি এবং কোয়েরি অপটিমাইজেশন। সঠিকভাবে শার্ডিং প্রয়োগ করতে হলে, সিস্টেমের নির্দিষ্ট প্রয়োজন এবং সমস্যা সমাধানে দক্ষতা থাকতে হবে।
