Налаштування моніторингу 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?
- Створіть користувача з мінімальними правами:
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.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 днів.
Зв'яжіться з нами — отримайте консультацію. Ми гарантуємо стабільну роботу алертів та повну прозорість метрик. Замовте налаштування — і забудьте про нічні інциденти.







