Налаштування моніторингу 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+ проєктів. Економія від запобігання одній нічній інциденту може сягати 30 000 гривень.

Чому 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
    1546
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1402
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1086
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1383
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    822
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1147