Для чего нужна репликация Master-Slave
Репликация базы данных MySQL по типу Master-Slave используется для более упрощенного обслуживания множественных копий данных БД MySQL копируя данные автоматически из базы данных Master на базу данных Slave. Этот процесс может быть полезен по многим причинам, включая резервное копирование, способ анализа данных без использования Master БД, или как средство для масштабирования.
Как настроить репликацию Master-Slave
Для того чтобы настроить репликацию типа Master-Slave необходимо выполнить следующие шаги:
Конфигурация сервера Master
Отредактировать конфигурационный файл /etc/mysql/my.cnf внеся в него следующие изменения:
В строку bind-address указать адрес Master сервера
Убедиться что раскомментирована строка server-id
можно использовать любое уникальное значение, но проще всего оставить 1
Раскомментировать строку log_bin указав файл из которого Slave будет копировать все изменения репликации
Наконец, раскомментировать строку binlog_do_db и указать имя БД что будет реплицироваться, в случае если будет производиться репликация нескольких БД то необходимо указать несколько соответствующих строк.
После чего можно сохранить изменения и закрыть конфигурационный файл.
Далее проводится работа из командной строки MySQL
Выполняем вход в root нашего MySQL сервера:
mysql -u root -p
Создаём пользователя который будет использоваться для репликации БД, где “address” - ip-адрес сервера на который будет совершаться репликация, “password” - придуманный вами пароль:
create user 'slave_user'@'address' identified by 'password';
Далее назначаем привилегии Slave пользователю который будет использоваться для репликации БД:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'address' IDENTIFIED BY 'password';
После чего применяем изменения привилегий:
FLUSH PRIVILEGES;
Далее переключаемся на нужную БД:
use database;
Блокируем БД от нежелательных изменений
FLUSH TABLES WITH READ LOCK;
Далее вводим
SHOW MASTER STATUS;
Получаем примерно такой вывод:
Эти значения являются позицией где Slave БД начнёт реплицироваться. Необходимо записать значения File и Position так как они нам понадобятся в дальнейшем.
В новом окне терминала(для исключения разблокировки и внесения изменений в БД) вводим команду:
mysqldump -u root -p --opt database > database.sql
и сохраняем дамп нашей БД.
После чего разблокируем БД
UNLOCK TABLES;
И выходим
QUIT;
На этом настройка Master-сервера завершена.
Переходим к настройке Slave-сервера:
Входим в root MySQL
mysql -u root -p
После чего создаём БД с именем той, которую необходимо реплицировать.
CREATE DATABASE database;
И выходим
EXIT;
Далее необходимо восстановить предварительно переброшенный дамп нашей БД с Master-сервера:
mysql -u root -p database < /path/to/database.sql
Изменяем конфигурационный файл /etc/mysql/my.cnf на Slave сервере.
В строку bind-address указать адрес Slave сервера
Присваиваем уникальный идентификатор нашему Slave серверу, отличный от идентификатора на Master-сервере
server-id
Далее нужно убедиться что в конфигурационном файле присутствуют строки таких параметров:
Строку начинающуюся на relay-log необходимо добавить самостоятельно. В строке binlog_do_db указывается имя БД которая будет реплицироваться.
relay-log = /var/log/mysql/mysql-relay-bin.
log_bin
binlog_do_db = database
После проверки и внесения изменений в конфигурационный файл - перезагружаем службу MySQL.
sudo service mysql restart
После перезагрузки службы входим в командную строку MySQL и вводим такую команду:
CHANGE MASTER TO MASTER_HOST='address',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
Где: address - ip-адрес Master-сервера,
slave_user - пользователь на Master сервере который назначен для работы репликации
password - пароль к этому пользователю,
mysql-bin.000001 и 107 - значения которые записывались ранее при выводе SHOW MASTER STATUS на Master-сервере которые говорят Slave серверу о том с какого значения необходимо начинать репликацию, для корректной синхронизации БД, а также позицию в лог-файле.
После проведения всех манипуляций активируем Slave сервер.
START SLAVE;
После чего репликация будет запущена.
Для проверки статуса репликации
Вводим в командную строку MySQL следующую команду:
SHOW SLAVE STATUS\G;
После чего необходимо проконтролировать наличие ошибок в выводе и синхронизацию значений Master-сервера со Slave-сервером, где на Master-сервере вводится команда
SHOW MASTER STATUS;
Также, если значение Exec_Master_Log_pos продолжает изменяться со временем то репликация Master-Slave была настроена корректно.