Случилось так, что нужно было настроить синхронизацию одной базы данных на 2х серверах MySQL. Поискав инфу по теме в сети, выяснил, что лучше всего это сделать через репликацию. Вот что Wiki знает об этом:
Репликация (англ. replication) — механизм синхронизации содержимого нескольких копий объекта (например, содержимого базы данных). Репликация — это процесс, под которым понимается копирование данных из одного источника на множество других и наоборот.
При репликации изменения, сделанные в одной копии объекта, могут быть распространены в другие копии.
Теперь понятно что это, осталось понять как это сделать. Сразу оговорюсь, нагло передиру чужую статью, но то, о чем в ней говориться, реально работает в моем проекте!
Поехали…
Исходные данные
- Хост №1 (mysql1) – будущий master1 и slave2, ОС FreeBSD 7.3, СУБД MySQL 5.1, существующая база replica;
- Хост №2 (mysql2) – будущий slave1 и master2, ОС Debian, СУБД MySQL 5.1.
СУБД на обоих хостах запущены и работают.
Требуется
Настроить репликацию базы replica на хосте mysql1 на хост mysql2 в режиме master-master.
Порядок действий
На хосте mysql1
В файле конфигурации MySQL (/var/db/mysql/my.cnf):
- Отключаем параметр skip-networking;
- Добавляем параметры:
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):
- Отключаем параметр skip-networking;
- Добавляем параметры:
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.