Репликация MySQL в виде Master/Slave

Репликация 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 в Unix/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 репликации

А на этом, у меня все и тема «Репликация MySQL в виде Master/Slave» завершена.

3 thoughts on “Репликация MySQL в виде Master/Slave

  1. Ну а как идёт смена мастера и слейва в случае сбоя мастера?
    Какие действия при аварии?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.