Я надав посилання на підручники. Пам’ятайте лише, що на Ubuntu файл my.cnf знаходиться в /etc/mysql/my.cnf, а не в /etc/my.cnf, як у підручнику howtoforge. У моєму налаштуванні я не використовував СВІТЛІ ТАБЛИЦІ З ПРОЧИТАНОЮ БЛОКУ; на майстра. Якщо ваш головний сервер має велику активність запису, можливо, вам доведеться заблокувати свої таблиці, виконавши цю команду перед тим, як створити резервну копію. Якщо ви використовуєте FLUSH TABLES AND READ LOCK ;, після резервної копії вам потрібно буде запустити UNLOCK TABLES. Якщо у вас виникнуть проблеми, дайте мені знати.
Ось підручник, який я знайшов у програмі Howto forge, зробленій для Redhat / CentOS:
http://www.howtoforge.com/mysql_database_replication
Ще один підручник, який виглядав нормально для Ubuntu
http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/
Ось конфігурація, яку я використав:
На сервері MASTER
Налаштування головного сервера:
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:
/etc/init.d/mysql restart
Підключіться до консолі mysql: mysql -u root -ppassword
Створення та надання дозволу користувачеві-реплікації.
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Обов’язково скопіюйте цю інформацію десь або залиште її видимою
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
Завантажте базу даних у файл:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Скопіюйте дамп бази даних на підлеглий сервер за допомогою scp або використовуйте ftp, якщо вам потрібно:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
На сервері SLAVE
Редагуйте конфігурацію 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
Перезапустіть MySQL: /etc/init.d/mysql restart
Відновіть резервну копію:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
Підключення до 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;
Виконати 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)
Згодом майте на увазі, що тиражування може закінчитися невдачею з різних причин. На підлеглому можна відстежувати стан, виконавши команду SHOW SLAVE STATUS \ G; Або налаштувати завдання cron для моніторингу стану та надсилання електронних листів, якщо воно не вдалося. Отримайте знайомство з результатами з цієї команди. Якщо реплікація працює правильно, ви повинні побачити "Slave_IO_State: Чекаю, коли майстер надішле подія".
Після правильного налаштування я можу надати вам сценарій для моніторингу цієї реплікації.
Ось сценарій для моніторингу журналу помилок у MySQL. Якщо ви додасте рядок
[mysqld]
log-error = /var/log/mysql/mysql.err
перезапустити mysql: /etc/init.d/mysql перезапустити
Тоді ви можете використовувати наступний сценарій для контролю журнального файлу. Якщо журнал зміниться будь-яким чином, ви отримаєте електронний лист із повідомленням про помилку на підлеглому сервері. Якщо ви хочете, щоб журнал помилок перевірявся регулярно, вам потрібно буде додати цей скрипт у свій crontab.
Ось зразок сценарію: /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
Додавати до кронтабу.
Зробіть сценарій виконуваним:
chmod +x /somepath/monitor_mysql_log.sh
Оновіть чітко:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
І сценарій буде виконуватися щохвилини.
Я надав сценарій - це сценарій, який я просто швидко склав. Крім того, для того, щоб ваш сервер міг надсилати електронні листи, вам доведеться встановити щось на кшталт postfix або sendmail.