وقتی سایت شما رشد میکنه و 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 کوئریهای سایتتون به راحتی چند برابر میشه.