Öğreticilere bağlantılar sağladım. Ubuntu'da my.cnf dosyasının /etc/mysql/my.cnf içinde olduğunu ve howtoforge eğitiminde olduğu gibi /etc/my.cnf içinde olmadığını unutmayın. Yaptığımda OKUMA KİLİTLİ YIKAMA TABLOLARI kullanmadım; usta. Ana sunucunuzda çok fazla yazma etkinliği varsa, yedeklemeden önce bu komutu çalıştırarak tablolarınızı kilitlemeniz gerekebilir. READ LOCK İLE FLUSH TABLES kullanıyorsanız; yedeklemenizden sonra UNLOCK TABLES programını çalıştırmak isteyeceksiniz. Herhangi bir sorunla karşılaşırsanız, bana bildirin.
Redhat / CentOS için yapılan dövüş hakkında bulduğum öğretici:
http://www.howtoforge.com/mysql_database_replication
Ubuntu için iyi görünen başka bir öğretici
http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/
İşte kullandığım yapılandırma:
MASTER Sunucusunda
Ana sunucuyu yapılandırın:
vi /etc/mysql/my.cnf
[mysqld]
# bind-address = 127.0.0.1 (comment this out)
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
max_binlog_size = 100M
expire_logs_days = 1
MySQL'i yeniden başlatın:
/etc/init.d/mysql restart
Mysql konsoluna bağlan: mysql -u root -ppassword
Çoğaltma kullanıcısı için izinler oluşturun ve izin verin.
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Bu bilgileri bir yere kopyaladığınızdan veya görünür bıraktığınızdan emin olun
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
Veritabanını bir dosyaya dökün:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Veritabanı dökümünü scp kullanarak slave sunucusuna kopyalayın veya isterseniz ftp kullanın:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
SLAVE Sunucusunda
MySQL yapılandırmasını düzenleyin:
vi /etc/mysql/my.cnf
[mysqld]
# slave server configuration
server_id = 2
# this is optional, but I find it useful to specify where the relay logs go to control.
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M
MySQL'i yeniden başlatın: /etc/init.d/mysql restart
Yedeği geri yükleyin:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
MySQL'e bağlanın:
mysql -u root -ppassword
stop slave;
# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;
start slave;
Çalıştır SHOW SLAVE STATUS\G
:
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: ipaddressmaster
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.0000001
Read_Master_Log_Pos: 100
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 1
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 17324288
Relay_Log_Space: 17324425
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
1 row in set (0.02 sec)
Daha sonra, çoğaltmanın çeşitli nedenlerle başarısız olabileceğini unutmayın. Slave'de, SHOW SLAVE STATUS \ G komutunu çalıştırarak durumu izleyebilirsiniz. Veya durumu izlemek ve başarısız olursa e-posta göndermek için bir cron işi ayarlamak. Bu komuttan çıktı ile familar alın. Çoğaltma düzgün çalışıyorsa, "Slave_IO_State: Master'ın olay göndermesini bekliyorsunuz" ifadesini görmelisiniz.
Bu kurulumu doğru bir şekilde aldıktan sonra, bu çoğaltmayı izlemek için bir komut dosyası sağlayabilirim.
İşte MySQL hata günlüğünü izlemek için bir komut dosyası. Satırı eklerseniz
[Mysqld]
log-error = /var/log/mysql/mysql.err
mysql'i yeniden başlat: /etc/init.d/mysql yeniden başlat
Sonra günlük dosyasını izlemek için aşağıdaki komut dosyasını kullanabilirsiniz. Günlük herhangi bir şekilde değişirse, bağımlı sunucuda bir hata oluştuğunu bildiren bir e-posta alırsınız. Hata günlüğünün düzenli olarak kontrol edilmesini istiyorsanız, bu komut dosyasını crontab'ınıza eklemeniz gerekir.
İşte örnek bir komut dosyası: /somepath/monitor_mysql_log.sh
#! /bin/sh
MAIL_TO="addressemail@something.com"
# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err
# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1
# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG
[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO
# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG
Crontab'a eklemek için.
Komut dosyasını yürütülebilir yapın:
chmod +x /somepath/monitor_mysql_log.sh
Crontab'ı güncelleyin:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
Ve senaryo her dakika çalıştırılacak.
Verdiğim senaryo, çabucak bir araya getirdiğim bir senaryo. Ayrıca, sunucunuzun e-posta gönderebilmesi için postfix veya sendmail gibi bir şey yüklemeniz gerekir.