MySQL Replikasyon İşlemi

Sql Replication uygulaması kısaca bir veri tabanının bir kopyasını başka bir sunucu üzerine sürekli güncel bir şekilde tutmaya yarayan ve oldukça fazla kullanım alanı olan güzel bir uygulamadır.

Örneğin çok fazla işlem hacmine sahip bir veritabanı uygulamasında sql sunucusunun kaynakları büyük miktarlardaki veri giriş çıkış işlemlerine yetişmekte zorlanabilir bu da sunucunun yerlerde sürünmesine neden olabilir. Bu performans sorunlarını, sunucunun donanımsal kaynaklarını arttırarak çözmek bazı durumlar için mümkün olmayabilir. İşte bu tip durumlarda veritabanınızın bir kopyasını ikinci bir sunucu üzerinde çalıştırmak isteyebilirsiniz.

Ya da aynı şekilde verinizin güvenliğini sağlamak amacıyla da kopya bir database’e ihtiyaç duyabilirsiniz. Hatta aynı veritabanının birden fazla fiziksel lokasyonda bulunuyor olması da gerekebilir.

İşte bu gibi senaryolar için veritabanınızı bir başka sunucuya replike edebilir ve devamlı güncellenen bir kopyasını ilgili serverda bulundurabilirsiniz. Makalenin devamında mysql üzerinde master to slave replikasyon işleminin nasıl yapıldığına ait notları bulabilirsiniz.

Ben mysql sunucularını genelde FreeBSD üzerinde çalıştırmaktayım, Bu nedenle mysql replication ile ilgili yapılandırma işlemleri FreeBSD üzerinde yapılmıştır. Ancak siz farklı bir OS kullanıyor olasınız da işleyiş temel olarak aynı olduğundan dolayı, işletim sisteminize uygun küçük değişiklikler yaparak bu yazıda anlatılanlardan yararlanabilirsiniz.

Yapılandırma ile ilgili bölüme geçmeden önce mysql replication uygulamasının teoride nasıl çalıştığıyla ilgilli kısa bir bilgi vermek istiyorum.

Mysql’de replication işleminin temel olarak master to master ve master to slave diye tabir edilen iki şekli vardır. Kısaca değinmek gerekirse;

Master to Master Replication

Master to Master mimarisinde iki adet master sunucu bulunur ve veritabanlarından herhangi birinde, insert, update, delete vs. gibi bir işlem gerçekleştiğinde, bu işlem diğer veritabanına da yansıtılır. Bu şekilde veri giriş/çıkışının hangi veritabanında olduğunun bir önemi yoktur. Her şekilde iki veritabanı birbirine replike ediliyor olur ve güncel kalmaları sağlanır.

Bu yöntem master to slave’e oranla daha komplike olduğundan dolayı teknik anlamda, örneğin veritabanınızın karmaşık bir yapıya sahip olması nedeni ile işletim sorunlarını da beraberinde getirebilir.

Master to Slave Replication

Bu makalede nasıl yapılacağı anlatılacak olan bu replikasyon şekli ise, master olarak belirlenen sunucuda gerçekleşen işlemlerin slave olarak belirlenen sunucuya yansıtılmasından ibarettir. Bu mimari de yapılan insert, update, delete vs. gibi tüm işlemler master sunucuda yapılır ve slave’e yansıtılır. Sonuç olarak replikasyon işlemi tek yönlü olarak yapılmaktadır.

Konuya teorik olarak değindikten sonra master to slave replication işleminin nasıl yapıldığına geçebiliriz.

Öncelikle iki farklı bilgisayarda çalışan birer mysql sunucunuz olduğunu varsayıyorum.
İşe master sunucusunda ki ayarlardan başlayacağız.

Master Sunucunun Yapılandırılması

İlk olarak mysql ayarlarının belirtildiği my.cnf dosyasında mysql’in networking özelliğinin açık olup olmadığından ve sunucu üzerinde tanımlı tüm ip’lere bind edilip edilmediğinden emin olmamız gerekiyor.

my.cnf dosyasını editleyin (FreeBSD’lerde /var/db/mysql dizini altında bulunur.) ve eğer varsa aşağıdaki satırların comment out (#) edilmiş olduğuna emin olun.

[quote]#skip-networking
#bind-address = 127.0.0.1[/quote]

Yukarıdaki ilk satır networking desteğini etkisizleştiriyor ikincisi ise sadece mysql’in loop back üzerinden bind edilmesini söylüyor. Bu satırların başında # yok ise bu durumda mysql network üzerinden bağlantı kabul etmeyecektir.

Şimdi de gene my.cnf dosyasında aşağıdaki satırların var olduğundan ve comment out (#) “edilmemiş” oluduğundan emin olun. (İlgili satırlar ön tanımlı olarak mevcut olmalıdır; eğer yoksa aşağıdaki gibi ekleyebilirsiniz.)

[quote]log-bin=mysql-bin
server-id = 1[/quote]

Bu satırların açıklamaları da şöyle; birinci satır mysql’in binary logging özelliğinin etkinleştirilmesini söylemektedir. Replication işlemleri için binary logları kullanılmaktadır. Master’da yapılan her işlem binary olarak loglanır ve slave sunucu masterda yapılan değişiklikleri anlayabilmek için bu binary logları kullanır. İkinci satır ise ilgili sunucunun Master olduğunu belirtmek için kullanılan ID numarasıdır.

Son olarak, my.cnf dosyasına (örneğin log-bin=mysql-bin satırının hemen altına) replike etmek istediğimiz database’le ilgili bilgiyi girelim;

[quote]binlog-do-db=testdb[/quote]

Görüldüğü gibi testdb isimli bir veritabanım var ve bu veritabanını replike edilmesi üzere belirtiyorum.

Şimdi de değişikliklerin devreye girmesi için mysql servisini restart edelim.

[quote]# /usr/local/etc/rc.d/mysql-server restart[/quote]

Master sunucunda my.cnf için yapılması gerekenler bunlardı.

Şimdi root yetkisi ile mysql sunucusuna bağlanıp, replikasyon yetkisine sahip bir kullanıcı oluşturacağız:

[quote]# mysql -u root -p
Enter password:[/quote]

Root şifreinizi girip login olduysanız sırası ile aşağıdaki komutları verip -kırmızı alanları kendinize göre düzenlemeyi unutmayın- kullanıcıyı oluşturabilirsiniz;

[quote]mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'sifreniz';
mysql> FLUSH PRIVILEGES;[/quote]

Şimdi, replike edilecek database’in durum bilgisini almak için sırası ile aşağıdaki komutları verin.

[quote]mysql> USE testdb;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;[/quote]

Show master status dediğiniz zaman replike edeceğiniz db’nin durumunu gösteren, aşağıdakine benzer bir çıktı almanız gerekir;

[quote]+------------------+----------+---------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+---------------+------------------+
| mysql-bin.000002 | 351 | testdb,testdb | |
+------------------+----------+---------------+------------------+
1 row in set (0.00 sec)[/quote]

Görüldüğü gibi mysql-bin.000002 isimli binary log kullanılıyor ve pozisyonu 351.
Bu bilgileri bir yere kaydedin; zira slave tarafında yapılacak olan ayarlamalar sırasında bu bilgiler lazım olacak.

Şimdi quit diyip çıkalım.

[quote]mysql> quit;[/quote]

Master tarafında yapılması gereken işlemler hemen hemen bitti. Bundan sonraki adım, master sunucudaki testdb isimli veritabanının son halini slave olarak belirlediğiniz mysql sunucusuna aktarmaktan ibaret.

Bu işlemi yapmanın bir iki yolu var; bunlardan birisi (ve bence en kullanışlısı olanı) mysqldump ile slave üzerinden master’a bağlanıp, testdb isimli veritabanının bir yedeğini almak ve alınan bu dump dosyasını slave sunucu üzerine restore etmek.

Mysqldump dışında, masterdaki database’i slave üzerinde çalıştırmak için kullanılabilecek diğer yöntemlere örnek olarak, bir sql management programı olan SQLyog isimli bir yazılımı kullanmak ve export/import özelliğinden yararlanarak datayı bir yerden bir yere taşımayı verebiliriz. Bunun dışında slave üzerinde LOAD DATA FROM MASTER; komutunu kullanabilir ve verinin masterdan yüklenmesini sağlayabilirsiniz. Ancak bu komut bir süre sonra mysql’den kaldırılacağı için kullanmanızı tavsiye etmem.

Neyse, bu yöntemler arasında en kullanışlı olanı bana göre mysqldump demiştim ve e bu nedenle bu yöntemin nasıl uygulanacağını anlatacağım.

Master’dan Slave’e Manuel Restore

Bu işi yapabilmek için master mysql sunucunuzda slave sunucunun bağlanabileceği ve backup alabilmesi için select komutu çalıştırma yetkisi bulunan bir kullanıcıya ihtiyacınız var. Yukarıda slave’in master’a bağlanması için bir kullanıcı açmıştık;

Bu işi yapabilmek için master sunucusunda slave üzerinden bağlantı kabul eden ve select yetkisi tanıyan bir kullanıcı bulunması gerekiyor. Önce bu kullanıcıyı açalım ve testdb’den select yapabilmesi için yetki verelim.

Master mysql sunucunuza bağlanın ve aşağıdaki komutları çalıştırın.

Not: Kırmızı bölümleri kendinize göre düzenlemeyi unutmayın.

[quote]mysql> CREATE USER 'kullanici_adi'@'slave_mysqlin_ipsi' IDENTIFIED BY 'sifre';
mysql> GRANT SELECT, LOCK TABLES ON testdb.* TO 'backupuser'@'slave_mysqlin_ipsi'[/quote]

Yukarıdaki komutlar ile master sunucusu üzerinde replike edilecek testdb isimli veritabanına select ve lock tables yetkisi ile erişebilecek bir kullanıcı tanımlamış olduk.

Şimdi slave sunucuya geçip aşağıdaki komutu çalıştırarak ilgili db’nin yedeğini alabiliriz.
Not: Bu işlemi direk komut satırından çalıştırın.

[quote]# mysqldump -h master_sunucunun_ipsi -u kullanici_adi -psifre testdb > testdb.sql[/quote]

Bu komutla da msater sunucusuna (açmış olduğumuz kullanıcı ile) bağlanıp testdb isimli veritabanının yedeğini aldık.
Şimdi bu yedeği slave mysql’e restore edeceğiz.

Önclikle, slave mysql’e bağlanın ve aşağıdaki komutlarla, masterda bulunan ve replike edilecek olan database’le aynı isimde boş bir database oluşturun ve mysql shell’den çıkın.

[quote]# mysql -u root -p
Enter password:

mysql> create database testdb;
mysql> quit;[/quote]

Database oluşturulduğuna göre, almış olduğumuz dump dosyasını üzerine restore edebiliriz.

[quote]# mysql -u root -psifre testdb < testdb.sql[/quote]

Not: -p’den sonra boşluk olmaması gerekiyor.

Herşey yolunda gitti ve herhangi bir hata almadıysanız database restore edilmiş olmalı.

Şimdi master tarafında son bir şey yapmamız gerekiyor. Hatırlarsanız masterdaki veritabanının log ve pozisyon bilgisini alma sırasında FLUSH TABLES WITH READ LOCK; komutunu kullanmıştık. Şimdi lock durumunu ortadan kaldırmak gerekiyor.

Bunun için master mysql sunucusuna shell’den bağlanalım ve unlock komutunu verelim.

[quote]# mysql -u root -p
Enter password:

mysql> UNLOCK TABLES;
mysql> quit;[/quote]

Master ile ilgili yapılacak işlemler bu kadardı. Sırada Slave ile ilgil yapılandırmalar var.

Slave Sunucunun Yapılandırılması

Şimdi slave sunucusuna, master sunucu ile ilgili bilgileri vereceğiz. Bu işlem için gene my.cnf dosyasından yararlanıyoruz.

my.cnf’yi açın ve aşağıdaki satırları -kırmızı alanları kendinize göre düzenleyerek- ekleyin:

Not: server-id değeri default olarak 1 şeklinde olarak gelmektedir.

[quote]server-id = 2
master-host=master_mysqlin_ipsi
master-user=slave_user
master-password=sifreniz
master-connect-retry=60
replicate-do-db=testdb[/quote]

Gördüğünüz gibi burada master mysql’in ip adresi, replikasyon yetkisi ile açtığımız kullanıcı adı ve şifresi ile replike edilecek db’nin ismi belirtiliyor.

Şimdi de mysql’i restart edeceğiz.

[quote]# /usr/local/etc/rc.d/mysql-server restart[/quote]

Son olarak slave’nin replikasyona başlaması için masterdan alarak -bir kenera not ettiğimiz- log adı ve pozisyon bilgilerini vererek replikasyona balamasını sağlayacağız.

Slave sunucunuzun mysql shell’ine bağlanarak aşağıdaki gibi slave stop komutunu verin.

[quote]#mysql -u root -p
Enter password:

mysql > SLAVE STOP;[/quote]

Şimdi de bahsettiğim bilgileri şu komut ile veriyoruz. (Kırmızı ile belirtilmiş bölümleri kendinize göre düzenlemeyi unutmayın.)

[quote]CHANGE MASTER TO MASTER_HOST='master_mysqlin_ipsi', MASTER_USER='slave_user' ,MASTER_PASSWORD='sifreniz' ,MASTER_LOG_FILE='mysql-bin.000002' ,MASTER_LOG_POS=351;[/quote]

Görüldüğü gibi bold olarak belirtilmiş değerler master tarafındaki binary dosyasının ismi ve pozisyon numarasını teşkil ediyor. Bunun dışındakiler de master sunucunuzun ip adresi, masterdaki replikasyon kullanıcısının adı ve şifresinden ibaret.

Komutu girdiniz ve sorunla karşılaşmadıysanız, slave’i start edebilir ve replikasyona başlanmasını sağlayabiliriz.

[quote]mysql > SLAVE START;
mysql > quit;[/quote]

Hepsi bu kadardı.

Normal şartlarda replikasyon işinin başlamış ve master sunucuda yapılan işlemlerin slave’e yansıtılıyor olması gerekir. Bunu denemek için master’daki testdb veritabanına bir kayıt ekleyip hemen ardından aynı kayıdın slave mysql’deki testdb veritabanında bulunup bulunmadığını kontrol edebilirsiniz.

Kaynak:

[url=http://dev.mysql.com/doc/refman/5.0/en/replication.html]http://dev.mysql.com/doc/refman/5.0/en/replication.html[/url]
[url=http://www.howtoforge.com/mysql_database_replication]http://www.howtoforge.com/mysql_database_replication[/url]

Konular

Hanci.org sizlere daha iyi hizmet sunmak için çerezleri kullanıyor.
Hanci.org sitesini kullanarak çerez politikamızı kabul etmiş olacaksınız.
Detaylı bilgi almak için Gizlilik ve Çerez Politikası metnimizi inceleyebilirsiniz.