Percona Mysql server master - slave репликация

В данной статье хочу затронуть актуальную тему эксплуатации популярного сервера баз данных. Я расскажу, как настроить репликацию master - slave на примере Mysql сервера Percona. Это не пример настройки отказоустойчивой системы. Создается именно актуальная копия базы данных для различных нужд (бэкап, тестирование, тяжелые выборки и т.д.).

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Введение

За основу я возьму 2 виртуальные машины на базе Centos 8. Если у вас их еще нет, можете воспользоваться моими статьями на тему установки и базовой настройки Centos 8. Ниже небольшая таблица, чтобы дальше было проще ориентироваться в статье.

Hostname IP адрес Версия OS Версия Mysql
mysql-master 10.20.1.23 Centos 8 Percona Server for MySQL 8.0
mysql-slave 10.20.1.29 Centos 8 Percona Server for MySQL 8.0

Начнем настройку репликации с установки Mysql сервера на обе виртуальные машины. Ниже приведу краткий список действий, чтобы сразу было понятно, что мы будем делать.

Краткий список действий

Необходимое время: 1 час

Настройка master-slave репликации mysql.

  1. Установка percona mysql server.

    Подключаем репозиторий и устанавливаем необходимые пакеты.

  2. Создание или загрузка баз данных для репликации.

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

  3. Настройка непосредственно репликации.

    Подробно расскажу и покажу, как настроить репликацию загруженной базы.

  4. Проверка работы репликации.

    Приведу пример, как можно убедиться, что репликация работает.

Установка Percona Mysql Server

Установить percona mysql server не представляет никакой сложности, так как есть репозиторий с готовыми пакетами под все популярные системы, в том числе под centos. Подключаем этот репозиторий. Действия выполняем одновременно на обоих серверах.

# dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

Отключаем стандартный модуль mysql и активируем репозиторий перконы.

# dnf module disable mysql
# percona-release setup ps80
Установка percona mysql server

Устанавливаем Percona Mysql Server на Centos 8. Заодно поставим xstrabackup и другие утилиты, которые нам могут понадобиться в процессе эксплуатации.

# dnf install percona-server-server percona-toolkit percona-xtrabackup-80

После установки запускаем mysql сервер и добавляем в автозагрузку.

# systemctl enable --now mysqld

Во время установки был автоматически сгенерирован временный пароль root. Посмотреть его можно в логе /var/log/mysqld.log.

# grep "temporary password" /var/log/mysqld.log
2020-04-28T09:31:57.348581Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: NdqhLZkEr0_p

Используя этот пароль, выполним начальную настройку сервера, удалив все лишнее и указав свой пароль. Имейте ввиду, что по умолчанию установлен Password Validation Plugin, который не позволит вам создать простой пароль. Он должен удовлетворять следующим требованиям:

  • Длина от 8-ми символов;
  • Минимум 1 цифра;
  • Минимум 1 спецсимвол.
# mysql_secure_installation

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

# mysql -u root -p
> SHOW VARIABLES LIKE 'validate_password%';
Проверка подключения к mysql

Серверы Mysql установили на обоих виртуальных машинах. Двигаемся дальше.

Загрузка базы данных

Загрузим теперь на оба наших сервера дампы базы данных, которую он будет обслуживать. Если вы начинаете новую базу с нуля, то просто создайте ее на обоих серверах. Я же загружу из архива, сделанного с помощью mysqldump, базу своего сайта.

# mysql -u root -p
> create database serveradmin;
> use serveradmin;
> source ~/mysql_serveradmin.ru_2020-04-28_04-15.sql;
Загрузка базы данных mysql

Теперь создадим на мастере учетную запись, от имени которой будет работать репликация. Напоминаю, что 10.20.1.29 - ip адрес для slave сервера.

> CREATE USER 'repl'@'10.20.1.29' IDENTIFIED BY '1qaz@WSX';
> GRANT replication slave ON *.* TO 'repl'@'10.20.1.29';

Настройка master - slave репликации

У нас все готово для настройки непосредственно репликации. Но перед тем, как ее начать, убедитесь, что у вас настроен или отключен firewalld. В общем случае на мастере разрешите подключаться к серверу по tcp порту 3306, на котором работает mysql сервер.

# firewall-cmd --permanent --add-port=3306/tcp
# firewall-cmd --reload

Теперь запускаем репликацию. Для этого идем на мастер и смотрим master log position в консоли mysql.

> show master status;
Статус мастера

Переходим на slave и выполняем в консоли mysql.

> CHANGE MASTER TO MASTER_HOST = '10.20.1.23', MASTER_USER = 'repl', MASTER_PASSWORD = '1qaz@WSX', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 706;
> start slave;

Проверяем статус репликации.

> show slave status \G;

Скорее всего вы увидите ошибку:

error connecting to master 'repl@10.20.1.23:3306' - retry-time: 60 retries: 7 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

Суть ее в том, что в версии Mysql 8 поменялся плагин для аутентификации с mysql_native_password на caching_sha2_password. Теперь для корректной работы репликации необходимо настраивать подключение с использованием tls сертификатов. Если инфраструктура закрытая и данные передаются не через интернет, то этим можно пренебречь. К примеру, я всегда настраиваю vpn тоннель, если репликация работает через интернет.

Самый простой способ исправить ошибку, это зашифровать пароль пользователя предыдущим плагином. Делается это так.

> ALTER USER 'repl'@'10.20.1.29' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';

После этого вернитесь на slave, остановите репликацию, обновите информацию с мастера и запустите заново. Ошибки быть не должно.

> stop slave;
> CHANGE MASTER TO MASTER_HOST = '10.20.1.23', MASTER_USER = 'repl', MASTER_PASSWORD = '1qaz@WSX', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 1226;
> start slave;

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

Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
  • Slave_IO_State - состояние репликации, в норме ожидание событий с мастера.
  • Slave_IO_Running - индикатор работы демона по сбору бинарного лога с мастера и записи его в локальный relay лог.
  • Slave_SQL_Running - индикатор выполнения команд из локального relay лога.
  • Seconds_Behind_Master - то, насколько слейв сервер отстает от мастера в репликации. Идеально 0 секунд, но может и отставать немного.

Если репликация идет нормально, slave будет идти за master. Номер лога Master_Log_File и позиция Exec_Master_Log_Pos будут расти. Если значение Slave_IO_State пусто или Connecting to master, а Seconds_Behind_Master равно NULL, репликация не началась.

Проверка репликации

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

> CREATE DATABASE testdb;
> CREATE TABLE IF NOT EXISTS testdb.data1 (id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, string VARCHAR(100));
> INSERT INTO data1(string) VALUES ("Test For Replication");

Теперь идем на реплику и проверяем, получила ли она изменения.

> show databases;
> use testdb;
> select * from data1;
Проверка mysql репликации master - slave

Все в порядке, репликация работает. Можно настроить ее мониторинг. Для бэкапа данных с реплики рекомендую использовать percona xtrabackup.

Часто задаваемые вопросы по теме статьи (FAQ)

 

Есть ли отличия в настройке репликации master slave в других форках mysql, например mariadb?

Нет. Описанный мной способ подходит для настройки репликации во всех популярных версиях серверов mysql.

Как следует добавлять дополнительные slave серверы, если возникнет такая необходимость?

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

Что следует сделать, чтобы вернуть репликацию, если slave сервер потеряет связь с мастером?

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

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Вот так относительно просто настраивается обычная master - slave репликация mysql. Подобным же образом настраивается и master-master репликация, но на практике она очень нестабильно работает. Я пробовал в свое время, но в итоге отказался, так как надоело ее чинить и исправлять ошибки. Для полноценного кластера с мультизаписью лучше использовать какие-то специализированные решения типа Percona XtraDB Cluster.

Кстати, он же может заменить и текущую конфигурацию, если сделать его из двух нод и писать только в одну. Разрешив ему работать при выходе из строя реплики, получится примерно то же самое, что и в статье. Но смысла в этом особо нет, так как предложенная мной конфигурация настраивается проще и быстрее. Плюс, это типовое решение для любого mysql сервера.

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

23 комментария

  1. Добрый день!
    При вводе команды при проверки работы реплики
    INSERT INTO data1(string) VALUES ("Test For Replication"); поступит ошибка что не выбрана ДБ, необходимо INSERT INTO testdb.data1(string) VALUES ("Test For Replication").

  2. Евгений

    Приветствую!
    Возник вот такой уточняющий вопрос(из FAQ)
    Что следует сделать, чтобы вернуть репликацию, если slave сервер потеряет связь с мастером и сам стал мастером?

    • Не понял, как он сам стал мастером? Если пропадает связь, то slave просто начинает отставать. Когда связь вернется, он догонит мастер.

  3. И у меня
    show master status;
    Empty set (0.00 sec)

  4. У вас опечатка. вот так правильно:
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'ip;

    • Спасибо, поправил. Наверно редактор проглотил звездочки. Команды все брал с работающего сервера.

  5. Алексей

    GRANT replication slave ON . TO 'repl'@'10.20.1.29'; Поправьте на:
    GRANT replication slave ON *.* TO 'repl'@'10.20.1.29';

    https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html

  6. Дмитрий

    Zerox а maxscale настраивать не приходилось? Или другой балансер с контролем состояния binlog итд

  7. Александр

    Добрый день, а группы репликации не надежнее делать single primary или multi primary?

  8. Михаил С

    О.. собрался делать репликацию на нашем сайте и наткнулся на статью Владимира. Вова спасибо большое за статью!!

  9. Аноним

    А не делали мультимастер на мускуле с мускуль роутером?

    • Делал просто мастер - мастер без роутера, но мне не понравилось. Не помню уже подробностей, но постоянно лазил руками чинить репликацию, которая периодически переставала работать. Решение показалось ненадежным.

      • Дмитрий

        Если просто мультимастер, то с огромным количеством проблем столкнетесь.
        Посмотрите в сторону Percona, только рассматривайте все, а не 2 базы, полнофункциональный мультимастер кластер с арбитратором и балансером, в случае с Percona я бы рекомендовал MySQL Proxy, только с полнофункциональной настройкой, с контролем консистентности, в этом случае запись будет идти на арбитратор и им же раскидываться на мастера, которые будут писать на слейвы, 8-я версия мускуля искоропки пишет в 60 потоков бинлог у меня(сеть между нодами 20 Гб/с), чтение со слейвов.
        За счет многопоточности отставание составляет не более 0.03 мс. Это при удалении или добавлении до млн записей.

  10. Андрей

    И ещё сразу вопрос, что будет если я на одном из слэйве удалю какую нибудь строку, добавлю новую, либо изменю какую нибудь. Другими словами что будет когда с моей стороны будут производиться какие то изменения которых нет на мастере. База проигнорирует это, или спустя какое то время вернёт обратно исходное состояние, тем самым как бы удалив мои изменения

    • Это не знаю, не проверял. Никогда не было идей так делать :)

    • Дмитрий

      Андрей Запись должна идти на мастер, у мускуля, машки - асинхронная репликация, слейвы только для чтения.
      У меня кластер мастер + 2 слейва (чтение) + слейв (финансовые отчеты) + слеййв для бэкапов

    • Если я правильно понимаю работу слейва, который следует за мастером по бинлогу, изменения на слейве так и останутся. Никаких проверок целостности при такой работе не происходит. Слейв просто повторяет все операции за мастером. Если задним числом что-то поменяь на слейве, то там так и останутся измененные данные.

  11. Андрей

    Добрый день, очень интересная статья, подскажите пожалуйста, каково основное назначение master-slave, создано ли это понятие для горизонтального масштабирования база данных? Например у меня настроено, один мастер и 5 слэйвов. На мастере создал таблицу и вставил туда 100 000 000 строк. Все они продублировались спустя какое-то то время на всех слэйвах. Дальше я начинаю делать селект по таблице с каким то сложным фильтром, как будет базе данных делать, будет ли она как то распределять нагрузку на слэйвы, будет ли так сказать волшебство из коробки? :)

    • Никакой магии и распределения нагрузки в описанной настройке нет. Это просто актуальная копия базы для чтения.

      Для магии нужен кластер с соответствующим функционалом.

    • Дмитрий

      Для такого Вам нужен шардинг, я бы посмотрел в сторону Тарантула, для создания кэша и синхронизации

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar