পার্টিশনিং-এর রকমফের
ভাগাভাগির তরিকা
বল্টু ভাই হোয়াইটবোর্ডে একটা চারকোনা বক্স এঁকে বোঝানো শুরু করলেন, "শোন, ডাটার এই ভাগাভাগি করার প্রধানত দুটো রাস্তা আছে। ধর, তোকে একটা কাগজে একটা বড় টেবিল এঁকে দিলাম, আর তোর হাতে একটা কাঁচি ধরিয়ে বললাম এটাকে দুই ভাগে ভাগ কর। তুই কী করবি? তুই চাইলে কাগজটাকে আড়াআড়ি (Row বরাবর) কাটতে পারিস, অথবা লম্বালম্বি (Column বরাবর) কাটতে পারিস। ডাটাবেসের ক্ষেত্রেও কনসেপ্টটা ঠিক একই। চল, বিস্তারিত বলছি।"

১. আড়াআড়ি ভাগ: হরাইজন্টাল পার্টিশনিং (বা শার্ডিং)
"ধর, তুই সিদ্ধান্ত নিলি তোর ডাটাবেসের 'ইউজার (User)' টেবিলটাকে দুই ভাগে ভাগ করবি। তোর সিস্টেমে সব ইউজারের একটা ইউনিক নিউমেরিক্যাল আইডি আছে। তুই লজিক সেট করলি, যাদের আইডি জোড় সংখ্যা, তাদের ডাটা থাকবে 'সার্ভার-এ (A)'-তে, আর যাদের বিজোড়, তারা থাকবে 'সার্ভার-বি (B)'-তে। ব্যাস, হয়ে গেল হরাইজন্টাল পার্টিশনিং! একেই আমরা সাধারণত শার্ডিং (Sharding) বলে থাকি। এখন কোনো ইউজার লগইন করলে তোর অ্যাপ শুধু তার আইডির দিকে তাকাবে, জোড়-বিজোড় হিসাব করবে, আর সরাসরি তাকে নির্দিষ্ট সার্ভার বা শার্ডে পাঠিয়ে দেবে।"
মন্টু খুশিতে লাফিয়ে উঠল, "বাহ, দারুণ সোজা তো! তাহলে আমি যদি ডাটাবেস ৩ ভাগে ভাগ করতে চাই, জোড়-বিজোড়ের বদলে শুধু ৩ দিয়ে মড (modulus) করে দিলেই তো হলো, তাই না ভাই?"
বল্টু ভাই মুচকি হেসে বললেন, "অতটাও সোজা না রে চান্দু! এই শার্ডিং কীভাবে করতে হবে, তার বেশ কিছু জ্যামিতি আছে। ভুল টেকনিক সিলেক্ট করলে পরে যখন সার্ভার বাড়াতে বা কমাতে যাবি, তখন বিশাল বিপদে পড়বি। ওটা নিয়ে পরে আসছি, আগে বেসিকটা ক্লিয়ার করি।"
২. লম্বালম্বি ভাগ: ভার্টিক্যাল পার্টিশনিং
বল্টু ভাই এবার মন্টুর দিকে ফিরে প্রশ্ন করলেন, "আচ্ছা মন্টু, বল তো, তোর বিড়ালটিউবের 'ভিডিও মেটাডাটা' টেবিলে এখন কতগুলো কলাম আছে?"
— "ভাই, শ'খানেকের ওপরে তো হবেই! ভিডিওর সাইজ, রেজোলিউশন, আপলোড ডেট, লাইক, ডিসলাইক—কত কী যে ঢোকাতে হয়েছে সেখানে!"
— "ঠিক যা ভেবেছিলাম! এখন বল, কোনো ইউজার যখন হোমপেজে জাস্ট একটা ভিডিওর থাম্বনেইল আর টাইটেল দেখতে চায়, তখন কি তোর ওই শ'খানেক কলামের ডাটা দরকার পড়ে?"
— "না ভাই, হাতে গোনা ১৫-২০টা কলাম হলেই চলে। বাকিগুলো তো ভিডিও প্লে করার পর বা অ্যানালিটিক্সের কাজে লাগে।"
— "তাহলে তুইই বল, ওই ১৫-২০টা দরকারি ডাটার জন্য প্রতিবার তোর ডাটাবেসকে ১০০টা কলাম স্ক্যান করতে হচ্ছে! এতে মেমরি আর পারফরম্যান্স দুটোর ওপরেই তো ফালতু চাপ পড়ছে। এর সমাধান হলো ভার্টিক্যাল পার্টিশনিং (Vertical Partitioning)। তুই চাইলে ওই বড় টেবিলটাকে লম্বালম্বি কেটে কয়েকটা আলাদা টেবিল বানিয়ে ফেলতে পারিস। যেমন: বেসিক ইনফোর জন্য একটা টেবিল (টাইটেল, থাম্বনেইল), আর অ্যাডভান্সড ইনফোর জন্য আরেকটা টেবিল। এরপর শুধু 'ভিডিও আইডি' দিয়ে টেবিলগুলোকে কানেক্ট করে রাখবি। এতে করে হোমপেজ লোড হওয়ার সময় তোর অ্যাপ শুধু ছোট টেবিলটায় খুঁজবে, বড়টায় হাতই দেবে না।"
মন্টু একটু মন খারাপ করে বলল, "এভাবে তো ভেবে দেখিনি! আমি তো তাড়াহুড়ো করে এক টেবিলেই সব ঢুকিয়ে দিয়েছিলাম। আগে জানলে তো শুরু থেকেই সুন্দর করে আলাদা টেবিল বানাতাম।"
বল্টু ভাই মন্টুর কাঁধে হাত রেখে হাসিমুখে বললেন, "আরে বোকা, এই জায়গাতেই তো তুই ভুল ভাবছিস! তুই একদম ঠিক কাজই করেছিস। যখন তুই কাজ শুরু করেছিস, তখন তোর ইউজার ছিল কম, বাজেট ছিল না, আর হাতে সময়ও ছিল কম। তখন যদি তুই এসব হাই-এন্ড অপটিমাইজেশন নিয়ে বসে থাকতি, তাহলে আজকের এই বিড়ালটিউব হয়তো আলোর মুখই দেখতো না! শুরুতেই সব পারফেক্ট করার এই খুঁতখুঁতে স্বভাবকে সফটওয়্যার ইঞ্জিনিয়ারিংয়ের ভাষায় বলে 'প্রিম্যাচিউর অপটিমাইজেশন' (Premature Optimization), যা সব মন্দের মূল। এখন তোর ইউজার বাড়ছে, স্কেল করা দরকার হচ্ছে, তাই তুই সিস্টেম রিডিজাইন করছিস। স্টার্টআপ বা ছোট টিমের জন্য এটাই সবচেয়ে পারফেক্ট অ্যাপ্রোচ।"
৩. দুদিক দিয়েই কোপ: হাইব্রিড পার্টিশনিং
মন্টুর মুখে আবার হাসি ফুটল, "থ্যাংকস ভাই, টেনশন কমিয়ে দিলেন! তার মানে আমরা এই দুইভাবেই ডাটা ভাগ করতে পারি?"
— "দাঁড়া, আরেকটা ব্রহ্মাস্ত্র আছে। বড় বড় সিস্টেমে শুধু একভাবে কাটলে কাজ হয় না। ডাটাবেসকে অপটিমাইজ করার জন্য লম্বালম্বি কলামও ভাগ করতে হয়, আবার লোড ব্যালেন্স করার জন্য আড়াআড়ি শার্ডিংও করতে হয়। যখন এই দুটো মেথড একসাথে অ্যাপ্লাই করা হয়, তখন তাকে বলে হাইব্রিড পার্টিশনিং (Hybrid Partitioning)। ইন্ডাস্ট্রির বড় বড় সব সিস্টেমেই এই হাইব্রিড মডেল বেশি দেখা যায়।"
মন্টু মাথা নেড়ে সম্মতি জানাল, "পুরো ক্লিয়ার ভাই! তাহলে আমি গিয়ে ডাটা কাটাকুটির কাজ শুরু করে দিই। কিন্তু ওই যে বললেন শার্ডিং করারও আবার আলাদা টেকনিক আছে, সেগুলো কী?"