Репликация MySQL позволяет повысить уровень отказоустойчивости приложения, а так же позволяет распределить нагрузку между серверами баз данных MySQL или MariaDB.
Как работает репликация MySQL
Для создания репликации необходимо, как минимум, 2 сервера. Один из них будет являться master-сервером, а второй (и другие) — slave. При выполнении операций в базе данных на master сервере, она записывает всю информацию в специальный файл — binlog. А slave сервер, в свою очередь, подключается к master серверу, сравнивает значения и если появляется новая информация — выполняет ее у себя в базе данных.
Пример настройки репликации
Для примера, мы возьмем 2 сервера. Устанавливать будем на примере Debian GNU/Linux. Настройка везде примерно одинакова за исключением того, что файл my.cnf в Debian (Ubuntu) находится в директории /etc/mysql/, а в CentOS — просто в /etc/.
Адреса серверов:
- Master-сервер — 192.168.0.1
- Slave-сервер — 192.168.0.2
Настраиваем Master-сервер.
Для начала, нужно открыть файл my.cnf и указываем следующее:
# выбираем ID сервера, произвольное число, лучше начинать с 1
server-id = 1
# путь к бинарному логу
log_bin = /var/log/mysql/mysql-bin.log
# название базы данных, реплика которой необходима
binlog_do_db = websitedb
Затем, перезапускаем сервер MySQL командой
/etc/init.d/mysql restart
Затем, нам нужно выдать пользователю права на репликацию. Подключаемся к серверу под пользователем root:
mysql -u root -p
Добавляем необходимые права для пользователя slave_user (владельца нашей базы websitedb) и задаем ему пароль password:
GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@’%’ IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
Затем, нам нужно заблокировать все таблицы от всех изменений:
USE websitedb;
FLUSH TABLES WITH READ LOCK;
Затем, нам нужно проверить статус работы Master-сервера с помощью команды:
SHOW MASTER STATUS;
Если все сделано верно, Вы увидите сообщение с именем файла, с названием вида:
mysql-bin.000001
А так же запомните значение из столбца Position. В нашем случае, это 10.
Это имя нам потребуется при создании и запуска слейв-сервера.
Делаем свежий дамп базы данных:
mysqldump -u root -p websitedb > websitedb.sql
Копируем файл на слейв-сервер и на мастере подключаемся к MySQL еще раз под root’ом и выполняем команду, чтобы разблокировать таблицы:
UNLOCK TABLES;
Создаем базу на Slave-сервере
Для того, чтобы работало все корректно, на слейв сервере необходимо создать базу с таким же именем. Подключаемся к MySQL на слейв-сервере и создаем базу:
CREATE DATABASE websitedb;
И заливаем наш дамп, который мы уже скопировали командой:
mysql -u root -p websitedb < websitedb.sql
Настройка Slave-сервера
Открываем файл my.cnf и указываем следующие параметры:
# ID сервера, будет удобно выбирать следующим числом после Master
server-id = 2
# Путь к relay логу
relay-log = /var/log/mysql/mysql-relay-bin.log
# Путь к bin логу на Мастере
log_bin = /var/log/mysql/mysql-bin.log
# База данных для репликации
binlog_do_db = websitedb
И перезапускаем сервер MySQL командой
/etc/init.d/mysql restart
Запуск Slave сервера
Все сделано, осталось самое главное — подключить Slave сервер к мастеру. Подключаемся к MySQL под root’ом и выполняем следующую команду:
CHANGE MASTER TO MASTER_HOST=’192.168.0.1′, MASTER_USER=’slave_user’, MASTER_PASSWORD=’password’, MASTER_LOG_FILE = ‘mysql-bin.000001’, MASTER_LOG_POS = 10;
Здесь мы вставляем номер из столбца Position (в нашем случае, это было число 10) и название binlog файла — mysql-bin.000001
И теперь стартуем слейв сервер командой в консоли MySQL:
START SLAVE;
Проверить работу на мастер сервере можно командой в MySQL консоли:
SHOW MASTER STATUS\G;
А на слейв-сервере, соответственно:
SHOW SLAVE STATUS\G;
Под настройку репликации мы рекомендуем выделенные сервера купить в аренду у нашей компании. Мы поможем с настройкой и поддержкой Ваших баз данных MySQL и MariaDB.
Если у вас возникли вопросы или трудности в настройках — вы можете в любое время обратиться за помощью к специалистам хостинга RigWEB. Мы будем рады вам помочь!