MySQL Master-Slave Replikasyonu nasıl yapılır ?

Nasıl yapılır bölümüne geçmeden önce gerekliliklerden kısaca söz edelim.

  • En az 2 adet fiziksel veya sanal makineye ihtiyacımız var. Bu yazımızda iki adet debian 10 sanal makine kullanacağız. Aynı dağıtımları kullanmanızı önemle tavsiye ediyoruz. İki sanal makinede de aynı MySQL sürümü yüklü olmalıdır.
  • Firewall konfigürasyonu için ufw.
  • Master ve slave makinelerin haberleşmesi için ikisinde de kurulu ve senkronize çalışan NTP server gerekmekte.

Gereksinimlerden kısaca bahsettiğimize göre konfigürasyon kısmına geçebiliriz.

1. NTP Konfigürasyonu

İ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*

2. Makinelerimiz Birbirini Tanımalı

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 .

3. Firewall Konfigürasyonu

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.

4. Master Sunucu Konfigürasyonu

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';
Bu komutun, slave kullanıcısının mysql native password kimlik doğrulama eklentisini kullanacağını belirttiğine dikkat edin. Bunun yerine MySQL'in varsayılan kimlik doğrulama mekanizması olan caching_sha2_password'ü kullanmak da mümkündür, ancak bunun için master ile slave sunucu arasında şifreli bir bağlantı kurulması gerekir. Bu tür bir kurulum, üretim ortamları için ideal olacaktır, fakat şifreli bağlantı yapılandırması bu öğreticimizde mevcut değil.
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.


Koordinatları alırken hiçbir kullanıcının herhangi bir veriyi değiştirmediğinden emin olmak için veritabanını kısa süreli kilitlememiz gerekmektedir.
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.

5. Slave Sunucu Konfigürasyonu

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.