Nasıl yapılır bölümüne geçmeden önce gerekliliklerden kısaca söz edelim.
Gereksinimlerden kısaca bahsettiğimize göre konfigürasyon kısmına geçebiliriz.
İlk adımımız iki makinede de aynı NTP konfigürasyonunu yapmak olacak. Henüz kurmadıysanız aşağıdaki komut ile NTP server kurabilirsiniz.
apt -y install ntp
Şimdi kurduğumuz NTP serverları birbirleriyle senkronize olacak şekilde konfigüre edeceğiz. Yazımızda Asia NTP serverlarını kullanacağız.
*nano /etc/ntp.conf*
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server 2.asia.pool.ntp.org iburst
server 3.asia.pool.ntp.org iburst
Conf dosyasını düzenledikten sonra kaydedip NTP servisini yeniden başlatıyoruz.
*/etc/init.d/ntp restart*
Kullandığımız sunucuların hepsi birbirini tanımalı ve sorunsuz şekilde iletişim kurmalıdır. Eğer mevcutsa local DNS kullanabilirsiniz. Örneğimizde biz DNS sahibi olmadığımız için hosts dosyasını konfigüre edeceğiz.
*nano /etc/hosts*
master_server ip master_server_hostname
slave_server_ip slave_server_hostname
Yapacağımız konfigürasyonların hepsinin bütün serverlarda eksiksiz şekilde yapılması gerektiğini UNUTMAYIN .
Yazının başında kurmadıysanız aşağıdaki komut ile öncelikle ufw kurmalısınız.
apt -y install ufw
Eğer SSH ile bağlantı sağlıyorsanız kurduktan sonra ilk olarak SSH portuna izin vermelisiniz. Aksi takdirde ufw servisini çalıştırdığınızda SSH bağlantınızı kaybedebilirsiniz.
ufw allow 22
ufw allow from slave_server_ip to any port 3306
systemctl enable ufw
systemctl start ufw
ufw enable
İlk olarak 22 yani SSH portuna izin verdik ardından yazdığımız kural ise 3306 yani MySQL tarafından kullanılan port için yazılan izin. slave_server_ip kısmını slave makinenizin ip adresi ile değiştirmeyi unutmayın.
Buraya kadar her şey tamam ise artık master sunucumuzun konfigürasyonuna başlayabiliriz.
Debian 10'da MySQL server konfigürasyon dosyası **mysqld.cnf** adı ile **/etc/mysql/mysql.conf.d/** klasörünün altında bulunmaktadır. İlk olarak master sunucumuzda **nano** editör ile açıyoruz. Tercih ettiğiniz farklı editör varsa onu da kullanabilirsiniz.
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Dosyayı açtıktan sonra ilk olarak bağlantı adresini düzenliyoruz. Ekli ise düzenleyin aşağıdaki satır ekli değil ise kendiniz ekleyin.
bind-address = master_server_ip
bind-address düzenlemesi yaptıktan sonra **server-id** satırını bulun. Eğer ekli değilse yine yukarıdaki gibi ekleyin. Değer olarak 1 verebilirsiniz, bu değer sunuculara özel bir değer olmalıdır.
server-id = 1
Bu adımı da tamamladıktan sonra MySQL binary log dosyasının yerini belirtmemiz gerekiyor. Bu yol belirtilmezse binary loglama inaktif olmakta ve slave serverınız log dosyasını okuyamayacağı için neyi replike etmesi gerektiğini bilemeyecektir. Aşağıdaki gibi yolu belirtiyoruz.
log_bin = /var/log/mysql/mysql-bin.log
Son olarak replike edilecek veritabanı veya veritabanlarını belirtmemiz gerekiyor.
binlog_do_db = testdb
Değişikleri bitirdikten sonra sırasıyla CTRL + X, Y ve ENTER tuşlarını basarak kaydedin.
Çıktıktan sonra MySQL servisini yeniden başlatıyoruz.
systemctl restart mysql
Master sunucumuzun konfigürasyon kısmını bitirdik fakat slave sunucumuza geçmeden önce burada yapmamız gereken bir kaç küçük işimiz daha var. Replikasyon için slave serverın bağlanabileceği bir kullanıcı oluşturup izin vermemiz gerekiyor. MySQL shell'ine girerek devam ediyoruz.
mysql -u root -p
CREATE USER 'slave_user'@'slave_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'slave_server_ip';
FLUSH PRIVILEGES;
Bununla birlikte master sunucu konfigürasyonumuz bitirdik. Her ne kadar konfigürasyonumuz bitmiş olsa da hemen MySQL shell'den çıkış yapmayın. Bir sonraki adımda veritabanımızın binary log dosyası ile ilgili önemli bilgileri alacağız.
MySQL, veritabanı olaylarını kaynağın binary log dosyasından satır satır kopyalayarak ve her olayı slave sunucuda uygulayarak replikasyon uygular. Bu sebeple slave sunucu tarafında konfigürasyon yaparken master sunucumuzun binary log dosyasının adını ve bu dosya içindeki belirli bir konumu ayrıntılandıran koordinatı da belirtmeliyiz.
FLUSH TABLES WITH READ LOCK;
Sonrasında da binary log dosyalarının durumunu görüntülemek için aşağıdaki kodu çalıştırın.
SHOW MASTER STATUS;
```
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 899 | testdb | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```
Yukarıdakine benzer bir çıktı alacaksınız.
Master sunucunuzda henüz bir veritabanı bulunmuyorsa öncelikle kilidi kaldırıp veritabanı oluşturun.
UNLOCK TABLES;
CREATE DATABASE testdb;
bu adımdan sonra master sunucuda işimiz bitti. Yukarıdaki çıktıda aldığımız binary log dosyasının bilgilerini kesinlikle unutmayın. Birazdan slave sunucumuzda kullanacağız.
Bu kısımda master sunucuda yaptığımıza benzer şekilde konfigürasyon dosyasını değiştiriyoruz. Yukarıda anlatıldığı için adımları hızlıca geçiyoruz.
nano /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = testdb
Son olarak slave sunucumuzda relay log dosyasının yolunu tanımlayan relay-log direktifini ekliyoruz.
relay-log = /var/log/mysql/mysql-relay-bin.log
Değişiklikler bittikten sonra burada da MySQL servisini yeniden başlatıyoruz.
systemctl restart mysql
Artık replikasyon işlemini test etmek için hazırız. Slave sunucumuzda MySQL shell'ine giriş yapıyoruz.
mysql -u root -p
Şimdi sıra geldi replikasyon işlemine. Master sunucu üzerindeki slave sunucuya tanıtmamız gereken bilgileri giriyoruz.
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_server_ip',
SOURCE_USER='slave_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=899;
START REPLICA;
Bütün adımlar doğru şekilde yapıldıysa bu andan itibaren **testdb** veritabanında yapılan bütün değişiklikler slave sunucumuza da gidecektir.
SHOW REPLICA STATUS\G
Slave sunucumuzda replika durumunu yukarıdaki komut ile görebiliriz.
```
*************************** 1. row ***************************
Replica_IO_State: Waiting for master to send event
Source_Host: 'slave_server_ip'
Source_User: slave_user
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: mysql-bin.000001
Read_Source_Log_Pos: 1273
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 729
Relay_Source_Log_File: mysql-bin.000001
```
Yukarıdakine benzer bir çıktı alacaksınız. Artık elimizde Master-Slave ilişkisi ile oluşturulmuş MySQL Replikasyonu mevcut. Master sunucunuzda veritabanınıza herhangi bir tablo ekleyerek test edebilirsiniz.