Database Sharding কী? (ব্যাখ্যা বাংলায়)
Database Sharding হল এমন একটি পদ্ধতি, যেখানে ডাটাবেসকে ছোট ছোট অংশে বিভক্ত করা হয়। প্রত্যেকটি অংশকে বলা হয় “Shard”। মূলত যখন আপনার অ্যাপ্লিকেশনের ডাটাবেস খুব বড় হয় এবং একক সার্ভারে ডাটাবেস ম্যানেজ করা কঠিন হয়ে যায়, তখন আমরা শার্ডিং ব্যবহার করি। প্রতিটি শার্ড একটি স্বাধীন ডাটাবেসের মতো কাজ করে, এবং এতে ডাটা সংরক্ষণ করে স্কেলিং এর সুবিধা পাওয়া যায়।
কেন শার্ডিং দরকার?
ধরুন, আপনার একটি ই-কমার্স অ্যাপ্লিকেশন আছে যেখানে লক্ষ লক্ষ প্রোডাক্ট, ইউজার, এবং ট্রানজেকশন ডাটা রয়েছে। একটি বড় ডাটাবেস সার্ভার যদি একা এই ডাটাগুলো হ্যান্ডেল করতে পারে না বা সার্ভার স্লো হয়ে যায়, তখন আমরা শার্ডিং ব্যবহার করে এই ডাটাগুলোকে একাধিক সার্ভারে ভাগ করে রাখতে পারি।
শার্ডিং এর মূল ধারণা
- Horizontal Sharding: ডাটাকে সারির মাধ্যমে ভাগ করা হয়। প্রতিটি শার্ডে কিছু নির্দিষ্ট ডাটা থাকে।
- Vertical Sharding: কলাম বা ডাটার টাইপ অনুযায়ী বিভক্ত করা হয়।
Database Sharding with TypeORM এবং MySQL: একটি পূর্ণাঙ্গ টিউটোরিয়াল (বাংলা)
এই টিউটোরিয়ালে আমরা শিখবো কিভাবে Database Sharding করা হয়, এবং কিভাবে TypeORM এবং MySQL ব্যবহার করে তা প্রয়োগ করা যায়। পুরো প্রক্রিয়াটি ভাগ করা হয়েছে বেশ কয়েকটি অংশে, যাতে সহজভাবে শিখতে পারেন।
Step 1: প্রজেক্ট সেটআপ এবং TypeORM ইনস্টল
প্রথমে আমরা একটি নতুন Node.js প্রজেক্ট তৈরি করবো এবং TypeORM, MySQL2, ও Express প্যাকেজগুলো ইনস্টল করবো। এই প্যাকেজগুলো আমাদের অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে যোগাযোগ স্থাপন করবে।
mkdir typeorm-sharding-example
cd typeorm-sharding-example
npm init -y
npm install express mysql2 typeorm
এখন আমাদের প্রজেক্ট রেডি। আমরা টাইপওআরএমের সাহায্যে ডাটাবেস শার্ডিং কনফিগার করবো।
Step 2: MySQL ডাটাবেস সেটআপ
আমাদের অ্যাপ্লিকেশনের ডাটাবেস দুইটি শার্ডে ভাগ হবে। আমরা MySQL সার্ভারের দুটি আলাদা ডাটাবেস তৈরি করবো।
Shard 1: product_shard_1
ডাটাবেস Shard 2: product_shard_2
ডাটাবেস
প্রথমে, MySQL ক্লায়েন্টে গিয়ে দুইটি ডাটাবেস তৈরি করুন:
CREATE DATABASE product_shard_1;
CREATE DATABASE product_shard_2;
এখন আমরা এই দুইটি ডাটাবেসে ডাটা সংরক্ষণ করবো এবং TypeORM দিয়ে শার্ডিং লজিক প্রয়োগ করবো।
Step 3: TypeORM কনফিগারেশন
আমাদের অ্যাপ্লিকেশনের জন্য দুইটি আলাদা ডাটাবেস কানেকশন সেটআপ করতে হবে। প্রতিটি ডাটাবেসের আলাদা সংযোগ কনফিগার করা হবে, যেগুলো আমরা শার্ড হিসেবে ব্যবহার করবো।
প্রথমে, ormconfig.js
নামে একটি ফাইল তৈরি করুন এবং নিচের মতো কনফিগারেশন লিখুন:
module.exports = [
{
name: 'shard1', // শার্ড ১ এর নাম
type: 'mysql', // ডাটাবেস টাইপ
host: 'localhost', // ডাটাবেস সার্ভারের হোস্ট
port: 3306, // MySQL এর ডিফল্ট পোর্ট
username: 'root', // MySQL ইউজারনেম
password: 'password', // MySQL পাসওয়ার্ড
database: 'product_shard_1', // প্রথম শার্ডের ডাটাবেস নাম
synchronize: true, // এই অপশনটি টেবিল স্বয়ংক্রিয়ভাবে তৈরি করবে
entities: ['src/entity/*.js'], // এন্টিটির অবস্থান
},
{
name: 'shard2', // শার্ড ২ এর নাম
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'product_shard_2', // দ্বিতীয় শার্ডের ডাটাবেস নাম
synchronize: true,
entities: ['src/entity/*.js'],
},
];
ব্যাখ্যা:
- এখানে দুইটি আলাদা কানেকশন কনফিগার করা হয়েছে
shard1
এবংshard2
নামে। প্রতিটি কনফিগারেশন তাদের ডাটাবেস, হোস্ট, ইউজারনেম, পাসওয়ার্ড এবং এন্টিটির অবস্থান নির্দেশ করে।
Step 4: Entity তৈরি করা
আমরা এখন প্রোডাক্টের জন্য একটি Entity তৈরি করবো। এই Entity মডেলের মাধ্যমে ডাটাবেসে টেবিল তৈরি হবে এবং ডাটা সংরক্ষণ করা হবে। TypeORM এর Entity Schema ব্যবহার করে এটি তৈরি করা হবে।
src/entity/Product.js
ফাইল তৈরি করুন:
const { EntitySchema } = require('typeorm');
// Product এর জন্য একটি Entity Schema তৈরি করা হয়েছে
module.exports = new EntitySchema({
name: 'Product', // Entity এর নাম
tableName: 'products', // ডাটাবেসে টেবিলের নাম
columns: {
id: {
type: 'int', // ID হবে ইন্টিজার টাইপ
primary: true, // এটি প্রাইমারি কী
generated: true, // অটোমেটিকালি ID তৈরি হবে
},
name: {
type: 'varchar', // প্রোডাক্টের নাম
nullable: false, // এই ফিল্ডটি ফাঁকা রাখা যাবে না
},
price: {
type: 'decimal', // প্রোডাক্টের দাম
nullable: false,
},
category: {
type: 'varchar', // প্রোডাক্টের ক্যাটেগরি
nullable: false,
},
},
});
ব্যাখ্যা:
- এখানে Product নামে একটি Entity তৈরি করা হয়েছে, যার টেবিলের নাম হবে
products
। এতে তিনটি কলাম রয়েছে –name
,price
, এবংcategory
। এছাড়া একটিid
ফিল্ড থাকবে যা প্রাইমারি কী হিসেবে কাজ করবে।
Step 5: শার্ডিং লজিক প্রয়োগ করা
এবার আমরা একটি Express API তৈরি করবো, যা প্রোডাক্ট যোগ করার সময় শার্ড নির্বাচন করবে। প্রোডাক্টের ক্যাটেগরি অনুযায়ী আমরা শার্ড নির্বাচন করবো।
index.js
ফাইল তৈরি করুন:
const express = require('express');
const { createConnections, getConnection } = require('typeorm');
const app = express();
app.use(express.json());
// দুইটি শার্ডের জন্য কানেকশন তৈরি করা হচ্ছে
createConnections()
.then(() => {
console.log('Connected to both shards.');
})
.catch((error) => console.log('Error: ', error));
// প্রোডাক্ট যোগ করার API
app.post('/add-product', async (req, res) => {
const { name, price, category } = req.body;
// ক্যাটেগরি অনুযায়ী শার্ড নির্বাচন করা হচ্ছে
let connection;
if (category === 'electronics') {
connection = getConnection('shard1'); // ইলেকট্রনিক্স ক্যাটেগরির জন্য shard1 ব্যবহার হবে
} else {
connection = getConnection('shard2'); // অন্যান্য ক্যাটেগরির জন্য shard2 ব্যবহার হবে
}
const productRepository = connection.getRepository('Product'); // প্রোডাক্টের রেপোজিটরি তৈরি করা
const newProduct = productRepository.create({ name, price, category }); // নতুন প্রোডাক্ট তৈরি করা
await productRepository.save(newProduct); // প্রোডাক্ট ডাটাবেসে সংরক্ষণ করা
res.json({ message: 'Product added!', product: newProduct }); // রেসপন্সে প্রোডাক্ট দেখানো
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
ব্যাখ্যা:
- প্রথমে আমরা দুইটি শার্ডের জন্য কানেকশন তৈরি করেছি। এরপর যখন প্রোডাক্ট যোগ করা হবে, তখন ক্যাটেগরি অনুযায়ী শার্ড নির্বাচন করা হবে। যদি প্রোডাক্টটি electronics ক্যাটেগরির হয়, তাহলে আমরা Shard 1 এ তা সংরক্ষণ করবো। অন্য কোনো ক্যাটেগরি হলে তা Shard 2 এ সংরক্ষণ করা হবে।
Step 6: ডাটাবেসে ডাটা সংরক্ষণ এবং রিটার্ন করা
প্রোডাক্ট যোগ করা
API কলের মাধ্যমে নতুন প্রোডাক্ট যোগ করা হলে তা সংশ্লিষ্ট শার্ডে সংরক্ষণ হবে। উদাহরণস্বরূপ:
POST /add-product
{
"name": "Smartphone",
"price": 600,
"category": "electronics"
}
- এই প্রোডাক্ট Shard 1 এ সংরক্ষিত হবে কারণ এর ক্যাটেগরি electronics।
POST /add-product
{
"name": "Shoes",
"price": 50,
"category": "fashion"
}
- এই প্রোডাক্ট Shard 2 এ সংরক্ষিত হবে কারণ এর ক্যাটেগরি fashion।
ডাটাবেসে ডাটা স্টোরের ধরণ
- Shard 1 এর ডাটাবেস
product_shard_1
এ ইলেকট্রনিক্স প্রোডাক্ট সংরক্ষণ হবে। - Shard 2 এর ডাটাবেস
product_shard_2
এ অন্যান্য প্রোডাক্ট সংরক্ষণ হবে।
Step 7: সারসংক্ষেপ
কেন শার্ডিং গুরুত্বপূর্ণ?
- যখন আপনার অ্যাপ্লিকেশনে প্রচুর ডাটা থাকে, তখন শার্ডিং করলে সার্ভারের লোড কমে এবং পারফরম্যান্স বৃদ্ধি পায়।
কিভাবে কাজ করে?
- TypeORM ব্যবহার করে আমরা প্রোডাক্টকে দুইটি শার্ডে ভাগ করেছি, যেখানে ক্যাটেগরির উপর ভিত্তি করে ডাটাবেস নির্বাচন করা হয়।
এই প্রক্রিয়া থেকে শিখলাম, কিভাবে একটি ডাটাবেস অ্যাপ্লিকেশন শার্ডিং করে আরও স্কেলেবল এবং পারফরম্যান্ট করা যায়।