Merhaba arkadaşlar, bugün sizlere MySQL veya MariaDB için Master-Slave replikasyonunun nasıl kurulacağını ve en sık karşılaşılan gecikme (lag) sorunlarını nasıl çözebileceğinizi adım adım anlatacağım. Bu yapı, hem yük dağılımı hem de yedeklilik için kritik öneme sahip. Benim de üretim sunucularımda sıklıkla kullandığım bir yöntem.
Replikasyon Nedir ve Neden Önemli?
Master-Slave replikasyonu, bir veritabanı sunucusundaki (Master) tüm değişikliklerin bir veya daha fazla başka sunucuya (Slave) otomatik olarak kopyalanması işlemidir. Bu sayede okuma (SELECT) sorgularınızı Slave sunuculara yönlendirerek Master'ın yükünü hafifletebilir, ayrıca Slave'i sıcak yedek olarak kullanabilirsiniz. Performans ve felaket kurtarma için olmazsa olmazdır.
Master Sunucu Hazırlığı
Öncelikle Master sunucumuzu replikasyona hazır hale getirelim. Ana konfigürasyon dosyasını (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) düzenliyoruz.
Bu ayarlardan sonra MySQL/MariaDB servisini yeniden başlatalım.
Şimdi Master üzerinde replikasyon için bir kullanıcı oluşturalım ve gerekli izinleri verelim.
DİKKAT: `SHOW MASTER STATUS;` komutunun çıktısındaki `File` (örn: mysql-bin.000001) ve `Position` (örn: 328) değerlerini bir yere not edin. Slave kurulumunda bunlara ihtiyacımız olacak. İşlem bittikten sonra tablo kilidini açmayı unutmayın: `UNLOCK TABLES;`
Slave Sunucu Kurulumu
Şimdi Slave sunucumuza geçelim. Slave'in konfigürasyon dosyasında sadece benzersiz bir `server-id` tanımlamamız yeterli.
Servisi yeniden başlattıktan sonra, Slave'i Master'a bağlayacağız. Aşağıdaki komutta, `MASTER_LOG_FILE` ve `MASTER_LOG_POS` değerlerini az önce Master'da not ettiğiniz değerlerle değiştirin. `MASTER_HOST` ise Master sunucunuzun IP adresi olacak.
Artık Slave replikasyonunu başlatabiliriz.
Durumu kontrol etmek için aşağıdaki komutu kullanın. `Slave_IO_Running` ve `Slave_SQL_Running` sütunlarının ikisinin de `Yes` olduğundan emin olun.
Gecikme (Lag) Sorunları ve Çözüm Yolları
Replikasyon gecikmesi (`Seconds_Behind_Master` değerinin sürekli yüksek olması) en sık karşılaştığımız sorunlardan. İşte denenmiş çözüm önerilerim:
1. Performans İncelemesi
İlk olarak, Slave sunucunuzun kaynaklarını (CPU, RAM, Disk I/O) kontrol edin. Özellikle yavaş diskler, replikasyonu ciddi şekilde yavaşlatır. `iostat` veya `iotop` komutlarıyla disk performansını gözlemleyin.
2. Parametre Optimizasyonu
Slave sunucunuzdaki bazı parametreleri, özellikle de yazma performansını artıracak şekilde ayarlamayı deneyin. Bu ayarlar sunucunuza göre değişiklik gösterebilir, test etmeden production'a almayın.
3. Ağ ve Bağlantı Kontrolü
Master ve Slave arasındaki ağ gecikmesini (ping süresi) ve bant genişliğini kontrol edin. Özellikle çok büyük binary log'ların transferi sırasında darboğaz yaşanabilir. `SHOW SLAVE STATUS\G` çıktısındaki `Seconds_Behind_Master` değeri anlık olarak değişiyorsa, ağ kaynaklı bir gecikme olabilir.
4. Tek Sorgu Analizi
Gecikmeye neden olan yavaş bir sorgu olabilir. Slave üzerinde `SHOW PROCESSLIST;` komutu ile çalışan sorguları inceleyin. Master'da çok uzun süren ve Slave'de tekrar edilen bir UPDATE/DELETE işlemi tüm replikasyonu kilitleyebilir. Bu tür sorguları optimize etmek gerekir.
Acil Müdahale: Replikasyonu Sıfırdan Kurmak
Bazen gecikme o kadar kronikleşir ki, en temiz çözüm replikasyonu sıfırdan kurmaktır. Bunun için:
1. Slave'i durdur (`STOP SLAVE;`)
2. Master'da yeni bir yedek (dump) al.
3. Bu yedeği Slave'e yükle.
4. Master'daki yeni `File` ve `Position` değerlerini al.
5. Slave'de `CHANGE MASTER TO` komutunu yeni bilgilerle çalıştır ve `START SLAVE` de.
Bu yöntem, özellikle Slave'de birikmiş hatalar varsa en kesin çözümdür.
Umarım bu rehber faydalı olmuştur arkadaşlar. Replikasyon kurulumu ilk bakışta karmaşık gelebilir ama adımları takip edince aslında oldukça düzgün çalışan bir yapı kurabilirsiniz. Benim en çok dikkat ettiğim nokta, Slave sunucusunun disk performansı ve ağ bağlantısının stabilitesi oluyor.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı optimizasyon yöntemleriniz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.
Master-Slave replikasyonu, bir veritabanı sunucusundaki (Master) tüm değişikliklerin bir veya daha fazla başka sunucuya (Slave) otomatik olarak kopyalanması işlemidir. Bu sayede okuma (SELECT) sorgularınızı Slave sunuculara yönlendirerek Master'ın yükünü hafifletebilir, ayrıca Slave'i sıcak yedek olarak kullanabilirsiniz. Performans ve felaket kurtarma için olmazsa olmazdır.
Öncelikle Master sunucumuzu replikasyona hazır hale getirelim. Ana konfigürasyon dosyasını (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) düzenliyoruz.
INI:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
max_binlog_size = 100M
bind-address = 0.0.0.0
Bu ayarlardan sonra MySQL/MariaDB servisini yeniden başlatalım.
Bash:
sudo systemctl restart mysql
# veya
sudo systemctl restart mariadb
Şimdi Master üzerinde replikasyon için bir kullanıcı oluşturalım ve gerekli izinleri verelim.
SQL:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'GucluBirSifreBuraya';
GRANT REPLICATION SLAVE ON . TO 'repl_user'@'%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Şimdi Slave sunucumuza geçelim. Slave'in konfigürasyon dosyasında sadece benzersiz bir `server-id` tanımlamamız yeterli.
INI:
[mysqld]
server-id = 2
Servisi yeniden başlattıktan sonra, Slave'i Master'a bağlayacağız. Aşağıdaki komutta, `MASTER_LOG_FILE` ve `MASTER_LOG_POS` değerlerini az önce Master'da not ettiğiniz değerlerle değiştirin. `MASTER_HOST` ise Master sunucunuzun IP adresi olacak.
SQL:
CHANGE MASTER TO
MASTER_HOST='MASTER_SUNUCU_IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='GucluBirSifreBuraya',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=328;
Artık Slave replikasyonunu başlatabiliriz.
SQL:
START SLAVE;
Durumu kontrol etmek için aşağıdaki komutu kullanın. `Slave_IO_Running` ve `Slave_SQL_Running` sütunlarının ikisinin de `Yes` olduğundan emin olun.
SQL:
SHOW SLAVE STATUS\G
Replikasyon gecikmesi (`Seconds_Behind_Master` değerinin sürekli yüksek olması) en sık karşılaştığımız sorunlardan. İşte denenmiş çözüm önerilerim:
İlk olarak, Slave sunucunuzun kaynaklarını (CPU, RAM, Disk I/O) kontrol edin. Özellikle yavaş diskler, replikasyonu ciddi şekilde yavaşlatır. `iostat` veya `iotop` komutlarıyla disk performansını gözlemleyin.
Slave sunucunuzdaki bazı parametreleri, özellikle de yazma performansını artıracak şekilde ayarlamayı deneyin. Bu ayarlar sunucunuza göre değişiklik gösterebilir, test etmeden production'a almayın.
INI:
[mysqld]
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
innodb_doublewrite = 0 # Dikkatli olun, güvenlik/kararlılık riski olabilir.
innodb_buffer_pool_size = SistemRAMinin %70-80'i
Master ve Slave arasındaki ağ gecikmesini (ping süresi) ve bant genişliğini kontrol edin. Özellikle çok büyük binary log'ların transferi sırasında darboğaz yaşanabilir. `SHOW SLAVE STATUS\G` çıktısındaki `Seconds_Behind_Master` değeri anlık olarak değişiyorsa, ağ kaynaklı bir gecikme olabilir.
Gecikmeye neden olan yavaş bir sorgu olabilir. Slave üzerinde `SHOW PROCESSLIST;` komutu ile çalışan sorguları inceleyin. Master'da çok uzun süren ve Slave'de tekrar edilen bir UPDATE/DELETE işlemi tüm replikasyonu kilitleyebilir. Bu tür sorguları optimize etmek gerekir.
Bazen gecikme o kadar kronikleşir ki, en temiz çözüm replikasyonu sıfırdan kurmaktır. Bunun için:
1. Slave'i durdur (`STOP SLAVE;`)
2. Master'da yeni bir yedek (dump) al.
3. Bu yedeği Slave'e yükle.
4. Master'daki yeni `File` ve `Position` değerlerini al.
5. Slave'de `CHANGE MASTER TO` komutunu yeni bilgilerle çalıştır ve `START SLAVE` de.
Bu yöntem, özellikle Slave'de birikmiş hatalar varsa en kesin çözümdür.
Umarım bu rehber faydalı olmuştur arkadaşlar. Replikasyon kurulumu ilk bakışta karmaşık gelebilir ama adımları takip edince aslında oldukça düzgün çalışan bir yapı kurabilirsiniz. Benim en çok dikkat ettiğim nokta, Slave sunucusunun disk performansı ve ağ bağlantısının stabilitesi oluyor.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı optimizasyon yöntemleriniz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.