MySQL and MariaDB replication with Zabbix monitoring
Last updated
Last updated
https://habr.com/ru/companies/first/articles/690318/
Когда к отказоустойчивости интернет-магазина или другого сервиса с базами данных предъявляются повышенные требования, не обойтись без репликации серверов СУБД и файлов. Репликация совместно с другими технологиями отказоустойчивости помогает полностью защититься от сбоя оборудования, например, от выхода из строя отдельных серверов.
Из этой статьи вы узнаете, как настроить и проверить репликацию Master-Slave для MySQL и MariaDB, а также как контролировать ее работу с помощью Zabbix.
Мы будем настраивать репликацию базы данных myshop_db по схеме Master-Slave. При этом в роли мастера будет выступать сервер r01master, а в роли реплики — сервер r01slave.
Отредактируйте файл конфигурации MariaDB /etc/mysql/mariadb.conf.d/50-server.cnf на мастер сервере, добавив в него следующие строки:
Прежде всего, закройте символом комментария параметр bind-address со значением 127.0.0.1. Если этого не сделать, сервер реплики не получит доступ к мастер-серверу MariaDB, так как сервис СУБД будет принимать соединения только на локальном интерфейсе 127.0.0.1.
Удалите следующую настройку, если она есть:
Если этого не сделать, к серверу MariaDB нельзя будет подключиться по сети.
Открыв доступ к MariaDB по сети, не забудьте ограничить его по адресу IP файерволом.
Далее задайте уникальный идентификатор server-id (в примере показано произвольное число, задайте здесь другое значение). На сервере реплики необходимо будет задать другой уникальный идентификатор.
Для работы репликации необходим бинарный журнал, путь к файлу которого задается в параметре log_bin. При этом в параметрах expire_logs_days и max_binlog_size нужно задать количество дней, в течение которых будет храниться журнал, и максимальный размер журнала, соответственно. Выберите эти параметры исходя из наличия свободного пространства на дисках сервера, а также интенсивности обращений к СУБД.
Параметр sync-binlog управляет синхронизацией бинарного лога на диск. По умолчанию значение этого параметра равно 0, в результате чего синхронизацией управляет операционная система. С точки зрения потери данных безопаснее задать для этого параметра значение 1. При этом данные будут записываться на диск после каждой операции записи в журнал. Однако это может снизить производительность сервера СУБД.
Что касается параметра binlog_format, то мы использовали наиболее безопасный смешанный формат двоичного журнала. Подробнее об этом можно прочитать здесь. Так же доступен перевод на русский язык.
Очень важно задать с помощью параметра binlog-do-db название реплицируемой базы данных. В нашем случае мы указали базу данных myshop_db.
Параметр innodb_flush_log_at_trx_commit управляет сбросом данных на диск. Значение этого параметра, равное 0, дает максимальную производительность, но журнал транзакций будет сбрасываться на диск через какое-то время после выполнения транзакции.
Безопаснее будет указать значение, равное 1 (используется по умолчанию). При этом запись журнала на диск выполняется сразу после каждой транзакции. Но такой вариант будет работать медленнее. И, наконец, задав значение этого параметра, равное 2, данные будут сбрасываться не на диск, а в кэш операционной системы.
Подробнее о параметре innodb_flush_log_at_trx_commit можно прочитать здесь.
Параметр innodb_flush_method влияет на кэширование. В нашем случае база данных находится на локальном диске сервера, при этом значение этого параметра, равное O_DIRECT, отключает кэширование на уровне ОС.
Подробнее о параметре innodb_flush_method можно прочитать здесь.
После внесения всех изменений в конфигурацию MariaDB перезапустите сервис и проверьте его состояние:
Если появились ошибки или предупреждения, внесите исправления в файл конфигурации и попробуйте запустить сервис еще раз.
После того как вы настроили MariaDB на мастер-сервере, отредактируйте конфигурацию MariaDB, расположенную в файле /etc/mysql/mariadb.conf.d/50-server.cnf на сервере реплики:
Здесь обратите внимание на параметры replicate-do-db, report-host, slave_sql_verify_checksum и skip_slave_start.
Параметр replicate-do-db задает базу, которая будет реплицироваться с мастер-сервера. Если ее не указать, будут реплицированы все базы.
При помощи параметра report-host можно задать имя хоста реплики, как оно будет отображаться при просмотре на мастер-хосте списка хостов реплик.
Параметр slave_sql_verify_checksum управляет вычислением контрольной суммы при работе с журналом репликации на сервере реплики (релея): https://mariadb.com/kb/en/relay-log/. Если задать нулевое значение, проверка контрольной суммы будет отключена.
Параметр skip_slave_start используется для отключения репликации при перезагрузке сервера реплики. Он нужен, если требуется отменить репликацию, поэтому в нормальном режиме он закрыт символом комментария.
Также не забудьте удалить следующую настройку, если она есть:
Вы можете почитать описания параметров, имеющих отношение к репликации, в документации MariaDB.
После редактирования файла конфигурации перезапустите сервис и убедитесь в отсутствии ошибок:
Теперь, когда вы подготовили мастер-сервер и сервер реплики, создайте на мастер-сервере и сервере реплики пользователя репликации, например, с именем repl_user:
Для переноса базы данных нужно открыть два консольных окна на мастер-сервере.
В первом консольном окне блокируем таблицы реплицируемой базы данных на запись:
В этом же окне проверяем статус мастера:
Значения mysql-bin.000007
и 342
будут нужны для запуска реплики.
Внимание! Если выйти из окна консоли, где вы ввели команду FLUSH TABLES
, то сервер разблокирует таблицы и они снова будут доступны на запись. Дамп базы нужно делать во втором, отдельном окне, не закрывая окно консоли, в котором была выдана команда FLUSH TABLES WITH READ LOCK
.
Во втором консольном окне делаем дамп базы данных от имени пользователя myshop_db:
Разблокируем таблицы на мастере в первом консольном окне, чтобы пользователи могли работать дальше:
На сервере реплики обычным пользователем, например, admdb создаем каталог /home/admdb/repl
:
Копируем файл дампа базы с мастера на сервер реплики:
Здесь xxx.xxx.xxx.xxx
— адрес IP сервера реплики.
Загружаем на сервере реплики дамп базы данных, скопированный с узла мастера:
После загрузки базы на сервере реплики надо почистить журналы в /var/log/mysql
:
Перед подключением убедитесь, что сервер реплики SLAVE остановлен, а список SLAVE пуст:
Если это не так, удалите данные репликации:
Укажите на сервере реплики параметры подключения к мастеру:
Здесь xxx.xxx.xxx.xxx
— адрес IP сервера мастера. Параметры MASTER_LOG_FILE и MASTER_LOG_POS нужно взять из состояния мастера (в первом консольном окне).
Запускаем реплику при помощи следующей команды:
Далее проверяем статус реплики на узле реплики:
Убедитесь, что в этой выдаче значения параметров Slave_IO_Running и Slave_SQL_Running равно Yes
, а значение параметра Seconds_Behind_Master равно 0
.
Теперь откройте консоль мастер-сервера и посмотрите там узлы реплики:
Если все так, то значит, репликация работает.
Для проверки вы можете попробовать, например, создать таблицу в базе данных на мастере и убедиться, что она будет автоматически создана на реплике.
Если вам нужно превратить сервер реплики в мастер-сервер, то следует отключить репликацию. Сначала выдайте команду STOP SLAVE IO_THREAD
:
Далее выдавайте команду SHOW PROCESSLIST
:
Дождитесь появления сообщения:
Это сообщение говорит о том, что сервер реплики выполнил все команды из relay-лога в своей базе.
Теперь останавливаем реплику и очищаем bin-log:
Если не дождаться выполнения всех команд из relay-лога, то при переключении сервера реплики на новый мастер-сервер может потеряться часть команд, которые не были выполнены на реплике.
После останова реплики проверяем состояние сервера реплики следующим образом:
Убедитесь, что значение параметров Slave_IO_Running и Slave_SQL_Running указано как No.
Далее, чтобы при перезагрузке ОС на сервере репликации или при перезапуске сервиса MariaDB репликация не возобновилась, уберите символ комментария со строки параметра skip_slave_start
в файле конфигурации сервера репликации /etc/mysql/mariadb.conf.d/50-server.cnf
:
Возможно вам пригодится следующая статья про настройку репликации, а также раздел документации MariaDB, посвященный настройке репликации.
Если вы настраиваете репликацию MariaDB версии 10.5 или новее, можете настроить репликацию на базе глобального идентификатора транзакции global transaction ID. Эта процедура описана здесь.
Для мониторинга репликации MySQL или MariaDB используйте плагин MySQL by Zabbix agent. Про установку и настройку этого плагина мы уже рассказывали в статье «MariaDB: настройка и мониторинг с помощью Zabbix».
Здесь мы расскажем только об особенностях, имеющих отношение к мониторингу репликации.
Вам необходимо создать пользователя zbx_monitor:
Для мониторинга репликации необходимо указать этому пользователю следующие права:
Такие права нужны для того, чтобы плагин MySQL by Zabbix agent от имени этого пользователя мог выполнять в MariaDB версии 10.5 команду, на базе которой и построен мониторинг:
Для мониторинга сервера MySQL или MariaDB версии до 10.5 (например, MariaDB 10.3) у пользователя zbx_monitor должны быть права REPLICATION CLIENT. Однако у новых версий MariaDB этих прав для мониторинга репликации недостаточно.
Подробнее от этом можно почитать здесь и здесь. Установите минимально необходимые права в соответствии с версией вашей СУБД.
Для проверки достаточности прав вы можете подключиться к консоли MariaDB как пользователь zbx_monitor, а затем выдать в консоли команду «show slave status\G
». Если прав недостаточно, вы увидите соответствующее сообщение об ошибке.
Когда плагин MySQL by Zabbix пытается получить доступ к серверу с адреса 127.0.0.1, а не localhost, и этот доступ не настроен, то при выдаче команды «system mysql status
» на консоли появится такое сообщение:
Домен xxx1slave.domain.ru
указан только для примера.
В этом случае нужно добавить пользователя:
Если сервер MySQL или MariaDB участвует в репликации (как сервер реплики), средства Zabbix для обнаружения LLD автоматически создают необходимые метрики (рис. 1).
Рис. 1. Метрики мониторинга репликации
На рис. 1 мы закрасили адрес IP мастер-сервера.
Также автоматически создаются необходимые триггеры (рис. 2).
Рис. 2. Триггеры мониторинга репликации
На рис. 2 закрашены имена хоста реплики, а также адрес IP мастер-сервера.
Как видите, эти триггеры будут установлены, если репликация не выполняется или работает с большим отставанием.
Самый серьезный уровень Average по умолчанию назначен триггеру The slave I/O thread is not running. Если он установился, то информация из бинарного лога мастера не попадает в журнал релея (relay log) на сервере реплики. Такое бывает, например, в результате ошибки в сети.
Срабатывание триггера Replication lag is too high может означать, что сервер реплики не справляется со своей работой из-за недостаточной производительности или проблем с аппаратным обеспечением. Этот вопрос обсуждается здесь.
Уровень серьезности триггеров вы можете изменить в соответствии с требованиями вашего бизнеса.
Автор статьи: Александр Фролов.