Как настроить MySQL репликацию Master-Slave

Источник: «How to Set Up MySQL Master-Slave Replication»
Рассмотрим как настроить MySQL репликацию master-slave, а также каковы плюсы и минусы репликации master-slave.

Введение

В облачных вычислениях репликация данных "master-slave" означает хранение одной и той же информации на нескольких серверах. Один сервер управляет группой, а другие устройства выполняют работу в пределах одного узла.

Репликация позволяет создавать регулярные ежедневные резервные копии, которые могут восстановить главную базу данных MySQL в случае сбоя в работе хранилища. Это также позволяет одновременно обрабатывать данные, не перегружая master сервер.

Необходимые условия

Что такое репликация Master-Slave в MySQL

Репликация Master-Slave в MySQL — процесс, позволяющий реплицировать или копировать данные с одного сервера базы данных MySQL (master) на один или несколько серверов базы данных MySQL (slaves). Логика, лежащая в основе репликации, заключается в повышении масштабируемости, обеспечении доступности данных и предоставлении надёжного решения для резервного копирования в случае аварии или аппаратного сбоя.

Основными преимуществами репликации 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/. Выполните следующие шаги:

  1. Откройте в текстовом редактора, например, nano, файл конфигурации базы данных:

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  2. Найдите в файле следующую строку:

    bind-address            = 127.0.0.1

    Замените 127.0.0.1 на публичный IP-адрес master сервера. Поскольку 127.0.0.1 — это localhost, если оставить этот параметр без изменения, соединение не установится.

    Используйте IP-адрес master сервера, чтобы настроить исходный экземпляр MySQL на прослушивание соединений по IP-адресу, который может быть доступен slave серверу.

  3. Найдите строку server-id:

    # server-id             = 1

    Параметр server-id позволяет MySQL различать несколько серверов при репликации, поскольку каждый сервер имеет своё собственное значение server-id. Раскомментируйте эту строку (удалите символ # в начале строки) и, поскольку это master сервер, оставьте значение 1.

  4. Прокрутите вниз, пока не найдёте строк с log_bin:

    # log_bin                       = /var/log/mysql/mysql-bin.log

    Раскомментируйте строку, чтобы разрешить программе читать двоичный лог файл. По умолчанию двоичный лог отключён. Slave сервер должен иметь возможность читать файл двоичного лога master сервера, чтобы знать, когда и как реплицировать данные.

  5. Прокрутите файл вниз до конца и найдите строку binlog_do_db:

    # binlog_do_db          = include_database_name

    Раскомментируйте строку и замените include_database_name на имя базы данных, которую необходимо реплицировать. Чтобы реплицировать несколько баз данных, добавьте несколько экземпляров этой строки друг за другом, указывая в каждом из них имя базы данных.

  6. После завершения редактирования файла нажмите Ctrl+O, чтобы сохранить файл и выйти из редактора nano.

  7. Перезапустите MySQL сервер, чтобы применить изменения:

    sudo systemctl restart mysql

Шаг 3: Создание пользователя для репликации

На этом шаге необходимо создать пользователя MySQL, которого slave сервер будет использовать для подключения к базе данных master. Этот выделенный пользователь будет выполнять все действия, связанные с процессом репликации.

Если хотите использовать существующего пользователя с соответствующими привилегиями для подключения к серверу MySQL, пропустите процедуру создания и только предоставьте привилегии.

Чтобы создать специального пользователя, выполните следующие действия:

  1. Откройте командную строку/оболочку MySQL:

    sudo mysql
  2. Создайте нового пользователя 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. Хотя можно использовать стандартный механизм аутентификации MySQL caching_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.

  3. Предоставьте новому пользователю соответствующие привилегии. Используйте следующий синтаксис, чтобы предоставить пользователю разрешение REPLICATION SLAVE:

    GRANT REPLICATION SLAVE ON *.* TO '[user_name]'@'[ip_address]';

    Замените все заполнители на свою информацию, как и в предыдущем шаге.

    Например:

    GRANT REPLICATION SLAVE ON *.* TO 'slave_copy'@'192.168.1.67';
  4. Выполните команду FLUSH PRIVILEGES, для освобождения кэшированной памяти, образовавшейся в результате выполнения предыдущих команд:

    FLUSH PRIVILEGES;

Шаг 4: Получение позиции лог файла

Для правильной работы slave серверу необходимы координаты двоичного файла лога master сервера и позиция файла. Координаты позволяют серверу определить, с какой точки следует начать копирование событий базы данных, и помогают отслеживать уже обработанные события.

Чтобы узнать позицию лог файла, выполните следующие действия:

  1. Заблокируйте базу данных, чтобы пользователи не могли вносить изменения в данные, пока происходит извлечение позиции файла. Обратите внимание, что блокировка базы данных приводит к некоторому времени простоя, поэтому планируйте это соответствующим образом.

    Откройте командную строку MySQL и выполните следующую команду, блокирующую базу данных:

    FLUSH TABLES WITH READ LOCK;
  2. Выполните приведённое ниже выражение, чтобы получить информацию о текущем состоянии двоичного файла журнала:

    SHOW MASTER STATUS;
    Получение позиции и имени файла двоичного лога.
    Получение позиции и имени файла двоичного лога.

    Запишите имя файла и значение позиции, так как они понадобятся на следующем этапе.

Шаг 5: Копирование данных или создание новой базы данных

В зависимости от того, есть ли существующие данные, которые необходимо перенести на slave сервер, можно выбрать один из двух вариантов:

Если нет существующих данных для репликации

Если экземпляр master сервера MySQL установлен недавно и не содержит существующих данных, можно разблокировать базу данных. Откройте командную строку MySQL и выполните следующую команду:

UNLOCK TABLES;

Затем закройте командную строку/оболочку MySQL и перейдите к шагу 6.

Если необходимо реплицировать существующие данные

Если на master сервере MySQL есть данные, которые необходимо перенести на slave сервер, можно создать снапшот базы данных с помощью утилиты mysqldump. Выполните следующие действия:

  1. Поскольку база данных всё ещё заблокирована, откройте новое окно терминала и используйте приведённый ниже синтаксис для экспорта базы данных с помощью mysqldump:

    sudo mysqldump -u root [database_name] > [database_name.sql]

    Например, чтобы создать снапшот базы данных mysql, выполните следующую команду:

    sudo mysqldump -u root mysql > mysql.sql

    Команда создаёт снапшот базы данных и записывает его в файл mysql.sql.

  2. Разблокируйте базы данных, чтобы сделать их снова доступными для записи, выполнив следующие действия в командной строке MySQL:

    UNLOCK TABLES;
  3. Отправьте снимок на 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/ сервера.

  4. Подключитесь по SSH к slave серверу.

  5. После подключения откройте командную строку MySQL и создайте базу данных, которую необходимо реплицировать с master сервера:

    CREATE DATABASE [database_name];

    Замените [database_name] на имя базы данных, например mysql.

  6. Выйдите из командной строки MySQL и используйте приведённый ниже синтаксис для импорта снапшота базы данных:

    sudo mysql [database_name] < [snapshot_file_path]

    Например:

    sudo mysql mysql < /tmp/mysql.sql

    Эта команда импортирует данные из снапшота mysql.sql в созданную базу данных mysql.

Шаг 6: Настройка Slave сервера

Последним шагом в настройке репликации является настройка параметров на slave сервере. Выполните следующие шаги:

  1. Откройте файл конфигурации MySQL на slave сервере с помощью текстового редактора, например nano:

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  2. Найдите строку server-id и раскомментируйте её. Измените значение на число, отличное от того, которое установлено на master сервере (например, 2):

    server-id               = 2
  3. Найдите строки ниже и установите те же значения, что и в файле конфигурации master сервера:

    log_bin                 = /var/log/mysql/mysql-bin.log
    binlog_do_db            = mysql
  4. Последний шаг — добавление в конец файла следующую строку, определяющую местоположение файла лога slave сервера:

    relay-log               = /var/log/mysql/mysql-relay-bin.log
  5. Сохраните изменения и выйдите из редактора.

  6. Перезапустите 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;

Запустите репликацию, выполнив команду:

START REPLICA;

Команда предписывает серверу начать репликацию всех изменений, внесённых в указанную базу данных на master сервере.

Чтобы узнать подробности о текущем состоянии сервера, выполните следующую команду:

SHOW REPLICA STATUS\G;
Получение статуса slave сервера в MySQL.
Получение статуса slave сервера в MySQL.

Вывод показывает текущее состояние сервера.

Заключение

После прочтения этой статьи вы должны научиться настраивать репликацию master-slave в MySQL и запускать slave потоки. Теперь вы сможете легко выполнять регулярное резервное копирование, а также хранить и изменять данные на нескольких компьютерах.

Дополнительные материалы

Предыдущая Статья

Разделение хостов баз данных для оптимизации в Laravel

Следующая Статья

Типы репликации баз данных