В данной статье хочу затронуть актуальную тему эксплуатации популярного сервера баз данных. Я расскажу, как настроить репликацию 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.
- Установка percona mysql server.
Подключаем репозиторий и устанавливаем необходимые пакеты.
- Создание или загрузка баз данных для репликации.
Покажу на примере, как загрузить из дампа базу данных, для которой настроим репликацию.
- Настройка непосредственно репликации.
Подробно расскажу и покажу, как настроить репликацию загруженной базы.
- Проверка работы репликации.
Приведу пример, как можно убедиться, что репликация работает.
Установка 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 на 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 установили на обоих виртуальных машинах. Двигаемся дальше.
Загрузка базы данных
Загрузим теперь на оба наших сервера дампы базы данных, которую он будет обслуживать. Если вы начинаете новую базу с нуля, то просто создайте ее на обоих серверах. Я же загружу из архива, сделанного с помощью mysqldump, базу своего сайта.
# mysql -u root -p > create database serveradmin; > use serveradmin; > source ~/mysql_serveradmin.ru_2020-04-28_04-15.sql;
Теперь создадим на мастере учетную запись, от имени которой будет работать репликация. Напоминаю, что 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;
Все в порядке, репликация работает. Можно настроить ее мониторинг. Для бэкапа данных с реплики рекомендую использовать percona xtrabackup.
Часто задаваемые вопросы по теме статьи (FAQ)
Нет. Описанный мной способ подходит для настройки репликации во всех популярных версиях серверов mysql.
Никакой разницы нет, будет ли у вас один slave сервер или несколько. Добавление следующих серверов происходит точно так же, как и первого. Настраиваете slave сервер, заливаете дамп баз и запускаете репликацию.
Ничего особенного делать не надо. Если связь с мастером прервалась и репликация остановилась, достаточно восстановить связь и запустить заново репликацию. Slave сервер подтянет все изменения с мастера.
Заключение
Вот так относительно просто настраивается обычная master - slave репликация mysql. Подобным же образом настраивается и master-master репликация, но на практике она очень нестабильно работает. Я пробовал в свое время, но в итоге отказался, так как надоело ее чинить и исправлять ошибки. Для полноценного кластера с мультизаписью лучше использовать какие-то специализированные решения типа Percona XtraDB Cluster.
Кстати, он же может заменить и текущую конфигурацию, если сделать его из двух нод и писать только в одну. Разрешив ему работать при выходе из строя реплики, получится примерно то же самое, что и в статье. Но смысла в этом особо нет, так как предложенная мной конфигурация настраивается проще и быстрее. Плюс, это типовое решение для любого mysql сервера.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Добрый день!
При вводе команды при проверки работы реплики
INSERT INTO data1(string) VALUES ("Test For Replication"); поступит ошибка что не выбрана ДБ, необходимо INSERT INTO testdb.data1(string) VALUES ("Test For Replication").
Приветствую!
Возник вот такой уточняющий вопрос(из FAQ)
Что следует сделать, чтобы вернуть репликацию, если slave сервер потеряет связь с мастером и сам стал мастером?
Не понял, как он сам стал мастером? Если пропадает связь, то slave просто начинает отставать. Когда связь вернется, он догонит мастер.
И у меня
show master status;
Empty set (0.00 sec)
У вас опечатка. вот так правильно:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'ip;
Спасибо, поправил. Наверно редактор проглотил звездочки. Команды все брал с работающего сервера.
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
Zerox а maxscale настраивать не приходилось? Или другой балансер с контролем состояния binlog итд
Нет, не настраивал.
Добрый день, а группы репликации не надежнее делать single primary или multi primary?
Поясните, о чем вы. Я не знаком с группами репликации.
О.. собрался делать репликацию на нашем сайте и наткнулся на статью Владимира. Вова спасибо большое за статью!!
А не делали мультимастер на мускуле с мускуль роутером?
Делал просто мастер - мастер без роутера, но мне не понравилось. Не помню уже подробностей, но постоянно лазил руками чинить репликацию, которая периодически переставала работать. Решение показалось ненадежным.
Если просто мультимастер, то с огромным количеством проблем столкнетесь.
Посмотрите в сторону Percona, только рассматривайте все, а не 2 базы, полнофункциональный мультимастер кластер с арбитратором и балансером, в случае с Percona я бы рекомендовал MySQL Proxy, только с полнофункциональной настройкой, с контролем консистентности, в этом случае запись будет идти на арбитратор и им же раскидываться на мастера, которые будут писать на слейвы, 8-я версия мускуля искоропки пишет в 60 потоков бинлог у меня(сеть между нодами 20 Гб/с), чтение со слейвов.
За счет многопоточности отставание составляет не более 0.03 мс. Это при удалении или добавлении до млн записей.
А что будет, если арбитратор упадет?
И ещё сразу вопрос, что будет если я на одном из слэйве удалю какую нибудь строку, добавлю новую, либо изменю какую нибудь. Другими словами что будет когда с моей стороны будут производиться какие то изменения которых нет на мастере. База проигнорирует это, или спустя какое то время вернёт обратно исходное состояние, тем самым как бы удалив мои изменения
Это не знаю, не проверял. Никогда не было идей так делать :)
Андрей Запись должна идти на мастер, у мускуля, машки - асинхронная репликация, слейвы только для чтения.
У меня кластер мастер + 2 слейва (чтение) + слейв (финансовые отчеты) + слеййв для бэкапов
Если я правильно понимаю работу слейва, который следует за мастером по бинлогу, изменения на слейве так и останутся. Никаких проверок целостности при такой работе не происходит. Слейв просто повторяет все операции за мастером. Если задним числом что-то поменяь на слейве, то там так и останутся измененные данные.
Добрый день, очень интересная статья, подскажите пожалуйста, каково основное назначение master-slave, создано ли это понятие для горизонтального масштабирования база данных? Например у меня настроено, один мастер и 5 слэйвов. На мастере создал таблицу и вставил туда 100 000 000 строк. Все они продублировались спустя какое-то то время на всех слэйвах. Дальше я начинаю делать селект по таблице с каким то сложным фильтром, как будет базе данных делать, будет ли она как то распределять нагрузку на слэйвы, будет ли так сказать волшебство из коробки? :)
Никакой магии и распределения нагрузки в описанной настройке нет. Это просто актуальная копия базы для чтения.
Для магии нужен кластер с соответствующим функционалом.
Для такого Вам нужен шардинг, я бы посмотрел в сторону Тарантула, для создания кэша и синхронизации