وقتی سایت شما رشد میکنه و MySQL نمیتونه پاسخگو باشه، Replication راه‌حلیه که چند سرور MySQL هماهنگ کار کنن. تو این مقاله راه‌اندازی رو یاد میگیرید.

Replication چیه؟

یه سرور (Master) داده رو دریافت و ذخیره میکنه. یک یا چند سرور دیگه (Slave) از Master داده رو کپی میکنن. Read کوئری‌ها به Slave، Write به Master.

مزایا

مقیاس‌پذیری: Read Query تقسیم میشه
High Availability: اگه Master بره، Slave جایگزین
Backup آسون: از Slave بک‌آپ بگیرید
Geographic Distribution: Slave در نقاط مختلف

معماری‌ها

Master-Slave: یه Master، چند Slave. رایج‌ترین.
Master-Master: دو Master. هر دو Write. پیچیده.
Multi-Source: Slave از چند Master.

راه‌اندازی Master-Slave

مرحله ۱: تنظیم Master

my.cnf در سرور Master:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mydb

مرحله ۲: ایجاد Replication User

CREATE USER replica@% IDENTIFIED BY password;
GRANT REPLICATION SLAVE ON *.* TO replica@%;
FLUSH PRIVILEGES;

مرحله ۳: Snapshot Master

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

File و Position رو یادداشت کنید.

مرحله ۴: Dump Master

mysqldump -u root -p --all-databases > master.sql

مرحله ۵: Unlock Master

UNLOCK TABLES;

مرحله ۶: تنظیم Slave

my.cnf در سرور Slave:
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log

مرحله ۷: Import Dump

mysql -u root -p < master.sql

مرحله ۸: Connect Slave

CHANGE MASTER TO MASTER_HOST=master_ip, MASTER_USER=replica, MASTER_PASSWORD=password, MASTER_LOG_FILE=mysql-bin.000001, MASTER_LOG_POS=154;
START SLAVE;

مرحله ۹: بررسی

SHOW SLAVE STATUS\G
باید Slave_IO_Running و Slave_SQL_Running هر دو Yes باشن.

Application Setup

ORMهایی مثل Laravel Eloquent قابلیت جدا کردن Read/Write دارن.

Replication Lag

گاهی Slave چند ثانیه عقب میمونه. برای این:
- کوئری‌های حساس به Master بفرستید
- Monitor Lag
- Optimize Slave

Monitor

SHOW SLAVE STATUS\G:
- Seconds_Behind_Master
- Slave_IO_Running
- Slave_SQL_Running

Row-based vs Statement-based

Statement-based (SBR): SQL statement رو log میکنه.
Row-based (RBR): تغییرات ردیفی رو log میکنه. دقیق‌تر.
Mixed: MySQL خودش انتخاب میکنه. پیش‌فرض.

GTID (Global Transaction ID)

در MySQL 5.6+، بدون نگرانی از log file position:
gtid_mode = ON
enforce_gtid_consistency = ON

Failover

Manual: اگه Master بمیره، Slave رو Master کنید.
Automatic: MHA (Master High Availability) یا Orchestrator.

MySQL Group Replication

در MySQL 5.7+، Multi-Master Native. پیشرفته‌تر.

Galera Cluster

MariaDB. Synchronous Multi-Master. High Availability.

Cloud Managed

AWS RDS Read Replica با یه کلیک. DigitalOcean Managed ساده.

مشکلات رایج

Slave Stop: SLAVE_SQL_Running: No. لاگ رو ببینید.
Duplicate Key: یه ID دو بار درج شده. SKIP counter.
Lag زیاد: Slave کند. Optimize کنید.

Backup از Slave

روی Master بار نمیذاره:
STOP SLAVE SQL_THREAD;
mysqldump ...
START SLAVE;

Iranian Context

Master در ایران، Slave در آلمان. Latency بالاست. مواظب باشید.

سباهاست پیشنهاد

سرور VPS از سباهاست بگیرید. راه‌اندازی Replication با پشتیبانی.

جمع‌بندی

Master-Slave Replication راه‌حلی برای مقیاس‌پذیری. با راه‌اندازی درست، Read کوئری‌های سایتتون به راحتی چند برابر میشه.