Database Scaling Techniques (ডিপ ডাইভ)
সিস্টেমের ইউজার এবং ট্রাফিক বাড়ার সাথে সাথে ডাটাবেসের ওপর চাপ বাড়তে থাকে। এই চাপ সামলানোর জন্য বিভিন্ন স্কেলিং টেকনিক ব্যবহার করা হয়। নিচে সেরা ১৫টি টেকনিক এবং সেগুলোর বিস্তারিত আলোচনা করা হলো।
১. টপ ১৫ ডাটাবেস স্কেলিং টেকনিক
১. Indexing: দ্রুত ডেটা খুঁজে পাওয়ার জন্য। ২. Database Replication: ডেটার কপি অন্য সার্ভারে রাখা। ৩. Vertical Scaling: সার্ভারের ক্ষমতা বাড়ানো। ৪. Horizontal Scaling (Sharding): ডেটা ভাগ করে অন্য সার্ভারে রাখা। ৫. Database Partitioning: বড় টেবিলকে ছোট ছোট টুকুরা করা। ৬. Caching: বারবার ব্যবহৃত ডেটা মেমরিতে রাখা। ৭. Read/Write Splitting: রিড এবং রাইট আলাদা সার্ভারে পাঠানো। ৮. Denormalization: জয়েন কমাতে ডেটা ডুপ্লিকেট করা। ৯. Connection Pooling: ডাটাবেস কানেকশন রিইউজ করা। ১০. Query Optimization: কুয়েরি লজিক উন্নত করা। ১১. Database Clustering: একাধিক সার্ভারকে একটি গ্রুপ হিসেবে ব্যবহার। ১২. Data Compression: স্টোরেজ এবং নেটওয়ার্ক ব্যান্ডউইথ বাঁচাতে। ১৩. Change Data Capture (CDC): রিয়েল-টাইম ডেটা সিংক্রোনাইজেশন। ১৪. NoSQL adoption: কিছু রিকোয়েস্টের জন্য NoSQL ব্যবহার। ১৫. Vertical Partitioning: কলাম ভিত্তিক টেবিল ভাগ করা।
২. মেইন কনসেপ্টস
ক. ইনডেক্সিং (Indexing)
ইনডেক্সিং হলো ডাটাবেসের বইয়ের 'ইনডেক্স' বা সূচিপত্রের মতো। এটি ফুল টেবিল স্ক্যান না করে সরাসরি ডেটা খুঁজে পেতে সাহায্য করে। তবে অতিরিক্ত ইনডেক্সিং রাইট পারফরম্যান্স কমিয়ে দেয়।
খ. শার্ডিং বনাম পার্টিশনিং (Sharding vs Partitioning)
- Partitioning: এটি সাধারণত একটি সিঙ্গেল সার্ভারের মধ্যে কাজ করে। একটি বড় টেবিলকে লজিক্যালি ছোট করা হয় (উদা: বছর অনুযায়ী আলাদা করা)।
- Sharding: এটি একটি Horizontal Scaling পদ্ধতি। ডেটা ফিজিক্যালি ভিন্ন ভিন্ন সার্ভারে রাখা হয়। এটি অনেক বেশি স্কেলেবল।
গ. রেপ্লিকেশন (Replication)
ডাটাবেস রেপ্লিকেশনে একটি Master সার্ভার থাকে যেখানে রাইট করা হয় এবং অনেকগুলো Slave/Read Replicas থাকে যেখান থেকে রিড করা হয়। এটি সিস্টেমের এভেইল্যাবিলিটি বাড়ায়।
ঘ. ডিনরমালাইজেশন (Denormalization)
রিলেশনাল ডাটাবেসে জয়েন করতে অনেক সময় লাগে। পারফরম্যান্স বাড়াতে আমরা মাঝেমধ্যে ডেটা ডুপ্লিকেট করে রাখি যাতে একটা কুয়েরিতেই সব ডেটা পাওয়া যায়। তবে এতে ডেটা কনসিস্টেন্সি রক্ষা করা কঠিন হয়।
ঙ. ডেটা কম্প্রেশন (Data Compression)
বড় ডাটাবেসের ক্ষেত্রে স্টোরেজ খরচ কমাতে ডেটা কম্প্রেস করে রাখা হয়। এতে ব্যান্ডউইথ কম লাগে কিন্তু ডেটা রিড/রাইট করার সময় CPU এর ওপর কিছুটা চাপ বাড়ে।
৩. শার্ডিং স্ট্যাটেজি (Sharding Strategies)
ইন্টারভিউতে শার্ডিং কীভাবে করবেন তা নিয়ে অনেক প্রশ্ন হয়। প্রধান ৩টি পদ্ধতি হলো:
১. Key-based (Hash) Sharding: কোনো একটি ভ্যালুর (উদা: User ID) হ্যাশ ব্যবহার করে সার্ভার ঠিক করা। এতে ডেটা সমানভাবে ডিস্ট্রিবিউট হয়। ২. Range-based Sharding: ডেটার নির্দিষ্ট রেঞ্জ অনুযায়ী সার্ভার ভাগ করা (উদা: A-M এক সার্ভারে, N-Z অন্য সার্ভারে)। এটি রেঞ্জ কুয়েরির জন্য ভালো। ৩. Directory-based Sharding: একটি আলাদা লুকআপ টেবিল রাখা যেখানে লেখা থাকে কোন ডেটা কোন সার্ভারে আছে। এটি ফ্লেক্সিবল কিন্তু লুকআপ টেবিলটি একটি SPOF হতে পারে।
৪. সাধারণ ইন্টারভিউ প্রশ্নোত্তর (General Q&A)
প্রশ্ন ১: রেপ্লিকেশন ল্যাগ (Replication Lag) কী এবং এটি কীভাবে সমাধান করবেন?উত্তর: যখন মাস্টার সার্ভারে ডেটা রাইট হওয়ার পর স্লেভ সার্ভারে আপডেট হতে কিছুটা দেরি হয়, তাকে রেপ্লিকেশন ল্যাগ বলে। সমাধান হিসেবে Read-your-own-writes নিশ্চিত করতে ডেটা লেখার পর প্রথম কয়েক সেকেন্ড রিকোয়েস্ট মাস্টার সার্ভারে পাঠানো যেতে পারে।
প্রশ্ন ২: হট শার্ড (Hot Shard) বলতে কী বোঝায়?উত্তর: যখন শার্ডিং করার পর কোনো একটি নির্দিষ্ট শার্ডে (Server) অন্যদের তুলনায় অনেক বেশি ট্রাফিক আসে, তখন তাকে হট শার্ড বলে। এটি এড়াতে হ্যাশ ফাংশন পরিবর্তন করা বা শার্ড সাব-ডিভাইড করা প্রয়োজন।
প্রশ্ন ৩: ভার্টিক্যাল পার্টিশনিং (Vertical Partitioning) এর একটি উদাহরণ দিন।উত্তর: ধরুন একটি 'User' টেবিলে অনেকগুলো কলাম আছে। যদি নাম আর ইমেইল বারবার লাগে কিন্তু ইউজারের বড় 'Bio' কলামটি কম লাগে, তবে Bio কলামটি আলাদা টেবিলে নিয়ে যাওয়াই হলো ভার্টিক্যাল পার্টিশনিং।
প্রশ্ন ৪: ক্যাসকেডিং ফেইলিওর (Cascading Failure) কীভাবে আটকাবেন?উত্তর: একটি ডাটাবেস ফেইল করলে ট্রাফিক অন্যগুলোতে গিয়ে সেগুলোকেও ডাউন করে দিতে পারে। এটি আটকাতে Circuit Breaker এবং Exponential Backoff মেকানিজম ব্যবহার করা হয়।
৫. উন্নত সিনারিও ভিত্তিক প্রশ্ন (Advanced Scenario Questions)
সিনারিও ১: "আপনি অ্যামাজনের মতো একটি গ্লোবাল ই-কমার্স সিস্টেম ডিজাইন করছেন। আপনার ডাটাবেস কীভাবে গ্লোবালি স্কেল করবেন?"
সমাধান: ১. Multi-Region Deployment: বিভিন্ন মহাদেশে আলাদা আলাদা ডাটাবেস ক্লাস্টার থাকবে। ২. Geo-routing: ইউজারের লোকেশন অনুযায়ী সবচেয়ে কাছের রিজিয়ন থেকে ডেটা সার্ভ করা হবে। ৩. Active-Active Replication: গুরুত্বপূর্ণ ডেটার জন্য একাধিক রিজিয়নে মাস্টার সার্ভার রাখা যেতে পারে যাতে এক রিজিয়ন ডাউন হলেও অন্যটি কাজ করে।
সিনারিও ২: "আপনার সিস্টেমে রাইট রিকোয়েস্ট অনেক বেশি এবং ডাটাবেস লোড নিতে পারছে না। কিন্তু আপনি চাচ্ছেন না এখনই শার্ডিং করতে। বিকল্প কী?"
সমাধান: ১. Batch Writing: রিকোয়েস্টগুলো সাথে সাথে রাইট না করে কিছুক্ষণ জমিয়ে (Buffer) একসাথে রাইট করা। ২. Asynchronous Processing: মেসেজ কিউ (Kafka/RabbitMQ) ব্যবহার করা। ইউজারকে 'Success' মেসেজ দিয়ে ব্যাকগ্রাউন্ডে রাইট করা হবে।
সিনারিও ৩: "শার্ডিং করার পর আপনি যদি জয়েন (JOIN) কুয়েরি করতে চান, তবে সেটি কীভাবে করবেন?"
সমাধান: শার্ডিংয়ে ক্রস-সার্ভার জয়েন অনেক ব্যয়বহুল। ১. Denormalization: ডেটা এমনভাবে ডিজাইন করা যাতে জয়েন না লাগে। ২. In-memory Aggregation: আলাদা আলাদা সার্ভার থেকে ডেটা এনে অ্যাপ্লিকেশন লেভেলে জয়েন করা। ৩. Global Tables: ছোট টেবিলগুলো (উদা: কান্ট্রি লিস্ট) সব শার্ডে কপি করে রাখা।
IMPORTANT
ডাটাবেস স্কেলিং করার আগে সবসময় Query Optimization এবং Indexing দিয়ে চেষ্টা করা উচিত। এগুলো কাজ না করলে তখন শার্ডিং বা রেপ্লিকেশনের মতো জটিল এবং ব্যয়বহুল পদ্ধতিতে যাওয়া উচিত।