Репликация MySQL в виде Master/Slave
Что такое репликация MySQL?
Репликация MySQL — это процесс, который позволяет копировать данные с одного сервера на другой (поддерживать несколько копий данных MySQL) путем их автоматического копирования из базы данных master (ведущей) в slave (ведомую).
Я в своей статье «Репликация MySQL в виде Master/Slave» расскажу как можно установить данную репликацию mysql в виде master/slave, в котором БД master передает информацию на сервер с БД slave.
Имеется:
192.168.13.128- Master 192.168.13.130- Slave
Репликация MySQL в виде Master/Slave
В данной статье предполагается наличие пользователя с привилегиями sudo, а также уже установленной системы MySQL. Чтобы установить MySQL, наберите:
Если используете deb’s ОС (Debian/Ubuntu):
# apt-get install mysql-server mysql-client
Если используете rpm ОС (CentOS/Fedora/RedHat):
# yum install mysql-server mysql-client
Вот некоторые полезные статьи:
Настройка безопасности MYSQL в Unix/Linux
Сменить кодировку в Mysql/MariaDB в Unix/Linux
Сколько MySQL соединений в Unix/Linux
Проверить тип баз данных MySQL для хранения данных в Linux
Просмотр привилегий пользователя MySQL
Настройка Master
Открываем конфигурационный файл на master-сервере:
# vim /etc/mysql/my.cnf
Сейчас я его немного видоизменю и для самого начала заменим ИП адрес который слушает mysql (он связывает сервер с локальным хостом):
[...] bind-address = 127.0.0.1 [...]
Замените стандартный IP-адрес IP-адресом сервера.
[...] bind-address = 192.168.13.128 [...]
PS: если он не прописан, то добавьте строку что выше себе в конфигурационный файл.
Идем далее, нужно прописать директиву «server-id»:
[...] server-id = 1 [...]
Она может принимать любое значение, но как по мне — проще начинать с 1. Данная величина должна быть уникальной и не совпадать ни с одним из другим «server-id» в этой группе репликации.
Находим» log_bin» — эта переменная будет нести в себе некоторые детали о самой репликации ( сервер slave будет копировать все изменения, зарегистрированные в указанном лог файле):
[...] log_bin = /var/log/mysql/mysql-bin.log [...]
PS: Возможно, у вас не хватит прав на запись этого файла в указанной директории, по этому, измените путь или добавьте запись на папку.
И напоследок, стоит задать БД, которую необходимо будет копировать на slave-сервер( допускается добавлять более 1 БД, но для этого стоит прописывать данную строку, но с нужно базой), напимер:
[...] binlog_do_db = magento_db [...]
И так, все было сделано и мой конфиг выглядит следующим образом:
# cat /etc/my.cnf
Перезапускаем master с MySQL:
# service mysql restart
После перезапуска, нужно подключиться к самой оболочке MySQL:
# mysql -u root -p
Создаем пользователя, который будет передавать данные с мастера на слейв:
> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'Slave_password666';
Сбросим все привелегии (чтобы все заработало):
> FLUSH PRIVILEGES;
Дальнейшие действия немного сложнее. Для реализации поставленной задачи нужно открыть новое окно или вкладку в дополнение к уже используемой.
И так, у нас настроен сервер с мастером и уже работает некоторая БД (у меня это magento_db), выберем ее для использования:
> USE magento_db;
Поле чего, я заблокирую данную базу для того, чтобы не записывались никакие данные в нее:
> FLUSH TABLES WITH READ LOCK;
выполняем проверку :
> SHOW MASTER STATUS;
И видим, что мастер уже заработал:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 6702 | magento_db | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql>
Т.к я заблокировал все изменения, то не будет записываться ничего в эту БД и я могу создать дамп этой БД для переноса ее на слейв. Я выполню экспорт БД с помощью mysqldump:
# mysqldump -u root -p --opt magento_db > magento_db.sql
После того как создался дам, нужно вернуть все на свои места и разблокировать БД:
> USE magento_db; > UNLOCK TABLES; > QUIT;
Вуоля, master готов к использованию!
Настройка slave
Подключаемся на созданный slave сервер и создаем БД:
> CREATE DATABASE magento_db; > EXIT;
Выполняем импорт базы которую мы создали с мастера:
# mysql -u root -p magento_db < /path_to_DB/magento_db.sql
Открываем конфигурационный файл и внесем некоторые изменения:
# vim /etc/mysql/my.cnf
Тоже прописываем ID сервера (значение должно быть не такое как у мастера):
[...] server-id = 2 [...]
И прописываем следующие значения:
[...] relay-log = /var/log/mysql/mysql-relay-bin.log log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = magento_db [...]
Выполняем перезапуск MySQL со слейвом:
# service mysqld restart
Осталось активировать репликацию в MySQL. Открываем оболочку MySQL и вводим:
> CHANGE MASTER TO MASTER_HOST='192.168.13.128',MASTER_USER='slave_user', MASTER_PASSWORD='Slave_password666', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
Пояснения данной команды:
- Она определит текущий slave-сервер;
- Предоставит серверу нужные данные для входа;
- Назначит slave-серверу, выполнять репликацию;
- Задаст лог для master-сервера и позицию, с которой нужно начинать репликацию.
Запускаем slave-сервер следующей командой:
> START SLAVE;
Проверяем что слейв запустился и работает должным образом:
> SHOW SLAVE STATUS\G
Иногда возникают проблемы со связью и их можно решить:
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
Вот некоторые полезные статьи:
Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)
А на этом, у меня все и тема «Репликация MySQL в виде Master/Slave» завершена.
Отличная статья и все понятно!
Спасибо за статью!
Ну а как идёт смена мастера и слейва в случае сбоя мастера?
Какие действия при аварии?