# 🔁 آموزش کامل راهاندازی Replication در MySQL به روش Master-Slave
یکی از امکانات قدرتمند MySQL، **Replication** است؛ فرآیندی که به کمک آن میتوان دادهها را از یک سرور اصلی (Master) به یک یا چند سرور تابع (Slave) همگامسازی کرد.
این قابلیت برای:
* توزیع بار خواندن (read)
* پشتیبانگیری بدون توقف سرور اصلی
* افزایش دسترسپذیری
بسیار کاربردی است.
---
## 🧱 پیشنیازها
* دو سرور لینوکس: یکی برای Master و دیگری برای Slave
* نصب MySQL یا MariaDB روی هر دو
* تنظیم hostname و IP استاتیک برای هر دو سیستم
* تنظیم فایروال برای اجازه دسترسی پورت 3306 (پیشفرض MySQL)
---
## 🛠️ مراحل راهاندازی Master-Slave Replication
---
### ✅ ۱. تنظیمات سرور Master
#### 🔹 فایل کانفیگ MySQL را ویرایش کنید:
```bash
sudo nano /etc/mysql/my.cnf
```
یا در برخی سیستمها:
```bash
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
```
🔽 پارامترهای زیر را اضافه یا فعال کنید:
```ini
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mydb # فقط این دیتابیس را replicate کند
```
> ⚠️ توجه: مسیر `log_bin` باید موجود و قابل نوشتن باشد.
---
#### 🔹 راهاندازی مجدد MySQL:
```bash
sudo systemctl restart mysql
```
---
#### 🔹 ایجاد کاربر replication:
```sql
CREATE USER 'replicator'@'%' IDENTIFIED BY 'repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
```
---
#### 🔹 قفل نوشتن برای گرفتن snapshot:
```sql
FLUSH TABLES WITH READ LOCK;
```
در همین حالت، در ترمینال دیگری این دستور را اجرا کنید:
```bash
mysqldump -u root -p --all-databases --master-data > fullbackup.sql
```
فایل را به سرور Slave منتقل کنید:
```bash
scp fullbackup.sql user@slave_ip:/tmp/
```
🔴 قفل را تا پایان بکاپ آزاد نکنید.
---
### ✅ ۲. تنظیمات سرور Slave
#### 🔹 فایل کانفیگ Slave:
```ini
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
```
سپس MySQL را ریاستارت کنید:
```bash
sudo systemctl restart mysql
```
---
#### 🔹 وارد کردن فایل بکاپ:
```bash
mysql -u root -p < /tmp/fullbackup.sql
```
---
### ✅ ۳. اتصال Slave به Master
ابتدا IP سرور Master و موقعیت binlog را از فایل بکاپ پیدا کنید (دستور `--master-data` آن را درون فایل ثبت میکند):
سپس در MySQL وارد شوید و:
```sql
CHANGE MASTER TO
MASTER_HOST='IP_MASTER',
MASTER_USER='replicator',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 154;
START SLAVE;
```
---
### ✅ ۴. بررسی وضعیت
```sql
SHOW SLAVE STATUS\G
```
مقدارهای زیر باید `Yes` باشند:
* `Slave_IO_Running: Yes`
* `Slave_SQL_Running: Yes`
---
## 🧪 تست Replication
در Master:
```sql
USE mydb;
CREATE TABLE test (id INT);
INSERT INTO test VALUES (1);
```
در Slave:
```sql
SELECT * FROM mydb.test;
```
باید دادهها را ببینید ✅
---
## 🛡️ نکات امنیتی و نگهداری
* دسترسی کاربر replication را محدود به IP سرور Slave کنید.
* رمز عبور کاربر replication را امن نگه دارید.
* در صورت نیاز به چند Slave، فقط کافیست از Master برای هر یک اتصال جداگانه ایجاد کنید.
* مانیتور وضعیت Slave بهصورت دورهای با ابزارهایی مثل `zabbix`, `Prometheus`, `pt-heartbeat` انجام شود.
---
## ✅ نتیجهگیری
راهاندازی Replication در MySQL یکی از روشهای مهم افزایش تحمل خطا و مقیاسپذیری دیتابیسهاست. با استفاده از روش Master-Slave میتوانید بار خواندن را بین چند سرور تقسیم و دسترسپذیری سرویسها را بالا ببرید.