Инструкция по настройки простой репликации с мастер сервера на слэйв сервер.

Данная инстракция описывает работу в связке FreeBSD 8.2 + MySQL 5.1

Настройка мастера
Нам необходимо внести изменения в /usr/local/etc/my.cnf (если его нет, копируем с /usr/local/share/mysql/my-medium.cnf)
Обязательно укажем уникальный ID сервера, путь для бинарных логов и имя БД для репликации в секции [mysqld]:

server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb

Убедитесь, что у вас достаточно места на диске для бинарных логов.

Добавим пользователя replication, под правами которого будет производится репликация. Будет достаточно привилегии «replication slave «. В сети часто встречается инструкция такого вида:

mysql@master> GRANT replication slave ON "testdb".* TO "replication"@"192.168.1.1" IDENTIFIED BY "password";

Когда я выполнял у себя эту реализацию — закончилось неудачей. Права на репликацию — административная опция и если у вас не получилось — пробуйте этот вариант:

mysql@master> GRANT replication slave ON *.* TO "replication"@"192.168.1.1" IDENTIFIED BY "password";

Перезагрузим MySQL, чтобы изменения в конфиге вступили в силу:

root@master# service mysql-server restart

Если все прошло успешно, команда «show master status» должна показать примерно следующее:

mysql@master> SHOW MASTER STATUS\G
File: mysql-bin.000003
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

Значение position должно увеличиваться по мере того, как вносятся изменения в БД на мастере.

Настройка реплики
Укажем ID сервера, имя БД для репликации и путь к relay-бинлогам в секции [mysqld] конфига, затем перезагрузим MySQL:

server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb
root@replica# service mysql-server restart

Переносим данные
Здесь нам придется заблокировать БД для записи. Для этого можно либо остановить работу приложений, либо воспользоваться установкой флажка read_only на мастере (внимание: на пользователей с привилегией SUPER этот флаг не действует). Если у нас есть таблицы MyISAM, сделаем также «flush tables»:

mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;

Посмотрим состояние мастера командой «show master status» и запомним значения File и Position (после успешной блокировки мастера они не должны изменятся):
File: mysql-bin.000003
Position: 98

Делаем дамп БД, и после завершения операции снимаем блокировку мастера:

mysql@master> SET GLOBAL read_only = OFF;
mysql@master> UNLOCK TABLES;

Переносим дамп на реплику и восстанавливаем из него данные.
Наконец, запускаем репликацию командами «change master to» и «start slave» и посмотрим, все ли прошло хорошо:

mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.1.101", MASTER_USER = "replication", MASTER_PASSWORD = "password", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_LOG_POS = 98;
mysql@replica> start slave;

Значения MASTER_LOG_FILE и MASTER_LOG_POS мы берем с мастера.

Посмотрим, как идет репликация командой «show slave status»:

mysql@replica> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: testdb,testdb
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: 98
Relay_Log_Space: 235
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: 5

Slave_IO_Running: Yes, Slave_SQL_Running: Yes — говорит о том, что репликация идет успешно.

Update #1

При появлении ошибки:

ERROR 1201 (HY000) at line 1: Could not initialize master info
structure; more error messages can be found in the MySQL error log

На slave’е необходимо выполнить следующее:

stop slave;
reset slave;
change master to.... ;
start slave;

Update #2

Если бинарные логи переполнили раздел, необходимо воспользоваться следующими командами:

show binary logs;
purge binary logs before '2012-07-11 00:00:01'
Tagged with:  

10 Responses to Простая репликация БД MySQL

  1. Денис:

    у меня Slave_IO_Running: No почему? и как исправить?

  2. Passenger:

    Cкорее всего разные позиции
    SHOW MASTER STATUS
    Position: 98 # в этой строке он должен показать ту же позицию что и здесь:

    SHOW SLAVE STATUS
    Read_Master_Log_Pos: 98

    Для объективной оценки ситуации необходимы выводы обеих команд.

  3. Денис:

    mysql> SHOW MASTER STATUS;
    +——————+———-+—————+——————+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +——————+———-+—————+——————+
    | mysql-bin.000002 | 106 | | |
    +——————+———-+—————+——————+
    1 row in set (0.00 sec)

    mysql>

    ———————————————————————————————————

    mysql> SHOW SLAVE STATUS;
    +———————-+—————+————-+————-+—————+——————-+———————+————————+—————+————————+——————+——————-+——————+———————+———————+————————+————————-+——————————+————+————+—————+———————+——————+——————+—————-+—————+———————+———————+———————+——————+——————-+—————-+————————+——————————-+—————+—————————————————————————————+—————-+—————-+
    | Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error |
    +———————-+—————+————-+————-+—————+——————-+———————+————————+—————+————————+——————+——————-+——————+———————+———————+————————+————————-+——————————+————+————+—————+———————+——————+——————+—————-+—————+———————+———————+———————+——————+——————-+—————-+————————+——————————-+—————+—————————————————————————————+—————-+—————-+
    | Connecting to master | 172.16.0.96 | repl | 3306 | 60 | mysql-bin.000002 | 106 | mysql-relay-bin.000001 | 4 | mysql-bin.000002 | No | Yes | test | | | | | | 0 | | 0 | 106 | 106 | None | | 0 | No | | | | | | NULL | No | 2013 | error connecting to master ‘repl @172.16.0.96 :3306′ — retry-time: 60 retries: 86400 | 0 | |
    +———————-+—————+————-+————-+—————+——————-+———————+————————+—————+————————+——————+——————-+——————+———————+———————+————————+————————-+——————————+————+————+—————+———————+——————+——————+—————-+—————+———————+———————+———————+——————+——————-+—————-+————————+——————————-+—————+—————————————————————————————+—————-+—————-+
    1 row in set (0.00 sec)

    mysql>

  4. Passenger:

    Очень ценный вывод помогающий разобраться в ситуации.
    По ошибке «error connecting to master ‘repl @172.16.0.96 :3306′» надо проверить следующее:
    1.Проверить работает ли на внешнем интерфейсе mysql. В некоторых дистрибутивах mysql запускает слушать порт только на localhost
    2.Проверить фаервол
    3.Проверить права на пользователя repl. Надо давать полные права (ALL PRIVILEGES).

  5. Passenger:

    Минимальная проверка — с SLAVE машины должен выполняться коннект на MASTER

    mysql -u repl -h 172.16.0.96 -p
  6. Денис:

    да всё получилось, оказывается в my.cnf был «локалхост»
    bind-address =127.0.0.1
    изменил на ip и поехало

    ещё у вас в строке:
    CHANGE MASTER TO MASTER_HOST = «192.168.1.101 «, MASTER_USER = «replication «, MASTER_PASSWORD = «password «, MASTER_LOG_FILE = «mysql-bin.000003 «, MASTER_LOG_POS = 98;

    стоят пробелы перед кавычками ip адреса пароля и лог файла — пока их не убрал не заработало.

    ещё раз спасибо!

  7. Passenger:

    Спасибо за замечанием и поздравляю с приобретенным опытом!

  8. Works for me.
    только в конфигах мастера нужно не забывать указывать bind-address = 0.0.0.0

  9. А если сервер будет не доступен куда репликация делается, то когда включится сервер репликация пройдет?

  10. Passenger:

    Репликация должна восстановиться.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>