Обзор — что делает экран
Сервисы ▸ База данных (/service/database) — это экран мониторинга в реальном времени, который напрямую подключается к зарегистрированным коллекторам баз данных (access=database), чтобы снимать метрики нагрузки и анализировать структуру схемы. Каждая база данных отображается одной карточкой, и каждая карточка сразу показывает две оси нагрузки.
Мониторинг баз данных построен вокруг двух осей нагрузки:
| Ось | Вопрос | Ключевые метрики |
|---|---|---|
| ① Нагрузка параллелизма | Сколько накапливается прямо сейчас? | threads_running, насыщение соединений (conn_pct), ожидающие запросы (waiting) |
| ② Пропускная способность и неэффективность | Сколько работы выполнено и сколько потрачено впустую? | QPS (Δquestions/Δt), частота медленных запросов (Δslow_queries/Δt) |
Дополнительно экран даёт анализ схемы (общий объём · крупнейшие базы · крупнейшие таблицы · состав движков), оценки эффективности (доля попаданий в кэш буферного пула · использование индексов) и блок управления памятью InnoDB (сброс грязных страниц · контрольная точка).
Этот экран не устанавливает никакого агента на целевую БД. Приложение InfraGuard просто подключается к удалённой MySQL/MariaDB с зарегистрированными учётными данными и выполняет запросы
SHOW GLOBAL STATUS/information_schema.
Когда использовать
- База данных внезапно замедлилась — мгновенно определить, произошло ли насыщение соединений, всплеск параллелизма или рост медленных запросов.
- До и после настройки пула соединений — наблюдать за насыщением
threads_connected / max_connectionsво времени. - Планирование ёмкости — увидеть, какие схемы и таблицы занимают больше всего диска и каков состав движков.
- Диагностика давления сброса InnoDB — здорово ли грязные страницы циркулируют ниже порога и насколько возраст контрольной точки ушёл вперёд относительно ёмкости redo.
- Обзор эффективности кэша и индексов — читать долю попаданий в буферный пул и использование индексов как основание для тюнинга.
Компоновка
Верхние KPI
| KPI | Значение |
|---|---|
| Количество БД | Всего зарегистрированных коллекторов access=database |
| Up / Degraded / Down | Сводка статусов карточек (up/degraded/down) |
| Суммарный QPS | Сумма QPS по всем карточкам |
| Соединения | Сумма threads_connected по всем карточкам |
Заголовок карточки
- Метка хоста (
host_aliasколлектора → config.host → env-хост из cred_ref, именно в таком порядке). - Драйвер (
mysql/mariadb), имя базы данных, время работы, значок статуса.
① Нагрузка параллелизма
- Кольцевой индикатор насыщения соединений =
threads_connected / max_connections. - Running (
threads_running) — потоки, которые действительно потребляют CPU. - Waiting (очередь) (
waiting) — запросы, время обработки которых превышает порог (по умолчанию 2 с). В зависимости от привилегииPROCESSподсчёт ведётся по всему серверу или только по собственному соединению (область показана на карточке).
② Пропускная способность и неэффективность
- Спарклайн QPS =
Δquestions / Δt(последние 60 успешных выборок). - Частота медленных запросов =
Δslow_queries / Δt, а также всего медленных запросов (slow_queries).
Нижняя часть карточки — эффективность · блокировки
| Метрика | Формула | Оценки |
|---|---|---|
| Доля попаданий в кэш | 1 − Δinnodb_buffer_pool_reads / Δinnodb_buffer_pool_read_requests |
Отлично ≥ 99,5 % · Хорошо ≥ 98 % · Удовлетворительно ≥ 90 % |
| Использование индексов | Δhandler_read_key / (Δhandler_read_key + Δhandler_read_rnd_next) |
Отлично ≥ 90 % · Хорошо ≥ 70 % · Удовлетворительно ≥ 40 % |
| lock | innodb_row_lock_time_avg (среднее ожидание блокировки строки, мс) |
Чем меньше, тем лучше |
Каждая подпись метрики (cache · index · lock · checkpoint) снабжена обучающим всплывающим окном, объясняющим причины и способы устранения (например, увеличить innodb_buffer_pool_size, использовать покрывающие индексы, избегать gap-блокировок).
Анализ схемы (сворачиваемый)
По умолчанию свёрнут, раскрывается кнопкой [Развернуть]. Агрегируется из information_schema.tables и показывает общий объём · количество таблиц · количество схем · 8 крупнейших схем по объёму · 14 крупнейших таблиц по объёму · состав движков.
Анализ схемы по своей природе является медленным запросом на сервере (замерено ~3,5 с), поэтому он обходится длинным кэшем на 30 минут. Планировщик (
infr:collect-db) прогревает кэш, так что веб-запросы всегда попадают в него. Пока кэш пуст, раздел ненадолго скрыт и появляется при следующем опросе.
Управление памятью InnoDB (сброс грязных страниц)
- Временной ряд грязных страниц плюс наложение «подходящего значения» (порога) — MAX (
innodb_max_dirty_pages_pct) и LWM (innodb_max_dirty_pages_pct_lwm), пересчитанные в абсолютное количество страниц (это не произвольные константы, а точка, с которой InnoDB действительно начинает агрессивный сброс). - Возраст контрольной точки (
Log sequence number − Last checkpoint at) в процентах от ёмкости redo. - Размер буферного пула и его отношение к оперативной памяти сервера (
mem_mbэкземпляра ОС, присоединённого по alias).
Расположение карточек
Сетка карточек поддерживает перетаскивание для изменения порядка (SortableJS · порядок сохраняется в localStorage) с кладкой по row-span. Экран обновляется опросом раз в 30 секунд.
Как пользоваться
- Сначала зарегистрируйте коллектор
access=databaseв разделе Администрирование ▸ Коллекторы. Введитеhost/port/database/usernameи пароль (хранится на коллекторе в зашифрованном виде через Crypt) либо задайтеcred_ref = env:PREFIX, чтобы повторно использовать существующий набор учётных данных из.env. - Откройте
/service/database; зарегистрированные базы данных выводятся карточками. При входе, если последняя выборка старше 60 секунд, выполняется немедленная однократная выборка (ensureFresh). - Определите проблемную БД по значку статуса в заголовке, затем сузьте причину по двум осям нагрузки (параллелизм / пропускная способность).
- Разверните анализ схемы, чтобы изучить крупнейшие схемы и таблицы (при изменении высоты кладка перестраивается автоматически).
- Перетащите карточки, чтобы поднять наверх интересующие вас базы данных (порядок сохраняется в браузере).
Повторное использование учётных данных через cred_ref
При cred_ref = env:PREFIX следующие ключи читаются из .env, поэтому никакие секреты не хранятся в базе данных:
Например: env:STATS_DB → сервер blue, env:STATS_GLORY_DB → сервер glory.
Чтобы видеть ожидающие запросы по всему серверу
Чтобы агрегировать waiting по всему серверу, учётной записи мониторинга нужна привилегия PROCESS; иначе считаются только её собственные соединения. Учётная запись мониторинга с минимальными правами:
CREATE USER 'infra_monitor'@'%' IDENTIFIED BY 'YOUR_DB_PASSWORD';
GRANT PROCESS, SELECT ON *.* TO 'infra_monitor'@'%';
FLUSH PRIVILEGES;
Определение области (есть ли
PROCESS) фиксировано для учётной записи, поэтому кэшируется на 1 час. Если вы выдадите привилегию позже, она вступит в силу в течение часа (для немедленного эффекта очистите кэш).
Источники данных
Исходные запросы (выполняются на удалённой БД)
| Запрос | Назначение |
|---|---|
SHOW GLOBAL STATUS |
Все счётчики threads · questions · slow_queries · bytes · буферного пула · handler · InnoDB |
SELECT @@GLOBAL.max_connections и подобные |
max_connections, настройки сброса InnoDB (кэш на 1 ч) |
information_schema.processlist |
Количество ожидающих запросов и определение области |
information_schema.tables |
Анализ схемы (кэш на 30 минут) |
SHOW ENGINE INNODB STATUS |
Возраст контрольной точки (LSN − последняя контрольная точка · требуется PROCESS) |
SHOW GRANTS FOR CURRENT_USER() |
Определение привилегии PROCESS (область) |
Таблица хранения
Снятые данные записываются во временной ряд infr_db_metric (миграция 000681). Накопительные счётчики (questions/slow_queries/bytes_*) также сохраняются, чтобы следующая выборка могла вычислить QPS · частоту медленных запросов · оценки эффективности через дельту.
infr_db_metric
collector_id host sampled_at uptime_sec
threads_connected/running/cached max_connections conn_pct
waiting waiting_scope
questions slow_queries qps slow_qps
bytes_received/sent recv_bps/sent_bps innodb_row_lock_waits
ok message raw(json: efficiency + InnoDB memory-management derivations)
Никаких утечек соединений (урок [1040]). Каждая выборка создаёт соединение во время выполнения и немедленно освобождает его через
DB::purgeв блокеfinally. Тайм-аут PDO (по умолчанию 5 с) не даёт веб-запросам и планировщику зависнуть на медленном удалённом сервере. Если эта дисциплина нарушается,max_connectionsобщей MySQL исчерпывается и страдает даже продуктивная среда.
Расписание сбора · условия запуска
Временной ряд наполняет artisan-команда infr:collect-db. Она выполняется один раз и завершается (это не демон); планировщик вызывает её каждую минуту.
# Немедленно снять одну выборку для одного коллектора (в обход условия)
php artisan infr:collect-db --key=db@blue --force
Операционная политика (Администрирование ▸ Операционная политика · OpsPolicy) управляет запусками по расписанию:
| Настройка | По умолчанию | Значение |
|---|---|---|
db_collect_mode |
economy |
economy = собирать, только когда есть пользователь консоли (присутствие) · always = собирать постоянно |
db_collect_interval_sec |
60 |
Интервал сбора (с). Тик происходит каждую минуту, но фактический период равен этому значению |
Пороги degraded/down
DbCollectorService::statusOf определяет статус через OpsPolicy::dbThresholds().
| Причина | Условие | Порог по умолчанию |
|---|---|---|
conn_saturation |
conn_pct ≥ |
80 % |
high_concurrency |
threads_running ≥ |
40 |
query_backlog |
waiting ≥ |
5 |
slow_query_rate |
slow_qps ≥ |
1/с |
down |
Нет выборки / ok=false либо последняя выборка старше 5 минут (stale) |
— |
Есть хотя бы одна причина → degraded; нет ни одной → up.
Доступ
- Этот экран — консоль только для чтения внутри группы
infr.auth, минимальный уровень чтения demo=1. - На этой странице нет конечных точек записи. Регистрируйте и редактируйте учётные данные целевых БД в разделе Администрирование ▸ Коллекторы (admin=10, проверка
level≥5). - Пороги и режим сбора меняются в разделе Администрирование ▸ Операционная политика (admin).
Устранение неполадок и вопросы
Карточка показывает «down»
no_credentials— в config пусты host или username, либо отсутствуют env-ключи дляcred_ref=env:PREFIX.stale— последняя выборка старше 5 минут. Проверьте, работает ли планировщик (infr:collect-db), а в режиме economy — присутствует ли пользователь консоли.- Иное сообщение — причина сбоя подключения (отказ аутентификации, хост недоступен, тайм-аут) показывается дословно. Диагностируйте командой
php artisan infr:collect-db --key=<key> --force.
QPS / частота медленных запросов / оценки эффективности показывают «—»
Производные значения вычисляются как дельта относительно предыдущей успешной выборки. При первой выборке, после перезапуска БД (uptime уменьшился → счётчик сброшен) или когда счётчик идёт назад, значению нельзя доверять, и оно остаётся null (—). Начиная со второй выборки оно отображается нормально.
Ожидающие запросы показывают «только собственное соединение»
У учётной записи мониторинга нет глобальной привилегии PROCESS, поэтому в information_schema.processlist видны только её собственные соединения. Выдайте PROCESS с помощью SQL из раздела Чтобы видеть ожидающие запросы по всему серверу (эффект в течение часа, когда истечёт кэш области).
Раздел управления памятью / контрольной точки пуст
- Управлению памятью требуется
innodb_buffer_pool_pages_total(для старых выборок он скрыт). - Возраст контрольной точки разбирается из
SHOW ENGINE INNODB STATUS(→ нужна привилегияPROCESS). Без неё строка контрольной точки и аннотация корректно опускаются.
Анализ схемы сначала мигает пустотой, затем появляется
analysisCached выполняет поиск только в кэше. При первом входе кэш пуст и раздел скрыт; после того как планировщик прогреет его, раздел появится при следующем 30-секундном опросе. Неудачи кэшируются лишь на 30 с (успехи — на 30 минут), поэтому временная ошибка не закрепляется надолго.
Смежные разделы
- Обучение по нагрузке и тюнингу БД — основа для всплывающих окон lock · cache · index · checkpoint.
- Коллекторы — регистрация коллекторов
access=database, секреты, cred_ref. - Операционная политика — режим сбора · интервал · пороги деградации.
- Сессии (Redis) — родственный экран, применяющий ту же методику к Redis.
- Обзор сервисов — где карточки БД сводятся на доске сервисов в реальном времени.
- Конвейер коллектора БД — команда сбора и дисциплина против утечек соединений.
