InfraGuard

Сервисы ▸ База данных

Напрямую подключается к зарегистрированным базам данных и с помощью SHOW GLOBAL STATUS + information_schema отслеживает текущую нагрузку (параллелизм, пропускную способность) и структуру схемы.

Обзор — что делает экран

Сервисы ▸ База данных (/service/database) — это экран мониторинга в реальном времени, который напрямую подключается к зарегистрированным коллекторам баз данных (access=database), чтобы снимать метрики нагрузки и анализировать структуру схемы. Каждая база данных отображается одной карточкой, и каждая карточка сразу показывает две оси нагрузки.

Мониторинг баз данных построен вокруг двух осей нагрузки:

Ось Вопрос Ключевые метрики
① Нагрузка параллелизма Сколько накапливается прямо сейчас? threads_running, насыщение соединений (conn_pct), ожидающие запросы (waiting)
② Пропускная способность и неэффективность Сколько работы выполнено и сколько потрачено впустую? QPS (Δquestions/Δt), частота медленных запросов (Δslow_queries/Δt)

Дополнительно экран даёт анализ схемы (общий объём · крупнейшие базы · крупнейшие таблицы · состав движков), оценки эффективности (доля попаданий в кэш буферного пула · использование индексов) и блок управления памятью InnoDB (сброс грязных страниц · контрольная точка).

Этот экран не устанавливает никакого агента на целевую БД. Приложение InfraGuard просто подключается к удалённой MySQL/MariaDB с зарегистрированными учётными данными и выполняет запросы SHOW GLOBAL STATUS / information_schema.

Когда использовать

Компоновка

Верхние KPI

KPI Значение
Количество БД Всего зарегистрированных коллекторов access=database
Up / Degraded / Down Сводка статусов карточек (up/degraded/down)
Суммарный QPS Сумма QPS по всем карточкам
Соединения Сумма threads_connected по всем карточкам

Заголовок карточки

① Нагрузка параллелизма

② Пропускная способность и неэффективность

Нижняя часть карточки — эффективность · блокировки

Метрика Формула Оценки
Доля попаданий в кэш 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 (сброс грязных страниц)

Расположение карточек

Сетка карточек поддерживает перетаскивание для изменения порядка (SortableJS · порядок сохраняется в localStorage) с кладкой по row-span. Экран обновляется опросом раз в 30 секунд.

Как пользоваться

  1. Сначала зарегистрируйте коллектор access=database в разделе Администрирование ▸ Коллекторы. Введите host/port/database/username и пароль (хранится на коллекторе в зашифрованном виде через Crypt) либо задайте cred_ref = env:PREFIX, чтобы повторно использовать существующий набор учётных данных из .env.
  2. Откройте /service/database; зарегистрированные базы данных выводятся карточками. При входе, если последняя выборка старше 60 секунд, выполняется немедленная однократная выборка (ensureFresh).
  3. Определите проблемную БД по значку статуса в заголовке, затем сузьте причину по двум осям нагрузки (параллелизм / пропускная способность).
  4. Разверните анализ схемы, чтобы изучить крупнейшие схемы и таблицы (при изменении высоты кладка перестраивается автоматически).
  5. Перетащите карточки, чтобы поднять наверх интересующие вас базы данных (порядок сохраняется в браузере).

Повторное использование учётных данных через 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.

Доступ

Устранение неполадок и вопросы

Карточка показывает «down»

QPS / частота медленных запросов / оценки эффективности показывают «—»

Производные значения вычисляются как дельта относительно предыдущей успешной выборки. При первой выборке, после перезапуска БД (uptime уменьшился → счётчик сброшен) или когда счётчик идёт назад, значению нельзя доверять, и оно остаётся null (—). Начиная со второй выборки оно отображается нормально.

Ожидающие запросы показывают «только собственное соединение»

У учётной записи мониторинга нет глобальной привилегии PROCESS, поэтому в information_schema.processlist видны только её собственные соединения. Выдайте PROCESS с помощью SQL из раздела Чтобы видеть ожидающие запросы по всему серверу (эффект в течение часа, когда истечёт кэш области).

Раздел управления памятью / контрольной точки пуст

Анализ схемы сначала мигает пустотой, затем появляется

analysisCached выполняет поиск только в кэше. При первом входе кэш пуст и раздел скрыт; после того как планировщик прогреет его, раздел появится при следующем 30-секундном опросе. Неудачи кэшируются лишь на 30 с (успехи — на 30 минут), поэтому временная ошибка не закрепляется надолго.

Смежные разделы

데이터베이스 관제 — 연결 포화·QPS·슬로우 쿼리
데이터베이스 관제 — 연결 포화·QPS·슬로우 쿼리