Linux Server MySQL Master-Slave Replikasyonu Nasıl Yapılır?

Merhabalar,

Bu makalede, linux sistemler üzerinde çalışmakta olan MySQL database için ikinci bir sunucu üzerine replikasyonların nasıl yapılabileceğine dair bilgilendirmeler yapacağım. Burada kullanılan sunucular, REDHAT tabanlı (Redhat-CentOS-Rocky Linux-Alma Linux) sistemlerdir. Fakat küçük farklılıklarla, tüm linux altyapıları için uyarlanması da oldukça kolay olacaktır. Genel mantığının anlaşılması yeterli olacaktır.

Bildiğiniz gibi yedeklilik ve iş sürekliliği, artık günümüzün olmazsa olmazlarıdır. Artık bilişim altyapılarında, kesinti sürelerinin de en aza indirgenmesi beklenmektedir. Bu noktada, iş sürekliliğini sağlamaya yönelik olarak, verilerin birden çok noktaya kopyalanmasını sağlayan, replikasyon (çoğaltma) teknolojileri de sıkça kullanılmaktadır. Bir sunucu için full şekilde (OS+APP) yapılabileceği gibi sadece uygulama bazlı da yapılabilmektedir.

MySQL, ilişkisel bir veritabanı yönetim sistemidir ve bugün dünyadaki en popüler açık kaynaklı ilişkisel veritabanıdır. Verilerinizin birden çok kopyasını korumanıza olanak tanıyan bir dizi yerleşik çoğaltma özelliğiyle de kurulu olarak gelir.

Konumuz bir veritabanı olduğu için bu işlemin uygulama bazlı olarak iki sunucu arasında nasıl yapılacağıyla ilgili detaylı bilgiler aktaracağım. Veritabanlarıyla çalışırken, verilerinizin birden çok kopyasının olması yararlı olabilir. Böylece, veritabanı sunucularından birinin arızalanması durumunda yedeklilik sağlanmış olur ve bir veritabanının kullanılabilirliğini, ölçeklenebilirliğini ve genel performansını iyileştirebiliriz. Az önce de belirttiğim gibi, verileri birden çok ayrı veritabanı arasında senkronize etme işlemine replication (çoğaltma) denir.

Burada MySQL’in yüzeysel bir kurulumu ve sonrasında ise detaylı bir konfigürasyondan bahsedeceğiz.

Daha detaylı MySQL Kurulumu için yayınlamış olduğum makalemi de gözden geçirmeyi unutmayınız.

Hızlıca işlemlerimize başlayalım.

Ön hazırlıklar

2 adet sunucumuz olacak. Güncel olması bakımından, Rocky Linux dağıtımını özellikle seçtim. Böylece, CentOS kullanıcıları için de kullanıcı alışkanlıkları değişmeden, bire bir komut karşılıkları dolayısıyla da kolay işlemler olacaktır.

MasterDB Server
Hostname : MasterDB.isleyen.net
IP address : 20.20.20.122

SlaveDB Server
Hostname : SlaveDB.isleyen.net
IP address : 20.20.20.124

SELINUX kontrolü

İlk olarak her linux makalesinde olduğu gibi selinux kontrolü ile başlayalım. Ben genelde tamamen kapatmayı uygun görüyorum. Eğer kullanmayı seçecekseniz, mutlaka MySQL için yapılması gereken işlemleri yapmanız gerekiyor. Aksi durumda bağlantı hataları görmeniz yüksek ihtimaldir.

Her iki sunucuda, aşağıdaki komutla selinux kontrolü yapalım.

sestatus

Her ikisinde de aktif durumda. Tamamen disable etmek için, her iki sunucuda da aşağıdaki işlemi yapıyoruz.

nano /etc/selinux/config

Kaydedip dosyayı kapatıyoruz. Bu işlem, sunucu restart gerektirdiği için her iki sunucuyu da restart edelim.

Firewall kontrolü

Eğer firewall açık ise, konfigürasyonlar sonrasında kesinlikle bağlantı hatası alacaksınız. Dolaysıyla ya firewall disable etmeyi seçeceksiniz ya da kapatmayacaksanız, MySQL için kural yazma yoluna gideceksiniz. Linkini verdiğim makalemde firewall kullnılması durumunda ne yapacağınıza dair bilgilendirmelerim mevcuttur. Ben burada firewall kapatmayı seçiyorum.

Her iki sunucuda, firewall’un önce durumunu kontrol edelim, çalışıyorsa stop edelim ve sonrasında da disable edelim…

systemctl status firewalld

systemctl stop firewalld

systemctl disable firewalld

Her iki sunucu için ön hazırlıklarımız bu kadar. Şimdi kurulum işlemlerimize başlayalım.

Adım 1: Master ve Slave Server üzerinde MySQL kurulumu

Her iki sunucuya, MySQL Kurulumu yapalım. MobaXTerm gibi çoklu SSH pencereleri açabildiğiniz uygulamalarda, çoklu komut işletimini seçtiğinizde, verdiğiniz komutu tüm sunucularda uygulayabiliyorsunuz. Dolayısıyla tek komutla, birden fazla sunucu üzerinde aynı işlemi yapabilirsiniz. Böylece her sunucu için ayrı ayrı komutları çalıştırmak zorunda kalmazsınız. Bunu da ek bilgi olarak paylaşayım…

Aşağıdaki komutla MySQL kurulumunu yapalım.

dnf install @mysql -y

Kurulum bittikten sonra, her iki sunucuda önce MySQL servisini start ediyoruz, sonrasında ise her reboot sonrası aktif şekilde gelmesi için enable ediyoruz. Son olarak da durumunu kontrol ediyoruz.

systemctl start mysqld

systemctl enable mysqld

systemctl status mysqld

Adım 2: Master ve Slave Server MySQL güvenliği

Default ayarlarda kalmaması için, her iki sunucuda database güvenliği için bazı iyileştirmeler yapalım.

Her iki sunucu üzerinde, aşağıdaki komutla, ilgili adımları tamamlayalım.

mysql_secure_installation

Basit anlamda, her iki sunucu üzerinde MySQL kurulumumuzu, güvenlik açısından biraz daha sıkılaştırmış olduk.

Adım 3: Master Node (Server) Konfigürasyonu

Bu adımda, ilk sunucumuz olan MasterDB server üzerindeki ayarları gerçekleştireceğiz. Aşağıdaki komutla, ilgili konfigürasyon dosyası içinde, son satırdan itibaren aşağıdaki satırları yazalım.

Dosyayı kaydedip kapattıktan sonra, MySQL servisini restart ediyoruz.

systemctl restart mysqld

Şimdi de MySQL database üzerinde, replikasyonu yapacak bir kullanıcı oluşturacağız. Kullanıcı adı “replica” olsun ve bir de şifre verelim. Üst bölümlerde basit güvenlik düzenlemelerini yaparken, güçlü password seçeneğini seçtiyseniz, karmaşık bir password vermeniz yerinde olacaktır.

Master server durumunu görmek isterseniz, aşağıdaki komutu kullanabilirsiniz.

SHOW MASTER STATUS\G

Burada bizim için önemli olan bilgiler, File ve Position olarak verilmiş olan bilgilerdir. Bunları not ediniz. Sonraki adımda, Slave server’ı replikasyon için ayarlarken bu bilgilere ihtiyacımız olacak.

Adım 4: Slave Node (Server) Konfigürasyonu

Şimdi, Slave server üzerindeki ayarlamaları yapacağız. İlk sunucuda yaptığımız gibi, mysql-server.cnf yapılandırma dosyasını düzenleyeceğiz.

Dosyayı kaydedip çıkış yaptıktan sonra MySQL servisini restart ediyoruz.

systemctl restart mysqld

Slave Node’un, Master Node’dan replikasyon yapabilmesi için gerekli işlemleri yapmak üzere SlaveDB server üzerinde MySQL oturumu açıyoruz.

mysql -u root -p

Her şeyden önce, Slave MySQL’i stop etmemiz gerekiyor.

mysql> STOP SLAVE;

Ardından, Master Node database’lerini replike edebilmek için aşağıdaki komutları sırasıyla uygulayın. Bir önceki adımda, master sunucu durumunu görmüştük hatırlarsanız. File ve position bilgilerini not alın demiştik. İşte o bilgileri burada tanımlayacağız. Burada özetle şunu demiş oluyoruz : Master Host IP adresine git, replica kullanıcısıyla oturum aç ve position bilgisi senin referans noktan olsun. O noktadan ve sonrasındaki değişiklikleri almaya başla…

Yapacağımız ayarlamalar bu kadar. Şimdi Slave’i tekrar start edelim ve Slave durumunu görelim.

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G

Herşey yolundaysa, bu pencerede hiçbir hata görmeyeceksiniz. Kaynak tarafı dinlemeye alındı ve gelişen olayların gönderilmesi ve alınması beklenmeye başlandı.

Burada önemli bir parantez açıyorum ve bazı bilgileri aktarmayı uygun görüyorum…

MySQL üzerinde Koordinat Mantığını Anlayalım

Kaynaktan Binary Log Koordinatlarını alma

MySQL’de replikasyon gerçekleştirilirken, database olayları kaynağın binary log dosyasından satır satır kopyalanarak ve her olay replikada uygulanarak replikasyon gerçekleştirilir. MySQL’in binary log dosyası, position-based (konum tabanlı) replikasını kullanırken, replica tarafında kaynağın binary log dosyasının adını ve bu dosya içindeki belirli bir konumu ayrıntılandıran bir dizi koordinat sağlamalıyız. İşte bu koordinat, position olarak verilen değer olmakta. Ardından replikasyon işlemi, log dosyasındaki database olaylarını kopyalamaya başlaması gereken noktayı belirlemek ve hangi olayları önceden işlediğini izlemek için bu koordinatları kullanır.

Database üzerine veri yazıldıkça bu değerler değişmektedir. Böylece en son işlenen ve bu işlemeden sonra nelerin değiştiğinin de tespiti yapılabilmektedir.

Kabaca, işin mantığını bu şekilde düşünebilirsiniz… Parantezi kapatıyoruz ve işlemlerimize geri dönüyoruz… 🙂

Master sunucu üzerinde, MySQL oturumunuz açıkken MasterDB durumunu görüntülemek için aşağıdaki komutu da kullanabilirsiniz.

SHOW MASTER STATUS;

Bakınız, replikanın database olaylarını kopyalamaya başlayacağı konumu 854 olarak görmektesiniz. Bu bilgileri, az önce slave üzerine gidip tanımlamıştık.

Adım 5: MySQL Master-Slave Replication Test

Şimdi, Master ve Slave Node arasındaki replikasyonun çalışıp çalışmadığını test etmek için Master Node üzerinde, MySQL database oturumu açalım. Bu database üzerinde, bir test DB oluşturalım ve Slave üzerine replike edilip edilmediğini görelim.

mysql -u root -p

Aşağıdaki komutla, bir test database oluşturun. Burada test database adını ReplicationTest_db olarak seçtim.

mysql > CREATE DATABASE ReplicationTest_db;

mysql > SHOW DATABASES;

Database oluşturuldu.

Şimdi Slave server’a geçin, MySQL üzerinde oturum açın ve ReplicationTest_db database’inin replike edilip edilmediğini kontrol edin.

Bakınız DB kopyası buraya replike edilmiş durumda. İşlemlerimiz başarılı görünmekte.

Replikasyon olaylarını gözlemlemek isterseniz, aşağıdaki komutla durum kontrolü yapabilirsiniz. MySQL database logları mysqld.log dosyasından takip edilebilir.

tail -f /var/log/mysql/mysqld.log

Tüm işlemlerimiz bu kadar. Artık birbirinin kopyası olan yedeklenmiş MySQL sunucuları, istediğiniz senaryolara göre kullanabilirsiniz. Elbette ki tüm testlerinizi yaptıktan sonra canlı ortama almanızda fayda var.

Yararlı olması dileğiyle.

Yusuf İşleyen