Настройка MySQL мониторинга через Prometheus (mysqld_exporter)
Представьте: в 3 часа ночи MySQL падает из-за переполнения соединений. Вы узнаёте об этом утром от клиентов. Мы ставим автоматический мониторинг, который предупреждает за 5 минут до сбоя. MySQL генерирует тонны диагностической информации: SHOW STATUS, SHOW ENGINE INNODB STATUS, information_schema, performance_schema. Разбирать тысячи строк вручную — бессмысленно. Мы автоматизируем сбор метрик с помощью mysqld_exporter, превращая их в понятные графики и алерты в Grafana. За 10 лет настроили мониторинг для 50+ проектов. Экономия от предотвращения одного ночного инцидента может достигать $270–390.
Почему mysqld_exporter?
Он умеет вытаскивать из MySQL всё: от cache hit ratio InnoDB до отставания репликации. Без него вы узнаёте о проблемах, когда база уже лежит. С ним — получаете предупреждение за 5 минут до сбоя. Как отмечается в документации Prometheus, mysqld_exporter собирает более 200 метрик MySQL.
Какие метрики критичны?
InnoDB buffer pool. mysql_global_status_innodb_buffer_pool_reads и mysql_global_status_innodb_buffer_pool_read_requests. Считаем hit ratio: 1 - (rate(innodb_buffer_pool_reads[5m]) / rate(innodb_buffer_pool_read_requests[5m])). Если ниже 99% — buffer pool мал. При 95% пора срочно увеличивать innodb_buffer_pool_size. На одном проекте с нагрузкой 10k req/s hit ratio упал до 97%. Мы увеличили buffer pool, и ratio вернулся к 99,9%.
Threads и соединения. mysql_global_status_threads_connected / mysql_global_variables_max_connections. Когда занято больше 80% — команда Too many connections не за горами. Типичная причина: утечка соединений в приложении.
Slow queries. rate(mysql_global_status_slow_queries[5m]) > 1 — постоянный поток медленных запросов. Проверяйте slow query log или performance_schema.events_statements_summary_by_digest.
Replication lag. mysql_slave_status_seconds_behind_master > 30 — отставание больше 30 секунд ломает читающие приложения.
| Метрика | Норма | Предупреждение | Критично |
|---|---|---|---|
| InnoDB hit ratio | > 99% | 95–99% | < 95% |
| Threads usage | < 70% | 70–85% | > 85% |
| Replication lag | < 5 с | 5–30 с | > 30 с |
| Slow queries rate | < 0.1/с | 0.1–1/с | > 1/с |
Как настроить алерты?
Используем стандартные правила Prometheus (mysql_up == 0, threads_connected / max_connections > 0.8 и т.д.). Наш готовый набор покрывает все ключевые сценарии. Закажите комплексную настройку — мы предоставим готовый набор правил за один день. Дополнительная экономия: заказ комплексной настройки позволяет избежать дорогостоящих простоев.
Пример полного набора алертов
Правила включают MySQLDown, MySQLTooManyConnections, MySQLHighReplicationLag, MySQLInnoDBBufferPoolLowHitRatio. Все с настройками severity и аннотациями.Как развернуть mysqld_exporter?
- Создайте пользователя с минимальными правами:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter_secret' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
GRANT SELECT ON performance_schema.* TO 'exporter'@'%';
FLUSH PRIVILEGES; - Запустите контейнер:
services:
mysqld-exporter:
image: prom/mysqld-exporter:v0.15.1
command:
- "--mysqld.username=exporter"
- "--mysqld.address=mysql:3306"
ports:
- "9104:9104"
environment:
MYSQLD_EXPORTER_PASSWORD: "exporter_secret" - Проверьте сбор метрик, запросив
http://localhost:9104/metrics.
MAX_USER_CONNECTIONS 3 — ограничение важно: экспортер создаёт отдельное соединение на каждый scrape, и без лимита при агрессивном scrape_interval он может исчерпать max_connections.
Какие коллекторы включить?
По умолчанию включены базовые коллекторы. Для production дополнительно стоит добавить:
--collect.global_status
--collect.global_variables
--collect.slave_status
--collect.info_schema.innodb_metrics
--collect.info_schema.tables
--collect.perf_schema.eventsstatements
--collect.perf_schema.eventsstatementssumperf_schema.eventsstatements — дорогостоящий коллектор, он читает performance_schema.events_statements_summary_by_digest. На нагруженных серверах лучше выставить scrape_interval: 60s для этого job-а отдельно.
Какие метрики MySQL ключевые?
InnoDB buffer pool. mysql_global_status_innodb_buffer_pool_reads vs mysql_global_status_innodb_buffer_pool_read_requests — это cache hit ratio InnoDB. Считается как:
1 - (rate(innodb_buffer_pool_reads[5m]) / rate(innodb_buffer_pool_read_requests[5m])) Если ratio падает ниже 99% — либо buffer pool слишком мал для рабочего набора данных, либо нагрузка изменилась. Значение в 95% — уже серьёзный сигнал.
Threads и соединения. mysql_global_status_threads_connected и mysql_global_status_max_used_connections. Когда threads_connected приближается к max_connections, MySQL начинает отказывать с ошибкой Too many connections. Типичная история: разработчики не закрывают соединения в приложении, утечка накапливается, в 3 ночи база умирает.
Slow queries. mysql_global_status_slow_queries — монотонно возрастающий счётчик. rate(mysql_global_status_slow_queries[5m]) > 1 означает постоянный поток медленных запросов. Это сигнал смотреть slow query log или performance_schema.events_statements_summary_by_digest.
Replication lag. Для реплик метрика mysql_slave_status_seconds_behind_master показывает отставание в секундах. При значениях больше 30 секунд начинают болеть читающие приложения, работающие с репликой.
Алерты в Prometheus
groups:
- name: mysql
rules:
- alert: MySQLDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
- alert: MySQLTooManyConnections
expr: |
mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL использует {{ $value | humanizePercentage }} соединений"
- alert: MySQLHighReplicationLag
expr: mysql_slave_status_seconds_behind_master > 30
for: 5m
labels:
severity: warning
- alert: MySQLInnoDBBufferPoolLowHitRatio
expr: |
1 - (rate(mysql_global_status_innodb_buffer_pool_reads[5m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[5m])) < 0.99
for: 10m
labels:
severity: warning Grafana дашборд
Dashboard ID 7362 (MySQL Overview by Percona) — один из лучших готовых вариантов. Покрывает InnoDB metrics, query analytics, connections, replication. Требует наличия perf_schema коллекторов.
Что входит в настройку?
- Установка и конфигурация mysqld_exporter
- Настройка scrape job-ов в Prometheus
- Базовые алерты (5 правил) и дашборд Grafana
- Документация по эксплуатации и доступы
- 2 месяца гарантийной поддержки
Процесс работы
Начинаем с проверки: включён ли performance_schema в конфиге MySQL (performance_schema = ON в my.cnf), какой текущий slow_query_log_min_time, есть ли реплики. На старых версиях MySQL (5.6 и ниже) часть коллекторов недоступна — нужно явно ограничивать набор флагов экспортера.
Деплой экспортера, настройка scrape, базовые алерты — 2–3 часа. Полноценный набор алертов с учётом репликации, query analytics и кастомными метриками под конкретную схему БД — до 2 дней.
Свяжитесь с нами — получите консультацию. Мы гарантируем стабильную работу алертов и полную прозрачность метрик. Закажите настройку — и забудьте о ночных инцидентах.







