ExpressJs

⌘K
  1. Home
  2. Docs
  3. ExpressJs
  4. Database Sharding and Rep...
  5. MySQL Replication with Node.js and TypeORM

MySQL Replication with Node.js and TypeORM

MySQL Replication with Node.js and TypeORM (in Bangla)

এই টিউটোরিয়ালে আমরা শিখব কিভাবে দুইটি আলাদা Ubuntu সার্ভার ব্যবহার করে MySQL Master-Slave Replication সেটআপ করতে হয় এবং সেই রেপ্লিকেশনকে Node.js এবং TypeORM দিয়ে পরিচালনা করতে হয়।

আমরা যে বিষয়গুলো শিখব:

  1. Database Replication কী এবং কেন এটি গুরুত্বপূর্ণ।
  2. কিভাবে MySQL Master-Slave Replication সেটআপ করতে হয়।
  3. কিভাবে Node.js এবং TypeORM এর মাধ্যমে Master-Slave ডাটাবেস থেকে ডেটা লিখা এবং পড়া যায়।

১. Database Replication কী এবং কেন এটি প্রয়োজন?

Replication:

Replication এর মানে হলো একটি ডাটাবেসের ডেটাকে অন্য একটি ডাটাবেসে কপি করে রাখা, যাতে মূল ডাটাবেসে কোনো পরিবর্তন ঘটলে তা অন্য ডাটাবেসে প্রতিফলিত হয়। MySQL এর ক্ষেত্রে, একটিকে Master এবং অন্যটিকে Slave বলা হয়। Master সার্ভার মূল সার্ভার, যেখানে ডেটা লেখা হয়, এবং Slave সার্ভার Master এর একটি কপি রাখে এবং সেই কপি থেকে ডেটা পড়া হয়।

কেন Replication ব্যবহার করবেন?

  1. Load Distribution: বড়ো সাইটগুলোতে হাজার হাজার রিড রিকোয়েস্ট আসে। যদি শুধুমাত্র একটি সার্ভার সব রিড হ্যান্ডেল করে, তাহলে সার্ভার লোড বেশি হতে পারে। Replication এর মাধ্যমে, রিড অপারেশনগুলি Slave সার্ভারে পাঠানো যায়।
  2. Backup & Fault Tolerance: যদি Master সার্ভার ডাউন হয়ে যায়, তখন Slave সার্ভার ব্যাকআপ হিসাবে কাজ করতে পারে।
  3. Data Redundancy: ডেটা হারানোর ঝুঁকি কমাতে রেপ্লিকেশন সিস্টেম ব্যবহার করা হয়, যেখানে ডেটার একাধিক কপি বিভিন্ন সার্ভারে থাকে।
  4. Real-time Analytics: অনেকে Slave সার্ভারে বিভিন্ন রিপোর্টিং বা রিয়েল-টাইম অ্যানালিটিক্স চালায়, যাতে Master সার্ভার ফ্রি থাকে।

কখন Replication ব্যবহার করবেন?

  • যখন আপনার ওয়েবসাইট বা অ্যাপ্লিকেশনে প্রচুর পরিমাণে রিড রিকোয়েস্ট আসে।
  • যখন ডেটা নিরাপদ রাখা প্রয়োজন।
  • যখন ব্যাকআপ এবং ফেইলওভার সমাধান দরকার।

২. MySQL Master-Slave Replication সেটআপ (Ubuntu সার্ভার উদাহরণ)

Step 1: প্রয়োজনীয়তা

  • দুইটি Ubuntu সার্ভার দরকার। (একটি Master, অন্যটি Slave)
  • MySQL ইনস্টল থাকতে হবে।
  • সার্ভারগুলোতে স্ট্যাটিক আইপি ব্যবহার করুন।

আমরা নিচের আইপি ব্যবহার করব:

  • Master: 192.168.1.100
  • Slave: 192.168.1.101

Step 2: MySQL ইনস্টল করুন উভয় সার্ভারে

প্রথমে, উভয় সার্ভারে MySQL ইনস্টল করুন:

sudo apt update
sudo apt install mysql-server

Step 3: Master Server কনফিগারেশন

  1. MySQL কনফিগার ফাইল এডিট:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  1. নিচের লাইনগুলো যোগ করুন:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log

Replication User তৈরি করুন:

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
  1. Master Status বের করুন:
SHOW MASTER STATUS;

Step 4: Slave Server কনফিগারেশন

  1. MySQL কনফিগার ফাইল এডিট:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  1. নিচের লাইনগুলো যোগ করুন:
server-id = 2
  1. Slave কে Master এর সাথে কানেক্ট করুন:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
  1. Slave চালু করুন:
START SLAVE;

Step 5: Replication পরীক্ষা করুন

Master সার্ভারে ডেটাবেস তৈরি করে চেক করুন যে Slave সার্ভারে সেটা কপি হয়েছে কিনা:

CREATE DATABASE replication_test;

Slave সার্ভারে:

SHOW DATABASES;

৩. Node.js এবং TypeORM দিয়ে MySQL Replication ব্যবহারের উদাহরণ

Step 1: Node.js এবং TypeORM সেটআপ

প্রথমে Node.js প্রজেক্ট তৈরি করুন এবং প্রয়োজনীয় প্যাকেজ ইন্সটল করুন:

mkdir mysql-replication-nodejs
cd mysql-replication-nodejs
npm init -y
npm install express mysql2 typeorm

Step 2: TypeORM কনফিগারেশন

ormconfig.js ফাইলে দুইটি ডাটাবেস কনফিগারেশন তৈরি করুন (একটি Master এর জন্য এবং অন্যটি Slave এর জন্য):

module.exports = [
  {
    name: 'master',
    type: 'mysql',
    host: '192.168.1.100',
    port: 3306,
    username: 'root',
    password: 'password',
    database: 'myapp',
    synchronize: true,
    entities: ['src/entity/*.js'],
  },
  {
    name: 'slave',
    type: 'mysql',
    host: '192.168.1.101',
    port: 3306,
    username: 'root',
    password: 'password',
    database: 'myapp',
    synchronize: false,
    entities: ['src/entity/*.js'],
  },
];

Step 3: Entity তৈরি করুন

Product নামে একটি টেবিল তৈরি করুন:

const { EntitySchema } = require('typeorm');

module.exports = new EntitySchema({
  name: 'Product',
  tableName: 'products',
  columns: {
    id: {
      type: 'int',
      primary: true,
      generated: true,
    },
    name: {
      type: 'varchar',
      nullable: false,
    },
    price: {
      type: 'decimal',
      nullable: false,
    },
    description: {
      type: 'text',
    },
  },
});

Step 4: API তৈরি করুন (Master-Slave লজিক)

এখন Node.js এর মাধ্যমে write এবং read API তৈরি করুন:

const express = require('express');
const { createConnections, getConnection } = require('typeorm');

const app = express();
app.use(express.json());

createConnections()
  .then(() => console.log('Connected to master and slave databases'))
  .catch((error) => console.log('Error:', error));

// Write to Master (POST /add-product)
app.post('/add-product', async (req, res) => {
  const { name, price, description } = req.body;
  try {
    const masterConnection = getConnection('master');
    const productRepository = masterConnection.getRepository('Product');
    const newProduct = productRepository.create({ name, price, description });
    await productRepository.save(newProduct);
    res.status(201).json({ message: 'Product added!', product: newProduct });
  } catch (error) {
    res.status(500).json({ message: 'Error adding product', error: error.message });
  }
});

// Read from Slave (GET /products)
app.get('/products', async (req, res) => {
  try {
    const slaveConnection = getConnection('slave');
    const productRepository = slaveConnection.getRepository('Product');
    const products = await productRepository.find();
    res.status(200).json(products);
  } catch (error) {
    res.status(500).json({ message: 'Error fetching products', error: error.message });
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

Step 5: টেস্ট করুন

  • Write (POST /add-product): প্রোডাক্ট যোগ করুন এবং তা Master সার্ভারে জমা হবে।
  • Read (GET /products): প্রোডাক্ট লিস্ট পড়ুন যা Slave সার্ভার থেকে ফেচ হবে।

৪. Conclusion

আমরা শিখেছি কিভাবে দুইটি Ubuntu সার্ভার ব্যবহার করে MySQL Master-Slave Replication সেটআপ করতে হয় এবং কিভাবে Node.js এবং TypeORM এর মাধ্যমে ডেটাবেজের রাইট এবং রিড অপারেশন হ্যান্ডেল করা যায়। Replication ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরও স্কেলেবল, রেডান্ডেন্ট এবং ফাস্ট করতে পারেন।

কিছু রিয়েল লাইফ উদাহরণ:

  1. eCommerce সাইটের পেমেন্ট এবং অর্ডার ডেটা ম্যানেজমেন্ট।
  2. ব্যাংকিং সিস্টেমের ট্রানজেকশন লগিং।
  3. রিপোর্টিং এর জন্য একটি আলাদা ডাটাবেজ সার্ভার যা প্রোডাকশন সার্ভার থেকে লোড কমায়।

এটা একটি বড়ো প্রকল্পের টিউটোরিয়াল যেখানে Database Replication বাস্তব জীবনে কীভাবে কাজ করে এবং কেন এটি গুরুত্বপূর্ণ তা বোঝানো হলো।

How can we help?