MySQL Çoğaltma (Replication): Master-Slave Temel Kurulum
MySQL/MariaDB master-slave (primary-replica) replikasyon kurulumu adım adım rehber. Binary log, GTID ve replikasyon durumu kontrolü.
MySQL Replikasyon Nedir?
MySQL replikasyonu, bir veritabanı sunucusundaki (master/primary) verilerin otomatik olarak bir veya daha fazla başka sunucuya (slave/replica) kopyalanması işlemidir. Bu sayede yüksek erişilebilirlik, yük dengeleme ve yedekleme gibi kritik özellikler elde edilir. Replikasyon; master sunucudaki her SQL işlemini binary log'a kaydeder, slave bu log'u okuyarak aynı işlemleri kendi üzerinde uygular.
Replikasyonun Kullanım Alanları
- Okuma Ölçeklendirme: SELECT sorgularını slave'lere yönlendirerek master'ın yükünü azaltma
- Yüksek Erişilebilirlik: Master çöktüğünde slave'i master'a terfi ettirme (failover)
- Yedekleme: Slave üzerinden canlı veritabanını durdurmadan yedek alma
- Coğrafi Dağıtım: Farklı bölgelerdeki kullanıcılara yakın replikalar
Ön Hazırlık
- Master sunucu IP:
192.168.1.10 - Slave sunucu IP:
192.168.1.20 - MySQL 8.0 veya MariaDB 10.6+ her iki sunucuda kurulu olmalı
- İki sunucu arasında port 3306 erişimi açık olmalı
Master Sunucu Yapılandırması
my.cnf Ayarları
nano /etc/mysql/mysql.conf.d/mysqld.cnf
# veya AlmaLinux için:
nano /etc/my.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = uygulama_db ; yalnızca bu veritabanını replikasyon
binlog_expire_logs_days = 7
max_binlog_size = 100M
sync_binlog = 1 ; güvenli mod
systemctl restart mysql
Replikasyon Kullanıcısı Oluşturma
mysql -u root -p
CREATE USER 'replica_user'@'192.168.1.20' IDENTIFIED BY 'GucluReplicaSifresi123!';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'192.168.1.20';
FLUSH PRIVILEGES;
Master Durumunu Kaydedin
-- Tüm tabloları kilitle (anlık durum için)
FLUSH TABLES WITH READ LOCK;
-- Master log dosyası ve pozisyonu not alın!
SHOW MASTER STATUS;
-- Örnek çıktı:
-- File: mysql-bin.000001
-- Position: 107
-- Binlog_Do_DB: uygulama_db
Veritabanı Dışa Aktarma
# Başka bir terminal penceresinden:
mysqldump -u root -p --single-transaction --master-data uygulama_db > /tmp/master_dump.sql
# Kilidi kaldır
mysql -u root -p -e "UNLOCK TABLES;"
Slave Sunucu Yapılandırması
my.cnf Ayarları
[mysqld]
server-id = 2 ; master'dan farklı olmalı!
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1 ; slave'e yazma yasakla
systemctl restart mysql
Master Dump'ı Yükleme
# Dump dosyasını slave'e kopyala
scp /tmp/master_dump.sql root@192.168.1.20:/tmp/
# Slave'de yükle
mysql -u root -p -e "CREATE DATABASE uygulama_db;"
mysql -u root -p uygulama_db < /tmp/master_dump.sql
CHANGE MASTER TO Komutu
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = '192.168.1.10',
MASTER_USER = 'replica_user',
MASTER_PASSWORD = 'GucluReplicaSifresi123!',
MASTER_LOG_FILE = 'mysql-bin.000001', -- SHOW MASTER STATUS'ten
MASTER_LOG_POS = 107; -- SHOW MASTER STATUS'ten
START SLAVE;
Replikasyon Durumu Kontrolü
SHOW SLAVE STATUS\G
Sağlıklı bir replikasyon için bu iki satırın Yes olması gerekir:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Replikasyon Test Etme
-- Master'da:
USE uygulama_db;
CREATE TABLE test_replication (id INT AUTO_INCREMENT PRIMARY KEY, veri VARCHAR(100));
INSERT INTO test_replication (veri) VALUES ('replikasyon testi');
-- Slave'de doğrulayın (birkaç saniye bekleyin):
USE uygulama_db;
SELECT * FROM test_replication;
GTID Tabanlı Replikasyon (MySQL 8.0+)
GTID (Global Transaction Identifier) tabanlı replikasyon, log dosyası ve pozisyon takibi yerine işlem ID'lerini kullanır. Failover senaryolarında çok daha kolaydır:
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
CHANGE MASTER TO
MASTER_HOST = '192.168.1.10',
MASTER_USER = 'replica_user',
MASTER_PASSWORD = 'GucluReplicaSifresi123!',
MASTER_AUTO_POSITION = 1; -- GTID modunda log file/pos gerekmez
START SLAVE;
Sık Karşılaşılan Sorunlar
- Slave_IO_Running: No: Master'a bağlantı sorunu.
mysql -u replica_user -p -h 192.168.1.10ile bağlantıyı test edin; firewall kurallarını kontrol edin. - Slave_SQL_Running: No: SQL hatası var.
Last_SQL_Erroralanını inceleyin.SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;ile geçebilirsiniz. - Seconds_Behind_Master yüksek: Slave donanımını güçlendirin; paralel replikasyon ayarlarını inceleyin (
slave_parallel_workers). - Duplicate entry hatası: Slave'e yanlışlıkla yazma yapılmış.
read_only = 1ayarını aktifleştirin.
İlgili Makaleler
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!