Мониторинг MySQL сервера базы данных с помощью Icinga2
Расширенный мониторинг баз данных MySQL/MariaDB с помощью бесплатной системы мониторинга Icinga2
В статье будут рассмотрены необходимые плагины мониторинга и показаны некоторые примеры конфигурации Icinga2 для мониторинга различных настроек MySQL, от отдельных серверов до master/slave с репликацией, до нескольких экземпляров MySQL на одном сервере.
Требования
Мониторинг службы базы данных начинается с проверки наличия самой службы. Благодаря сквозному мониторингу, мы можем фактически подключаться к MySQL, а не просто проверять, работает ли этот процесс. Другими словами, сервер Icinga2 должен иметь возможность подключаться к сервису MySQL, работающему на сервере, поэтому, пожалуйста, настройте свой файрволл соответствующе.
1 | firewall-cmd --add-rich-rule 'rule family="ipv4" source address="$IP_or_IP_Range" service name="mysql" accept' --permanent |
Если сервер баз данных недоступен с удаленного компьютера, ознакомьтесь с документацией о том, как запустить Icinga2 в качестве агента.
Существуют различные плагины мониторинга, которые можно использовать с Icinga2 для проверки сервера MySQL. Все они являются частью стандартной установки инструментов мониторинга, поэтому можно использовать их без “изобретения велосипеда”:
check_mysql
: простой плагин, который можно использовать для проверки подключений к серверу MySQL;check_mysql_query
: отправляет SQL-запросы на сервер MySQL и проверяет их результаты на разные пороговые уровни;check_mysql_health
: более сложный плагин для мониторинга времени безотказной работы, времени соединения, связанных потоков, попадания в поток или кеш запросов, задержки между ведущим и ведомым серверами и т. д.
Третий плагин предлагает несколько режимов мониторинга серверов баз данных. В статье мы сосредоточимся на нем. Он уже включен в библиотеку шаблонов Icinga Template Library (ITL), что означает, что нам не нужно беспокоиться о создании собственных команд проверки. Вместо этого просто установим плагин.
Загрузить плагин можно по этой ссылке
Прежде чем начать, обязательно создайте отдельного пользователя под MySQL для мониторинга. Он должен иметь ограниченные привилегии, потому что его пароль в открытом виде будет использоваться в конфигурационных файлах Icinga2. Для простой проверки соединения достаточно минимальных разрешений:
1 | GRANT USAGE ON mysql.* TO 'monitoring'@'Icinga2.local' IDENTIFIED BY 'BEST_PASSWORD'; |
Мониторинг single-сервер MySQL
Сперва создадим конфигурационный файл хоста, /etc/icinga2/conf.d/bogachev.biz.conf
со следующим содержимым (я использую зоны, поэтому можно определить хост в zones.d/bogachev.biz.conf
, как было сказано в статье про настройку хостов):
1 | object Host "bogachev.biz" { |
Основываясь на переменных, которые создали для хоста, теперь можем применить правила динамических сервисов.
Мониторинг доступности MySQL-сервера
Создаем конфигурационный файл /etc/icinga2/conf.d/apply_mysql.conf
, (либо используем файл сервисов хоста) со следующим содержимым:
1 | apply Service "mysql-connect" { |
Это создаст службу с отображаемым именем MySQL Connect
для всех узлов, на которых определена пользовательская переменная vars.mysql
. В случае с зонами - переменная будет только на указанных хостах.
Данный пример показывает время работы сервера MySQL (vars.mysql_health_mode
= «время безотказной работы»).
Вывод в Icinga2Web будет приблизительно следующий:
1 | OK - database is up since 27 minutes |
Мониторинг количества подключенных клиентов
По аналогии с предыдущим сервисом изменим режим работы плагина на threads-connected
:
1 | apply Service "mysql-threads-connected" { |
Вывод в Icinga2Web будет приблизительно следующий:
1 | OK - 1 client connection threads |
Мониторинг задержки при репликации
Если мы имеем связку серверов с репликацией, то используя плагин check_mysql_health
можно контролировать задержку между серверами, особенно, если сервера разнесены по разным геолокациям.
Сперва создадим на MySQL кластере нового пользователя для мониторинга:
1 | GRANT REPLICATION CLIENT ON *.* TO 'monitoring'@'%' IDENTIFIED BY 'BEST_PASSWORD'; |
Затем создадим новый конфигурационный файл хоста, /etc/icinga2/conf.d/replication_bogachev.biz.conf
со следующим содержимым:
1 | object Host "bogachev.biz" { |
Создаем конфигурационный файл /etc/icinga2/conf.d/apply_mysql.conf
, (либо используем существующий файл сервисов) со следующим содержимым:
1 | apply Service "mysql-slave" { |
Не забудьте изменить пороговые значения на те, что подходят для вашей конфигурации. (По умолчанию Warning - 10 и Critical - 20 секунд)
Мониторинг размера базы
Плагин поддерживает отправку SQL-запросов для получения необходимой информации из базы. Ради примера рассмотрим вариант с получениям размера базы данных.
Для получения размера базы будет использовать следующий SQL-запрос:
1 | SELECT SUM(data_length + index_length) / 1024 / 1024 AS 'db size' FROM information_schema.tables WHERE table_schema = 'TEST_DB'; |
Пример вывода:
1 | +---------------+ |
Режим sql
плагина check_mysql_health
позволяет отправлять этот SQL-запрос в нашу базу данных. Icinga2 сможет не только получать информацию о размере, но и определять пороговые значения для предупреждений или критических состояний.
Определим новый конфигурационный файл хоста, /etc/icinga2/conf.d/sql_bogachev.biz.conf
со следующим содержимым:
1 | object Host "bogachev.biz" { |
Создаем конфигурационный файл /etc/icinga2/conf.d/apply_mysql.conf
, (либо используем существующий файл сервисов) со следующим содержимым:
1 | apply Service "db_size" for (db_name => config in host.vars.database) { |
Мониторинг нескольких инстансов MySQL на одном сервере
Определим новый конфигурационный файл хоста, /etc/icinga2/conf.d/multiple_bogachev.biz.conf
со следующим содержимым:
1 | object Host "bogachev.biz" { |
Создаем конфигурационный файл /etc/icinga2/conf.d/apply_mysql.conf
, (либо используем существующий файл сервисов) со следующим содержимым:
1 | apply Service "mysql-multi-connect" for (mysql_instance => config in host.vars.mysql_instance) { |