Настройка MySQL мониторинга через Prometheus (mysqld_exporter)

Когда MySQL падает посреди ночи, вы узнаёте об этом от клиентов, а не от системы. Мы настраиваем мониторинг на базе Prometheus и mysqld_exporter, который собирает ключевые метрики базы и предупреждает о проблемах до того, как они станут критичными. Наша команда реализует проект под ключ — от установки и настройки до создания графиков в Grafana и алертов, с последующей поддержкой.
Часто задаваемые вопросы

Настройка 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?

  1. Создайте пользователя с минимальными правами:
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;
  1. Запустите контейнер:
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"
  1. Проверьте сбор метрик, запросив 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.eventsstatementssum

perf_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 дней.

Свяжитесь с нами — получите консультацию. Мы гарантируем стабильную работу алертов и полную прозрачность метрик. Закажите настройку — и забудьте о ночных инцидентах.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1543
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1374
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142