Mysql kullananlar bilir yoğun trafik alan sitelerde, insert – update işlemlerinin sıkça olduğu database işlemlerinde, mysql de yavaşlamalar dolayısıyla select sorgularında gecikmeler yaşanır. Bu tür sorunların önüne geçebilmek için mysql veritabanları sunucuları master-slave olarak 2 ayrı sunucuda yer alır. Master insert-delete-update gibi işlemleri için slave ise select işlemleri için kullanılır. Bu sayede slave den data çekerken, yazma işlemlerinin master da gerçekleşeceği için gecikmelerden etkilenilmeyecektir.
Şimdi gelelim işlemlere;
1) İlk olarak master sunucu olarak sunucuyu 192.168.1.5 slave olacak sununun ise 192.168.1.6 olduğunu varsayalım. Bu iki makinenin de aynı networkte olması gerekmektedir. Aksi takdirde performansda düşüş yaşanır bu yüzden 2 makineyede 2 ethernet kartı takıp, birine local (ör:192.168.x.x) diğerine ise dışardan ulaşmak için public ip (ör:212.56.x.x) vermek doğru olacaktır. Master-slave işlemini aynı makine üzerinde de yapabilirsiniz ama aynı donanımı kullanacağı için ben önermiyorum.
2) Her iki sunucuda da /etc/my.cnf dosyasından ;
#skip-networking
#bind-address
satırlarını silelim yada başlarında # işareti olduğundan emin olalım.
3) Master sunucuda /etc/my.cnf içerisine aşağıdaki satırlar eklenmeli;
binlog-do-db=test // sadece test veritabanını slave sunucuya aktarması için buraya onu yazdım. Birden fazla veritabanını aktarmasını isterseniz virgül ile yanyana yazın. Tüm mysqli aktaracaksanız bu satırı eklemeyin.
log-bin = /var/lib/mysql/mysql-bin.log // Replication işlemi log dosyaları üzerinden gider. Bu log dosyalarının tutulacağı dizin.
log-bin-index=/var/lib/mysql/mysql-bin-log.index // Yine log dosyaları için index lerin tutulacağı dizin.
server-id = 1 // bir server id si verilmeli master için 1 verebiliriz. slave için 2 vereceğiz tanımlamalar için gerekli.
expire_logs_days = 2 // serverda bir süre sonra loglar şişmeye başlıyor 2 gün sonra eski logları silsin.
4) Master sunucuyu service mysql restart diyerek yeniden başlatalım. Daha sonra consol dan slave in bu mysql e ulaşması için bir user yaratacağız.
- Önce mysql e girin; mysql -u root -p
- Daha sonra: use mysql
- Son olarakta şu komutu girin: CREATE USER ‘repuser’@’%’ IDENTIFIED BY ‘sifreniz’;
5) Userı oluşturduk şimdi yetki verelim master sunucuda şu komutu çalıştırın mysql içerisinde ;
GRANT REPLICATION SLAVE ON *.* TO ‘repuser’@’%’ IDENTIFIED BY ‘sifreniz’;
FLUSH PRIVILEGES;
6) User oluştu şimdi bakalım çalışıyor mu;
SHOW MASTER STATUS;
komutu çalıştırın aşağıdakine benzer bir ekran gelecek karşınıza;
+”““““““+”“““-+”““““““+”““““““““+
| mysql-bin.000021 | 0980 | test | |
+”““““““+”“““+”““““““+”““““““““+
buradaki mysql-bin.000021 ve 0980 numarasını bir yere kaydedin.
7) Şimdi master sunucudaki veritabanını bire bir slave olan sunucuya taşımamız gerekiyor.
mysqldump -u root -p --opt test > test.sql
ile master dan test isimli veritabanını yedekleyelim. Daha sonra slave sunucuda;
mysql -u root -p newdatabase < /path/test.sql
8) Taşıdıktan sonra slave sunucuya geçelim masterda işimiz bitti. Slave sunucuda /etc/my.cnf dosyasınıza aşağıdaki satırları ekleyin;
server-id = 2 : server id si 2 verelim
replicate-do-db=test : replike edilecek veritabanı adı bizimki test
relay-log=/var/lib/mysql/relay-log : replike için tutulan logların dizini
relay-log-index=/var/lib/mysql/relay-log.index : logların index dizini
9) Ekledikten sonra slave sunucuda mysql e ;
CHANGE MASTER TO MASTER_HOST=’192.168.1.5′,
MASTER_USER=’repuser’,
MASTER_PASSWORD=’sifreniz’,
MASTER_LOG_FILE=’mysql-bin.000021′,
MASTER_LOG_POS=0980;
komutunu girin. Burada masterın ip adresini ve master sunucuda oluşturduğumuz replication için user bilgilerini veriyoruz. Daha önceden kaydettiğimiz master sunucuda ki mysql-bin.000021 ve 0980 numaralarını girin. Bu kısımda hata almamanız gerekir ama alırsanız;
RESET SLAVE;
komutunu çalıştırın. Daha sonra tekrar deneyin. Eğer hata alırsanız /var/log/mysql/error_log dosyasını kontrol edin muhtemelen ağdan mysqle bağlanamıyor hatası alıyor olabilirsiniz.
10) START SLAVE; komtunu çalıştırarak slave ı başlatıyoruz ve bitiriyoruz. Eğer bir hata olmadıysa master sunucuda değişiklik yaptığınızda aynısının slave veritabanında da olduğunu görebilirsiniz.
Sorularınız olursa buradan sorabilirsiniz.
Teşekkürler.