Replication kelime anlamı olarak Veri Kopyalama anlamına gelir. Database tarafında ise; bir database’in başka bir sunucu üzerinde eşleniğinin ‘yani hem yapısal hem de datasal olarak’ tutulmasıdır. Master database da yapılan herhagi bir değişiklik anında eşlenik database ‘Slave’ yansır. Replication bir backuplama yöntemi değildir. Çünkü Master database de yapılan bir delete işlemi slave database de de yapılacağı için her iki database de de veri silinmiş olacaktır. Replication nun faydası yüksek erişilebilirlilik sağlaması(Hight Availability) ve uygulamanın performansında artışa sebeb olmaktır. Bu performans artışını da uygulama tarafında insert-update-delete işlemlerini master database’e select işlemlerini de slave database’e yönlendirilerek yapılabilir. Tabi bu yapıyı Çoğaltma şansınız var.Master -Slave -Slave şeklinde Slave sunucau sayısını arttırabilirsiniz. Burada dikkat etmeniz gereken bir nokta var.Master ve Slave sunucuların aynı network farmında bulunması gerekmektedir. Aksi takdirde perforans ta ciddi azalmalar meydana gelir.

Replikasyon Çeşitleri

Replikasyon işlemini senkron ve asenkron olarak ve yarı senkron olacak şekilde 3 şekilde yapabilir. Default olarak asenkron replikasyon yapılır.

Asenkron replikasyon

Master veritabanında transactionlar binary dosyalara yazılır ve slave requestler hazır olduklarında talep ederler. Yalnız bu yöntemde transactionın slave veritabanına ulaşabileceğinin garantisi yoktur. . (row-based replikasyon ve statement-based replikasyon yapma seçeneklerimiz var burada) Asenkron replikasyon avantajı slave veritabanına herhangi bir nedenden dolayı ulaşılamasa bile kullanıcılar veritabanında işlemi yapmaya devam edebilir dezavantajı ise replikasyonun sıfır veri kaybı garantisini verememesidir.

 

Mysql Master-Slave Replication 1

Yarı Senkron replikasyon

Transactionın doğru aktarılmasını sağlamak için slave ve master ünitenin birbirleriyle iletişim kurması anlamına gelir. Master yalnızca binlog dosyasını doldurur ve slavelerden biri transactionın slave’in relay loglarından birine düzgün bir şekilde yerleştirildiğinin doğrulanmasını sağlarsa transaction devam eder. Yarı eşzamanlı replikasyon, bir transactionın doğru şekilde kopyalandığını garanti eder, ancak slave üzerine olan taahhüdün gerçekten gerçekleşeceğini garanti etmez.

Mysql Master-Slave Replication 2

 

Senkron replikasyon

Master veritabanında bir transaction gerçekleştirildiğinde, tüm slave’lerde bu transaction işlenene kadar master transaction sonlanmaz.Bunun dezavantajı ise bir transactionı tamamlamak için çok fazla gecikme olabileceğidir.

Row-Based Replikasyon ve Statement-Based Replikasyon

Statement-based replikasyon ile SQL sorgusunun kendisi binary log dosyasına kaydedilir ve slave tarafından bu sql ler çalıştırılır.Bu sistemin birçok avantajı ve dezavantajı vardır:

  • Gerçek sorgular binary log dosyasına kaydedildiği için veritabanını denetlemek çok daha kolaydır
  • Network üzerinden daha az veri aktarılır

Row-based replikasyon defauly yöntemdir. Satır değişiklikleri binary log dosyalarına kaydedilir ve içerik bilgisi gerektirmez. Avantajları;

  • Birkaç satır değişikliği içeren yüksek eşzamanlılık sorgularıyla performans iyileştirmeleri
  • veri tutarlılığı geliştirme

Master –Slave Replikasyon Örneği

Şimdi biz bu yazıdaki örneğimizde asenkron master-slave replikasyon yapacağız. Öncelikle kullanacağımız ipler aşağıdaki gibidir;

Master Database : 192.168.10.130
Slave Database : 192.168.10.130

  • Eğer veritabanı bulunmuyorsa aşağıdaki gibi kurmamız gerekmektedir.

apt-get install mariadb-server -y


NOT :
MariaDB, GNU Genel Kamu Lisansı altında serbest olarak kullanılabilen, MySQL’in yaratıcısı olan Monty Widenius‘un MySQL’in kodunu çatallayıp (fork) “çoğunlukla” MySQL ile aynı komutları, arayüzleri ve API’leri destekleyecek şekilde geliştirmeye başlanan (MariaDB 5.2 >= MySQL 5.2), toplulukla iç içe hızlı ve verimli şekilde geliştirilmeye devam edilen MySQL ilişkisel veritabanı yönetim sistemidir. Tabi geliştirmelerle birlikte farklı yaklaşımlar da sürümlerle birlikte sunulmaya başlandı. Detaylı bir değerlendirme için MariaDB versus MySQL – Features sayfasını inceleyebilirsiniz.

  • Yükleme tamamlandıktan sonra, MariaDB servisini başlatmak ve aşağıdaki komutla önyükleme zamanında başlatmak için etkinleştirin;
systemctl start mysql
systemctl enable mysql
  • Aşağıda kodu verilen mysql_secure_installation scripti çalıştırarak güvenlik ayarlarını yapabiliriz.Scripti çalıştırdıktan sonra MySQL root şifresini değiştirmeyi, anonim hesabını kaldırmayı ve localhostun dışında root girişi yapılmamasını ve test veritabanını silmek isteyip istemediğinizi sorabilir.

 

mysql_secure_installation

Aşağıda gösterildiği gibi tüm soruları cevaplayın;

Set root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
    • Şimdi master sunucumuzda mysql yapılandırma dosyasını açıp /etc/mysql/my.cnf aşağıdaki satırları düzenleyelim;
    • bind-address : Belirli interfacelerin dinlenmesini sağlar. Birden fazla interface ekleyebiliriz. 192.168.1.1,10.0.0.1
    • server_id : Bu değişken sunucu kimliğini belirtir. server_id varsayılan olarak 1’e ayarlanmıştır. Replikasyon  topolojisinde kullanılan sunucular için, her replikasyon sunucusu için 1 – 232  aralığında benzersiz bir sunucu kimliği belirtmeniz gerekir.
    • log-basename : binary logun yerini belirtiriz
    • binlog-format : binary log formatını seçmemizi sağlayan parametre. STATEMENT, ROW ve MIXED değerlerini alabilir.
    • binlog-do-db : Replike edilecek veritabanını belirtir bunun yerine istersek binlog-ignore-db parametresi ile replike edilmeyecek veritabanlarınıda ayarlayabiliriz.
[mysqld]
bind-address = 192.168.10.130
server_id=1
log-basename=master
log-bin=/var/log/mysql/mariadb-bin
binlog-format=row
binlog-do-db=masterdb

    • Sonrasında mysql resetleyin.
systemctl restart mysql
    • Mysql e root yetkisi ile erişim yapın.
mysql -u root -p 
    • Replikasyon haklarına sahip bir user yaratacağız.
STOP SLAVE;
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY '112233ee';
select host, user, password from mysql.user;
Flush privileges;
    • Master database’de kesinti almak gerekmektedir. Replike edilecek database’e bağlanılıp tüm tablolar lock’lanır.
FLUSH TABLES WITH READ LOCK; 
    • Şimdi, replike edilecek database’in durum bilgisini almak için ile aşağıdaki komutu çalıştırın.

NOT : mariadb-bin.000001 dosyası 804 numaralı poziyonu bir yere not alalım.

MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 |      804 | masterdb     |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec) 
    • Ardından, master sunucudaki tüm veritabanlarının yedeğini alın ve slave sunucuya aktarın.
mysqldump --all-databases --user=root --password --master-data > alldatabase.sql
scp alldatabase.sql root@192.168.10.129:/root/
    • Şimdi master sunucudaki veritabanına girip lock’ı kaldırabiliriz;
mysql -u root -p

UNLOCK TABLES;
exit;
    • Şimdi slave sunucudaki mysql veritabanını konfigure ederiz. Bunun için /etc/mysql/my.cnf dosyasını  aşağıdaki gibi güncelleriz.

[mysqld]
bind-address = 192.168.10.129
server-id = 2
replicate-do-db=masterdb
    • Veritabanını yeniden başlatırız.
systemctl restart mysql
    • Ardından aldığımız yedeği veritabanına aktarırız;
mysql -u root -p > alldatabase.sql
    • Slave veritabanına login olup parametre değişikliği yapmak için slave’i durduralım.
mysql -u root –p
STOP SLAVE;
    • Ardından slave’ı master’ı kullanacak şekilde aşağıdaki gibi yapılandıralım;
CHANGE MASTER TO MASTER_HOST='192.168.10.130', MASTER_USER='slave_user', MASTER_PASSWORD='112233ee', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=804; 
  • Slave’i çalıştıralım ve daha sonra durumuna bakalım. Slave_IO_Running ve Slave_SQL_Running parametrelerinin YES olması ve herhangi bir error olmaması gerekmektedir.
    START SLAVE;
    SHOW SLAVE STATUS\G;
    
    MariaDB [(none)]> SHOW SLAVE STATUS\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.10.130
                      Master_User: slave_user
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000007
              Read_Master_Log_Pos: 370
                   Relay_Log_File: mysqld-relay-bin.000062
                    Relay_Log_Pos: 660
            Relay_Master_Log_File: mariadb-bin.000007
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: masterdb
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 370
                  Relay_Log_Space: 1004
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
                       Using_Gtid: No
                      Gtid_IO_Pos: 
          Replicate_Do_Domain_Ids: 
      Replicate_Ignore_Domain_Ids: 
                    Parallel_Mode: conservative
    
    
    
  • Test amaçlı master veritabanında tablo create edilerek test yapılır;
    mysql -u root -p
    
    create database masterdb;
    use masterdb;
    create table mastertable (c int);
    insert into mastertable (c) values (1);
    select * from mastertable;
    +------+
    | c    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
  • Oluşturulan tablo slave veritabanında kontrol edilir;
  • mysql -u root -p
    
    use masterdb;
    select * from mastertable;
    +------+
    | c    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    

    Musafa Bektaş Tepe
    İyi Çalışmalar

    Referanslar;
    https://mariadb.com/kb/en/library/standard-replication/

Loading