Podałem linki do samouczków. Pamiętaj tylko, że w Ubuntu plik my.cnf znajduje się w /etc/mysql/my.cnf, a nie w /etc/my.cnf, jak w samouczku Howtoforge. W moim ustawieniu nie korzystałem z FLUSH TABLES WITH READ LOCK; na mistrza. Jeśli na serwerze głównym występuje duża aktywność zapisu, może być konieczne zablokowanie tabel przez uruchomienie tego polecenia przed utworzeniem kopii zapasowej. Jeśli używasz FLUSH TABLES WITH READ LOCK ;, po utworzeniu kopii zapasowej będziesz chciał uruchomić UNLOCK TABLES. Jeśli napotkasz jakiekolwiek problemy, daj mi znać.
Oto samouczek, który znalazłem na Howto Forge, stworzony dla Redhat / CentOS:
http://www.howtoforge.com/mysql_database_replication
Kolejny samouczek, który wyglądał dobrze dla Ubuntu
http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/
Oto konfiguracja, której użyłem:
Na serwerze MASTER
Skonfiguruj serwer główny:
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
Uruchom ponownie MySQL:
/etc/init.d/mysql restart
Połącz się z konsolą mysql: mysql -u root -ppassword
Twórz i udzielaj uprawnień użytkownikowi replikacji.
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Pamiętaj, aby gdzieś skopiować te informacje lub pozostawić je widoczne
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
Zrzuć bazę danych do pliku:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Skopiuj zrzut bazy danych na serwer podrzędny za pomocą scp lub użyj ftp, jeśli chcesz:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
Na serwerze SLAVE
Edytuj konfigurację mysql:
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
Uruchom ponownie MySQL: /etc/init.d/mysql restart
Przywróć kopię zapasową:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
Połącz z MySQL:
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;
Uruchom 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)
Następnie pamiętaj, że replikacja może się nie powieść z różnych powodów. Na urządzeniu slave możesz monitorować status, uruchamiając polecenie SHOW SLAVE STATUS \ G; Lub skonfiguruj zadanie CRON do monitorowania statusu i wysyłania e-maili, jeśli się nie powiedzie. Zapoznaj się z danymi wyjściowymi tego polecenia. Jeśli replikacja działa poprawnie, powinieneś zobaczyć „Slave_IO_State: Oczekiwanie na przesłanie zdarzenia przez master”.
Po prawidłowym ustawieniu tej konfiguracji mogę dostarczyć skrypt do monitorowania tej replikacji.
Oto skrypt do monitorowania dziennika błędów w MySQL. Jeśli dodasz linię
[mysqld]
log-error = /var/log/mysql/mysql.err
uruchom ponownie mysql: /etc/init.d/mysql restart
Następnie możesz użyć następującego skryptu do monitorowania pliku dziennika. Jeśli dziennik zmieni się w jakikolwiek sposób, otrzymasz wiadomość e-mail z powiadomieniem, że wystąpił błąd na serwerze podrzędnym. Jeśli chcesz regularnie sprawdzać dziennik błędów, musisz dodać ten skrypt do swojego pliku crontab.
Oto przykładowy skrypt: /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
Aby dodać do crontab.
Ustaw skrypt jako wykonywalny:
chmod +x /somepath/monitor_mysql_log.sh
Zaktualizuj crontab:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
A skrypt będzie uruchamiany co minutę.
Skrypt, który podałem, to skrypt, który po prostu szybko skompletowałem. Ponadto, aby serwer mógł wysyłać wiadomości e-mail, musisz zainstalować coś takiego jak postfix lub sendmail.