26 Ekim 2010 Salı

MySQL Master - Slave Replikasyonu

MySQL sunucular arasındaki replikasyon binary log mekanizmasına dayanır. Replikasyonun "master" rolünü üstlenen MySQL sunucusu veritabanları üzerinde oluşan tüm değişiklileri binary log dosyasına yazar, replikasyonun "slave" rolünü üstlenen sunucuları ise master'ın binary loglarını okuyup gerçekleşen değişiklikleri kendileri üzerindeki veritabanlarında gerçekleştirerek replikasyonu gerçekleştirirler.

Replikasyon işleminin gerçekleşebilmesi için master sunucuda binary logging'in devreye alınması gerekmektedir. Replikasyonda rol alacak tüm sunucuların tüm sistemde tek olan (unique) ve server-id parametresi ile belirlenen ID değerine sahip olmaları gerekmektedir.


1. "Master" Rolünü Üstelenecek Sunucunun Ayarlanması

Binary logging işleminin başaltılması için my.cnf  ( windows sunucularda my.ini ) dosyasında yer alan [mysqld] bölümüne aşağıdaki satırlar eklenmelidir. Eklenen server-id değeriyle master sunucunun ID'si "1" olarak ayarlanmıştır.

[mysqld]
log-bin=mysql/bin
server-id=1
Binary logging başlatıldıktan sonra master sunucu, üzerinde gerçekleşen değişikliklerin tamamını log dosyasına yazacaktır. Tüm veritabanları yerine sadece istenen veritabanlarının loglanması için binlog-do-db veya binlog-ignore-db parametreleri kullanılabilir.


 2. "Slave" Rolünü Üstlenecek Sunucuların Ayarlanması

Replikasyona katılabilmesi için "Slave" sunucularında server-id değerlerinin belirlenmiş olması gerekmektedir.Aşağıdaki satırları my.cnf ( windows sunucularda my.ini ) dosyasına ekleyerek sunucunun server-id değerini "2" olarak ayarlamış oluyoruz.

Slave sunucunun master üzerinde gerçekleşen tüm değişiklikler yerine sadece istenen değişiklikleri almasını sağlama mümkün. Aşağıdaki satırları ekleyerek kav ve avantfax isimli veritabanlarının ve amavisd veritabanında yer alan quarantine isimli tablonunu replikasyon dışında tutulmasını sağlayabiliriz.

[mysqld]
server-id=2
replicate-ignore-db=kav
replicate-ignore-db=avantfax
replicate-ignore-table=amavisd.quarantine
Benzer şekilde replicate-do-db ve replicate-do-table paramaetrelerini kullanarak hangi veritabanı ve tabloların replikasyonunun yapılacağını belirlemek mümkündür.

3. Replikasyon için kullanıcı hesabının oluşturulması.

Replikasyon işlemi sırasında slave sunuclar master sunucuya MySQL kullanıcısı ve parolası kullanarak bağlanmalıdır. Bu nedenle master üzerinde bir kullanıcı hesabı oluşturulmalıdır. "REPLICATION SLAVE" hakkında sahip herhangi bir kullanıcı hesabı replikasyon amacıyla kullanılabilir.

Replikasyona katılacak slave sunuclar için tek bir kullanıcı hesabı kullanılabileceği gibi her slave için ayrı bir hesap da kullanılabilir.

Aşağıdaki satırları mysql oturumu altında çalıştırarak replikasyon için kullanacağımız hesabı oluşturalım.


mysql>CREATE USER 'replicator'@'%slave_adresi' IDENTIFIED BY 'replicator_password';

mysql>GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%slave_adresi';


Oluşturduğumuz replicator isimli kullanıcı sadece "slave_adresi" ile tanımlanan adresten bağlanacak şekilde yetkilendirildiğine dikkat edin, eğer aynı kullanıcıyı farklı adresler için kullanacaksa kullanıcı hesabı, domain adı kullanılarak 'replicator'@'%.test.com' gibi) yada host adresi belirtilmemeden ('replicator'@'%' gibi) oluşturulmalıdır.


4. Master Sunucunun Binary Log Pozisyonunun Belirlenmesi.

Slave sunucuların replikasyona başlayabilmesi için master sunucunun log pozisyonunu bilmeleri gerekmektedir. Replikasyon yapacağınız veritabanları veri içeriyorsa öncelikle bu verilerin değişmelerini engellemek ve mevcut verileri dump ederek bir kopyasını almanız gerekmektedir. Eğer verilerin değişmesi engellenmezse alınacak olan log pozisyonu ve dump edilecek veri arasında tutarsızlık oluşacağından replikasyon sonrasında sunucular üzerindeki veri'nin bütünlüğü bozulacaktır.

Master sunucunun log pozisyonunu öğrenmek için aşağıdaki adımları takip edin

Bu komut sonrasında veritabanları READ LOCK ile kilitlenerek değiştirilmeleri engelenecektir.


mysql> FLUSH TABLES WITH READ LOCK;

Log dosyası pozisyonunu öğrenmek için aşağıdaki komutu çalıştıralım.

Komut sonucunda log dosyasının adının mysql-bin.000005 olduğunu ve şu an 179 numaralı pozisyonda oluğumuzu belirlemiş olduk.

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      179 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.02 sec)


5. Mevcut Veriyi Dump Ederek Bir Kopyasını Alma
Daha önce kilitlediğimiz mevcut veriyi mysqldump isimli aracı ve veritabanlari üzerinde yetkili bir kullanıcı hesabı kullanarak dump edelim. Komutu çalıştırdığımızda user_name isimli kullanıcı için parola girmemiz istenecektir. 
$ mysqldump --all-databases --lock-all-tables -u user_name -p >databasedump.db
Yukarıdaki komut sunucu üzerindeki tüm dosyaları dump edecektir. Sadece replikasyonunu yapacağımız veritabanını dump etmek için.
Dump ettiğimizi veriyi slave sunuculara import ederek mevcut veriyi bu sunuculara aktarmış olacağız. Dump işlemini tamaladıktan sonra aşağıdaki komutu çalıştırarak tablolar üzerindeki kilidi kaldıralım.
$ mysqldump --lock-all-tables -u user_name -p --databases db1 db2 >databasedump.db


mysql> UNLOCK TABLES;

6. Dump Edilen Veriyi Slave Sunucuya Import Etme

Dump edilen veriyi slave sunucuda içeri almak için MySQL hizmetini başlatmamız gerekiyor fakat replikasyon ayarlarını tamamlamadığımızdan sunucuyu --skip-slave-start opsiyonu ile başlatamamız gerekiyor. Bunun için my.cnf dosyasına skip-slave-start parmaetresini ekledikten sonra hizmeti başlatıyoruz.

mysqldump aracı ile elde ettiğimiz databasedump.db isimli dosyayı slave sunucuya aldıktandan aşağıdaki komutu kullanarak içeri aktaracağız. 
Bu işlemin ardından master sunucudan aldığımız veritabanı kpyası slave sunucuya aktarılmış oldu.

$ mysql -u user_name -p < database.dump

7. Slave sunucunun replikasyon için ayarlanması

Slave sunucunun master sunucuya bağlanmak için ihtiyaç duayacağı bilgileri CHANGE MASTER TO komutu ile belirliyoruz. Slave sunucu, replikasyona başlayabilmek için master sunucunun adresine, log dosyasının adına, log dosyasının pozisyonuna, replikasyon için kullanılacak kullanıcı hesabının adına ve parolasına ihtiyaç duyacaktır. Daha önce belirlediğimiz bu değerleri kullanrak oluşturduğumuz  komutu slave sunucuda çalıştırarak replikasyon ayarlarını tamalayalım.
mysql> CHANGE MASTER TO
                   MASTER_HOST='master_sunucu_adresi',
                   MASTER_USER='replicator',
                   MASTER_PASSWORD='replicator_password',
                   MASTER_LOG_FILE='mysql-bin.000005',
                   MASTER_LOG_POS=179;
CHANGE MASTER TO komutuyla birlikte kullanabileceğiniz parametrelerin listesine buradan ulaşabilirsiniz.

Slave sunucunun ayarlarını tamamladıktansonra START SLAVE komutuyla slave sunucunun replikasyona başlaması sağlanır. Komut çalıştırıldıktan sonra slave, master sunucuya  bağlanıp, dump işleminden sonra gerçekleşen değişiklikleri almaya başlayacaktır.

mysql> START SLAVE;
Slave sunucuda greçekleşen replikasyon işleminin durmunu SHOW SLAVE STATUS komutuya takip edebilirsiniz. Komut master sunucu ve replikasyon süreci ve varsa oluşan hatalar konusunda bir çok veriden oluşan bir rapor üretir

Slave sunucunun, replikasyon işlemine otomatik olarak başlaması için my.cnf dosyasına eklenen skip-slave-start paramtresi kaldırılmalıdır.


Hiç yorum yok:

Yorum Gönder