24.06.2009

MySQL veritabani Replikasyonu I


Hepimizin bildigi gibi, hangi sistemi yonetiyorsak yonetelim yedekleme cok onemli bir kavramdir.
Ozellikle Veritas Netbackup Client kullanan arkadaslar da bilirler ki, en buyuk sorunlardan biri NetBackup'in MySQL yedekleme agent'i bulunmamakta.
Dolayisiyla, elimizdeki MySQL veritabani sunucusunu ancak su sekilde yedekleyebiliriz:

1. MySQL veritabani sunucumuzu durdurup, SuSE sistemlerde /var/lib/mysql altinda bulunan data klasorlerini kopyalamak sureti ile yedekleriz
2.MySQL Sunucusu ile birlikte gelen "mysqldump" aracini kullanabiliriz.
$ mysql -u{username} -p{password} {database_ismi} > dump.sql
(Ayrica function ve trigger yedekleme konusunda da bir yazim vardi)

Ancak herhangi bir sekilde sunucumuz down oldugunda, geri dondurmek icin oncelikle yeni bir sistem kurmak ve uzerindeki MySQL Sunucusunu yapilandirmaktan sonra, aldigimiz en son yedekten grei donmemiz gerekir.
Yalniz burada da goze alinmasi gereken kayiplar var, ne gibi:

1. Sunucuyu yeniden kurmak, yapilandirmak, MySQL veritabani sunucusunu kurarak,yapilandirmak icin harcanan zaman
2. Geri donus yapacagimiz veri sadece -en son - yedekledigimiz ankine ait olacaktir. Ornegin. hergun saat 14:00 de yedek aliyorsak ve sistemi 13:00 da kaybedersek, yaklasik 23 saatlik bir data kaybi gerceklesmis olur. BU kayip bazen onemsiz olabilecegi gibi, ozellikle buyuk sirketlerde-projelerde hayati onem arz edebilir.

Bu kayiplarin onune gecmek icin yapmamiz gereken MySQL veritabani sunucumuz uzerindeki veritabanlarini replike edebiliriz. Nasil mi?

1. Yeni bir sunucu ve onun uzerine de MySQL veritabani sunucusu kuruyoruz.
---- MASTER ----
2. Eski - yeni adiyla Master - sunucumuzdaki /etc/my.cnf dosyasini yeni kurdugumuz - yeni adiyla Slave - sunucumuza kopyaliyoruz.
3. Ardindan Master sunucumuzun /etc/my.cnf dosyasini aciyoruz ve [mysql] ile baslayan bolume

server-id = 1
log-bin=mysqlreplikasyon-bin

satirlarini ekliyoruz.
4. Master sunucu uzerindeki my.cnf dosyasinda bind-address ve skip-networking gecen satirlarin basina # koyuyoruz.
---- MASTER ----


---- SLAVE ----
5. Slave sunucumuza ssh ile baglanip /etc/my.cnf dosyasini aciyoruz.
7. server-id=1 satirini ,
#server-id=1 olarak degistiriyoruz.
6. Yine [mysqld] ile baslayan bolume gelip su satirlari ekliyoruz.

server-id = 2
master-host ={MASTER_SUNUCU_IPSI}
master-user =repl_user
master-password ={SIFRE}
master-port =3306
log-bin=mysqlreplikasyon-bin
replicate-do-db={DATABASE_ADI}
report-host =SLAVE_SUNUCU_TANIMLAMASI
---- SLAVE ----

7. Master ve Slave sunucu uzerindeki MySQL veritabanlarini durduruyoruz

# rcmysql stop (SuSE sistemler icin)
# service mysqld stop (RedHat Sistemler icin)
# /etc/init.d/mysqld stop

8. Master sunucu uzerindeki datafile klasorlerini "tar" liyoruz.

# tar -cvpPf mysqlrepl.tar /var/lib/mysql/{database_ismi}

9. sftp ya da ftp ile Master sunucuda aldigimiz tar yedegini Slave sunucuya atip, yedegi aciyoruz.

# tar -xvpPf mysqlrepl.tar

10 . Master ve Slave sunucuyu baslatiyoruz

# rcmysql start (SuSE sistemler icin)
# service mysqld start (RedHat Sistemler icin)
# /etc/init.d/mysqld start

11. Master sunucusundaki MySQL konsola dusuyoruz.

mysql> show master status\G;

11. Master sunucusundaki MySQL konsola dusuyoruz.

mysql> show slave status\G;