Как настроить MySQL репликацию Master-Slave
Введение
В облачных вычислениях репликация данных "master-slave" означает хранение одной и той же информации на нескольких серверах. Один сервер управляет группой, а другие устройства выполняют работу в пределах одного узла.
Репликация позволяет создавать регулярные ежедневные резервные копии, которые могут восстановить главную базу данных MySQL в случае сбоя в работе хранилища. Это также позволяет одновременно обрабатывать данные, не перегружая master сервер.
Необходимые условия
- Операционная система Linux.
- Учётная запись пользователя с привилегиями root.
- MySQL, установленный на master и slave серверах.
- Приватный IP-адрес облачного сервера (во избежание платы за пользование внешнего трафика во время настройки).
Что такое репликация Master-Slave в MySQL
Репликация Master-Slave в MySQL — процесс, позволяющий реплицировать или копировать данные с одного сервера базы данных MySQL (master) на один или несколько серверов базы данных MySQL (slaves). Логика, лежащая в основе репликации, заключается в повышении масштабируемости, обеспечении доступности данных и предоставлении надёжного решения для резервного копирования в случае аварии или аппаратного сбоя.
Основными преимуществами репликации master-slave являются:
- Отказоустойчивость. Slave-системы действуют как горячие резервные копии, готовые стать новым Master в случае отказа основного сервера. Такая установка сводит к минимуму время простоя и потерю данных.
- Масштабируемость. Запросы на чтение могут быть распределены между slave серверами, что разгружает master сервер и облегчает работу с повышенной нагрузкой.
- Аварийное восстановление. Slave серверы защищают данные от аппаратных сбоев или катастрофических событий, обеспечивая быстрое восстановление.
Шаги по настройке Master-Slave репликации баз данных в MySQL
В этом разделе рассматривается настройка master-slave репликации базы данных в Ubuntu. Менеджером пакетов по умолчанию для Ubuntu является apt
, поэтому если вы используете другой дистрибутив Linux, проверьте синтаксис для этой системы.
Шаг 1: Настройка параметров файрвола
Первым шагом будет настройка параметров файрволл на машине, на которой размещена главная база данных. По умолчанию в Ubuntu используется файрвол UFW, который необходимо настроить так, чтобы он разрешал соединения с сервера, на котором размещена база данных slave.
На master сервере используйте следующий синтаксис, чтобы разрешить соединения через файрвол:
sudo ufw allow from [slave_server_ip] to any port 3306
Замените [slave_server_ip]
на IP-адрес slave сервера.
Шаг 2: Настройка базы данных master (источник)
Для настройки репликации необходимо изменить некоторые параметры в конфигурационном файле базы данных master (источник). В Ubuntu конфигурационный файл MySQL по умолчанию расположен в /etc/mysql/mysql.conf.d/
. Выполните следующие шаги:
Откройте в текстовом редактора, например, nano, файл конфигурации базы данных:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите в файле следующую строку:
bind-address = 127.0.0.1
Замените
127.0.0.1
на публичный IP-адрес master сервера. Поскольку127.0.0.1
— этоlocalhost
, если оставить этот параметр без изменения, соединение не установится.Используйте IP-адрес master сервера, чтобы настроить исходный экземпляр MySQL на прослушивание соединений по IP-адресу, который может быть доступен slave серверу.
Найдите строку
server-id
:# server-id = 1
Параметр
server-id
позволяет MySQL различать несколько серверов при репликации, поскольку каждый сервер имеет своё собственное значениеserver-id
. Раскомментируйте эту строку (удалите символ#
в начале строки) и, поскольку это master сервер, оставьте значение1
.Прокрутите вниз, пока не найдёте строк с
log_bin
:# log_bin = /var/log/mysql/mysql-bin.log
Раскомментируйте строку, чтобы разрешить программе читать двоичный лог файл. По умолчанию двоичный лог отключён. Slave сервер должен иметь возможность читать файл двоичного лога master сервера, чтобы знать, когда и как реплицировать данные.
Прокрутите файл вниз до конца и найдите строку
binlog_do_db
:# binlog_do_db = include_database_name
Раскомментируйте строку и замените
include_database_name
на имя базы данных, которую необходимо реплицировать. Чтобы реплицировать несколько баз данных, добавьте несколько экземпляров этой строки друг за другом, указывая в каждом из них имя базы данных.После завершения редактирования файла нажмите Ctrl+O, чтобы сохранить файл и выйти из редактора nano.
Перезапустите MySQL сервер, чтобы применить изменения:
sudo systemctl restart mysql
Шаг 3: Создание пользователя для репликации
На этом шаге необходимо создать пользователя MySQL, которого slave сервер будет использовать для подключения к базе данных master. Этот выделенный пользователь будет выполнять все действия, связанные с процессом репликации.
Если хотите использовать существующего пользователя с соответствующими привилегиями для подключения к серверу MySQL, пропустите процедуру создания и только предоставьте привилегии.
Чтобы создать специального пользователя, выполните следующие действия:
Откройте командную строку/оболочку MySQL:
sudo mysql
Создайте нового пользователя MySQL, используя следующий синтаксис:
CREATE USER '[user_name]'@'[ip_address]' IDENTIFIED WITH mysql_native_password BY '[password]';
- Замените
[user_name]
на имя пользователя, которое будет использоваться для учётной записи. - Замените
[ip_address]
на IP-адрес slave сервера. - Замените
[password]
на надёжный пароль.
Например:
CREATE USER 'slave_copy'@'192.168.1.67' IDENTIFIED WITH mysql_native_password BY 'veryStrongPassword;)';
В приведённом примере создаётся пользователь
slave_copy
с публичным IP-адресом slave сервера и надёжным паролем. Аутентификация осуществляется с помощью плагина аутентификацииmysql_native_password
, если установлен MySQL версии младше 8.4. Хотя можно использовать стандартный механизм аутентификации MySQLcaching_sha2_password
, он требует зашифрованного соединения между двумя серверами.В MySQL 8.4 и старше, при обращении к
mysql_native_password
возникает ошибкаSQLSTATE[HY000] [1524] Plugin 'mysql_native_password' is not loaded
. О решении этой проблемы можно узнать в статье Как исправить ошибкуmysql_native_password is not loaded
в MySQL 8.4.- Замените
Предоставьте новому пользователю соответствующие привилегии. Используйте следующий синтаксис, чтобы предоставить пользователю разрешение
REPLICATION SLAVE
:GRANT REPLICATION SLAVE ON *.* TO '[user_name]'@'[ip_address]';
Замените все заполнители на свою информацию, как и в предыдущем шаге.
Например:
GRANT REPLICATION SLAVE ON *.* TO 'slave_copy'@'192.168.1.67';
Выполните команду
FLUSH PRIVILEGES
, для освобождения кэшированной памяти, образовавшейся в результате выполнения предыдущих команд:FLUSH PRIVILEGES;
Шаг 4: Получение позиции лог файла
Для правильной работы slave серверу необходимы координаты двоичного файла лога master сервера и позиция файла. Координаты позволяют серверу определить, с какой точки следует начать копирование событий базы данных, и помогают отслеживать уже обработанные события.
Чтобы узнать позицию лог файла, выполните следующие действия:
Заблокируйте базу данных, чтобы пользователи не могли вносить изменения в данные, пока происходит извлечение позиции файла. Обратите внимание, что блокировка базы данных приводит к некоторому времени простоя, поэтому планируйте это соответствующим образом.
Откройте командную строку MySQL и выполните следующую команду, блокирующую базу данных:
FLUSH TABLES WITH READ LOCK;
Выполните приведённое ниже выражение, чтобы получить информацию о текущем состоянии двоичного файла журнала:
SHOW MASTER STATUS;
Запишите имя файла и значение позиции, так как они понадобятся на следующем этапе.
Шаг 5: Копирование данных или создание новой базы данных
В зависимости от того, есть ли существующие данные, которые необходимо перенести на slave сервер, можно выбрать один из двух вариантов:
Если нет существующих данных для репликации
Если экземпляр master сервера MySQL установлен недавно и не содержит существующих данных, можно разблокировать базу данных. Откройте командную строку MySQL и выполните следующую команду:
UNLOCK TABLES;
Затем закройте командную строку/оболочку MySQL и перейдите к шагу 6.
Если необходимо реплицировать существующие данные
Если на master сервере MySQL есть данные, которые необходимо перенести на slave сервер, можно создать снапшот базы данных с помощью утилиты mysqldump
. Выполните следующие действия:
Поскольку база данных всё ещё заблокирована, откройте новое окно терминала и используйте приведённый ниже синтаксис для экспорта базы данных с помощью
mysqldump
:sudo mysqldump -u root [database_name] > [database_name.sql]
Например, чтобы создать снапшот базы данных
mysql
, выполните следующую команду:sudo mysqldump -u root mysql > mysql.sql
Команда создаёт снапшот базы данных и записывает его в файл
mysql.sql
.Разблокируйте базы данных, чтобы сделать их снова доступными для записи, выполнив следующие действия в командной строке MySQL:
UNLOCK TABLES;
Отправьте снимок на slave сервер. Самый безопасный способ сделать это — использовать SSH-соединение и команду
scp
:scp [file_path] [username]@[ip_address]:/tmp/
- Замените
[file_path]
на путь к файлу снапшота. - Имя пользователя
[username]
— это административный профиль пользователя Ubuntu на slave сервере. [ip_address]
— это публичный IP-адрес slave сервера.
Например:
scp mysql.sql pnap@192.168.1.67:/tmp/
Команда отправляет снапшот на указанный сервер, поместив его в каталог
/tmp/
сервера.- Замените
Подключитесь по SSH к slave серверу.
После подключения откройте командную строку MySQL и создайте базу данных, которую необходимо реплицировать с master сервера:
CREATE DATABASE [database_name];
Замените
[database_name]
на имя базы данных, напримерmysql
.Выйдите из командной строки MySQL и используйте приведённый ниже синтаксис для импорта снапшота базы данных:
sudo mysql [database_name] < [snapshot_file_path]
Например:
sudo mysql mysql < /tmp/mysql.sql
Эта команда импортирует данные из снапшота
mysql.sql
в созданную базу данныхmysql
.
Шаг 6: Настройка Slave сервера
Последним шагом в настройке репликации является настройка параметров на slave сервере. Выполните следующие шаги:
Откройте файл конфигурации MySQL на slave сервере с помощью текстового редактора, например
nano
:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите строку
server-id
и раскомментируйте её. Измените значение на число, отличное от того, которое установлено на master сервере (например,2
):server-id = 2
Найдите строки ниже и установите те же значения, что и в файле конфигурации master сервера:
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mysql
Последний шаг — добавление в конец файла следующую строку, определяющую местоположение файла лога slave сервера:
relay-log = /var/log/mysql/mysql-relay-bin.log
Сохраните изменения и выйдите из редактора.
Перезапустите MySQL сервер, чтобы изменения вступили в силу:
sudo systemctl restart mysql
Шаг 7: Начало репликации
После настройки обоих экземпляров MySQL можно приступать к процессу репликации. Откройте командную строку MySQL на slave сервере и используйте приведённый ниже синтаксис, чтобы указать серверу, где найти двоичный файл лога и с какой позиции начать его чтение:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_server_ip',
SOURCE_USER='replica_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='mysql-bin.000002',
SOURCE_LOG_POS=861;
- Замените
master_server_ip
на публичный IP-адрес master сервера. replica_user
— это учётная запись пользователя, которую создали для репликации.password
— это пароль, который был задан для пользователя.- Для
SOURCE_LOG_FILE
иSOURCE_LOG_POS
укажите имя файла и позицию, которые получили на шаге 4.
Запустите репликацию, выполнив команду:
START REPLICA;
Команда предписывает серверу начать репликацию всех изменений, внесённых в указанную базу данных на master сервере.
Чтобы узнать подробности о текущем состоянии сервера, выполните следующую команду:
SHOW REPLICA STATUS\G;
Вывод показывает текущее состояние сервера.
Заключение
После прочтения этой статьи вы должны научиться настраивать репликацию master-slave в MySQL и запускать slave потоки. Теперь вы сможете легко выполнять регулярное резервное копирование, а также хранить и изменять данные на нескольких компьютерах.