Репликация типа Мастер-Мастер для баз данных увеличивает скорость доступа к данным и повышает избыточность для действующих сайтов. Использование репликации хотя бы двух серверов MySQL которые будут работать как кластер очень полезно для сайтов с требованиями high-availability.
Как настроить репликацию базы данных типа Master-Master
Для того чтобы настроить репликацию типа Master-Slave необходимо выполнить следующие шаги:
Конфигурация первого сервера Master
Отредактировать конфигурационный файл /etc/mysql/my.cnf внеся в него следующие изменения:
-
В строку bind-address указать адрес Master сервера;
-
Убедиться что раскомментирована строка server-id
можно использовать любое уникальное значение, но проще всего оставить 1 -
Раскомментировать строку log_bin указав файл из которого Slave будет копировать все изменения репликации
-
Наконец, раскомментировать строку binlog_do_db и указать имя БД что будет реплицироваться, в случае если будет производиться репликация нескольких БД то необходимо указать несколько соответствующих строк.
После чего можно сохранить изменения и закрыть конфигурационный файл.
При одновременном добавлении новых строк, содержащих автоинкрементные поля, на разные мастер-сервера может возникнуть конфликт. Чтобы такого не происходило, необходимо изменить шаг последовательности автоинкрементов на серверах БД:
auto_increment_increment - определяет шаг изменения AUTO_INCREMENT.
auto_increment_offset - определяет начальное значение инкремента
Далее проводится работа из командной строки MySQL
Выполняем вход в root нашего MySQL сервера:
mysql -u root -p
Создаём пользователя который будет использоваться для репликации БД:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
Далее назначаем привилегии Slave пользователю который будет использоваться для репликации БД:
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
После чего применяем изменения привилегий:
FLUSH PRIVILEGES;
Далее переключаемся на нужную БД:
USE DATABASE;
Проверяем:
SHOW MASTER STATUS;
Получаем примерно такой вывод:
Эти значения являются позицией где БД второго Master-сервера начнёт реплицироваться. Необходимо записать значения File и Position так как они нам понадобятся в дальнейшем.
На этом настройка первого Master-сервера завершена.
Конфигурация второго сервера Master
Для настройки второго Master-сервера необходимо провести те же самые действия что и на первом Master-сервере вплоть до команды use database; включительно, только лишь применив иное значение server-id в конфигурационном файле /etc/mysql/my.cnf
После выполненных действий необходимо ввести следующие команды:
CHANGE MASTER TO MASTER_HOST = 'address of master1', MASTER_USER = 'replication_user', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
SLAVE START;
Значения MASTER_LOG_FILE и MASTER_LOG_POS должны совпадать со значениями что были выписаны при настройке первого Master-сервера.
После этого также выполняем команду:
SHOW MASTER STATUS;
Получаем примерно такой вывод:
Эти значения являются позицией где БД первого Master-сервера начнёт реплицироваться. Необходимо записать значения File и Position так как они нам понадобятся в дальнейшем.
Окончательная настройка репликации типа Master-Master
Возвращаемся на первый сервер Master и выполняем там команды:
CHANGE MASTER TO MASTER_HOST = 'address of master1', MASTER_USER = 'replication_user', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
SLAVE START;
Значения MASTER_LOG_FILE и MASTER_LOG_POS должны совпадать со значениями что были выписаны при настройке второго Master-сервера.
Проверка репликации типа Master-Master
Для проверки репликации будет создана БД и таблица на первом Master-сервере, после успешной проверки и синхронизации эта таблица будет удалена на втором Master-сервере.
Вначале создаём соответствующие данные на первом Master-сервере:
Создаём тестовую БД:
CREATE DATABASE example;
Создаём таблицу в этой БД:
CREATE TABLE example.dummy (`id` varchar(10));
Далее переходим на второй Master-сервер и смотрим таблицы содержащиеся в БД:
SHOW TABLES IN example;
После чего должны увидеть примерно такой вывод:
Далее удаляем эту таблицу:
DROP TABLE dummy;
Далее переходим на первый Master-сервер и смотрим таблицы содержащиеся в БД:
SHOW TABLES IN example;
Если получаем в ответ:
Empty set (0.00 sec)
То это говорит о том, что таблица из соответствующей БД была удалена и репликация базы данных типа Master-Master настроена корректно.