понедельник, 17 мая 2010 г.

Настройка Master-Slave репликации в MySQL 5

Настройка Master-Slave репликации в MySQL

Исходные данные

  1. Хост №1 (mysql1) - будущий master, ОС ALT Linux Sisyphus, СУБД MySQL 5.0, существующая база replica;
  2. Хост №2 (mysql2) - будущий slave, ОС ALT Linux Sisyphus, СУБД MySQL 5.0.
СУБД на обоих хостах запущены и работают.

Требуется

Настроить репликацию базы replica на хосте mysql1 на хост mysql2 в режиме master-slave.

Порядок действий

На хосте mysql1

В файле конфигурации MySQL (/var/lib/mysql/my.cnf):
  1. Отключаем параметр skip-networking
  2. Добавляем параметры:
server-id=1
log-bin=/log/bin.log
binlog-do-db=replica
binlog-ignore-db=mysql
binlog-ignore-db=test
Перезапускаем демона.
#service mysqld restart
В консоли MySQL создаём на master-хосте пользователя с полномочиями на репликацию:
$mysql -uroot -p

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave';
mysql> FLUSH PRIVILEGES;
mysql> USE replica;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

+------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000002 |       98 | replica      | mysql,test       |
+------------+----------+--------------+------------------+
Запоминаем параметры File и Position.
Далее создаём дамп реплицируемой базы:
$mysqldump -uroot -p replica > replica.dump
И переносим этот дамп на slave-хост.
Внимание. Блокировка таблиц будет снята, если выйти из консоли MySQL. Для создания дампа базы и переноса его на slave-хост следует использовать другую пользовательскую сессию.
После выполнения всех операций на slave-хосте в консоли MySQL разблокируем таблицы:
mysql> UNLOCK TABLES;

На хосте mysql2

Создаём базу replica и наполняем её из дампа с master-хоста:
$mysqladmin -uroot -p create replica
$mysql -uroot -p replica < replica.dump
В файле конфигурации MySQL (/var/lib/mysql/my.cnf):
  1. Отключаем параметр skip-networking
  2. Добавляем параметры:
server-id=2
master-host=mysql1
master-user=slave_user
master-password=slave
master-connect-retry=60
replicate-do-db=replica
relay-log=/log/slave-relay-bin
relay-log-index=/log/slave-relay-bin.index
Перезапускаем демона.
#service mysqld restart
Затем запускаем процесс репликации в консоли MySQL (используя параметры File и Position с master-хоста):
$mysql -uroot -p

mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
    -> MASTER_HOST='mysql1',
    -> MASTER_USER='slave_user',
    -> MASTER_PASSWORD='slave',
    -> MASTER_LOG_FILE='bin.000002',
    -> MASTER_LOG_POS=98;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
Убеждаемся в том, что параметры Slave_IO_Running и Slave_SQL_Running установлены в Yes.

Краткое резюме

В принципе репликация работает.
Потенциальные проблемы:
  1. Если что-либо меняется на slave-хосте, то, естественно, на master-хост изменения перенесены не будут. К сожалению параметр read-only в конфигурации slave-hosta не срабатывает.
  2. Если что-то меняется в реплицируемой базе на master-хосте без использования явного подключения к ней (например, запросами вида "DELETE FROM replica.test_table;" без предварительной директивы "USE replica;"), то такие изменения не реплицируются. (Теоретически возможно использование конфигурационного параметра вида replicate-wild-do-table=replica.%, однако так оно работать не захотело.)
Из несрабатывающего также стоит отметить директиву для начального переноса данных на slave-хост:
mysql> LOAD DATA FROM MASTER;
На данный момент, судя по всему, альтернативы переносу данных с помощью дампа не существует.

Дополнительные источники информации

Комментариев нет:

Отправить комментарий