Настройка репликации master-master на СУБД MySQL

Случилось так, что нужно было настроить синхронизацию одной базы данных на 2х серверах MySQL. Поискав инфу по теме в сети, выяснил, что лучше всего это сделать через репликацию. Вот что Wiki знает об этом:

Репликация (англ. replication) — механизм синхронизации содержимого нескольких копий объекта (например, содержимого базы данных). Репликация — это процесс, под которым понимается копирование данных из одного источника на множество других и наоборот.

При репликации изменения, сделанные в одной копии объекта, могут быть распространены в другие копии.

Теперь понятно что это, осталось понять как это сделать. Сразу оговорюсь, нагло передиру чужую статью, но то, о чем в ней говориться, реально работает в моем проекте!

Поехали…

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

  1. Хост №1 (mysql1) – будущий master1 и slave2, ОС FreeBSD 7.3, СУБД MySQL 5.1, существующая база replica;
  2. Хост №2 (mysql2) – будущий slave1 и master2, ОС Debian, СУБД MySQL 5.1.

СУБД на обоих хостах запущены и работают.

Требуется

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

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

На хосте mysql1

В файле конфигурации MySQL (/var/db/mysql/my.cnf):

  1. Отключаем параметр skip-networking;
  2. Добавляем параметры:
server-id=1
log-bin=/var/db/mysql/bin.log
binlog-do-db=replica
binlog-ignore-db=mysql
binlog-ignore-db=test

Перезапускаем MySQL:

# /usr/local/etc/rc.d/mysql-server restart

В консоли MySQL создаём на master-хосте №1 пользователя с полномочиями на репликацию:

$ 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

И переносим этот дамп на master-хост №2.

Внимание. Блокировка таблиц будет снята, если выйти из консоли MySQL. Для создания дампа базы и переноса его на master-хост №2 следует использовать другую пользовательскую сессию.

На хосте mysql2

Создаём базу replica и наполняем её из дампа с master-хоста №1:

$ mysqladmin -uroot -p create replica
$ mysql -uroot -p replica < replica.dump

В файле конфигурации MySQL (/etc/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=/var/lib/mysql/slave-relay-bin
relay-log-index=/var/lib/mysql/slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=2

Перезапускаем MySQL:

# /etc/init.d/mysql restart

Затем запускаем процесс репликации в консоли MySQL (используя параметры File и Position с master-хоста №1):

$ 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.

На данном этапе, фактически была настроена Master-Slave репликация базы replica с хоста mysql1 на хост mysql2.

Далее, в файл конфигурации MySQL (/etc/mysql/my.cnf) добавляем параметры:

log-bin=/log/bin.log
binlog-do-db=replica

Перезапускаем MySQL:

# /etc/init.d/mysql restart

В консоли MySQL создаём на master-хосте №2 пользователя с полномочиями на репликацию:

$ mysql -uroot -p replica

mysql> GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@’%’ IDENTIFIED BY ‘slave’;
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;

+------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000006 |       98 | replica      | mysql,test       |
+------------+----------+--------------+------------------+

Запоминаем параметры File и Position.

Возвращаемся к хосту mysql1

В консоли MySQL разблокируем ранее блокированные таблицы:

mysql> UNLOCK TABLES;

В файл конфигурации MySQL (/var/db/mysql/my.cnf) добавляем параметры:

master-host=mysql2
master-user=slave_user
master-password=slave
master-connect-retry=60
replicate-do-db=replica
relay-log=/var/db/mysql/slave-relay-bin
relay-log-index=/var/db/mysql/slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=1

Перезапускаем MySQL:

# /usr/local/etc/rc.d/mysql-server restart

Затем запускаем процесс репликации в консоли MySQL (используя параметры File и Position с master-хоста №2):

$ mysql -uroot -p
mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
-> MASTER_HOST='mysql2',
-> MASTER_USER='slave_user',
-> MASTER_PASSWORD='slave',
-> MASTER_LOG_FILE='bin.000006',
-> MASTER_LOG_POS=98;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G

Убеждаемся в том, что параметры Slave_IO_Running и Slave_SQL_Running установлены в Yes.

Резюме

Этот способ репликации работает. Сейчас как раз занимаюсь его тестированием. Пока все четко.

P.S.: Настройка по мотивам статьи Настройка Master-Master репликации в MySQL.

Add Comment

Required fields are marked *. Your email address will not be published.