InfraGuard

Сессии (Redis)

Наблюдайте за состоянием хранилища сессий и кэша Redis по узлам (ёмкость, пропускная способность, доля попаданий, управление памятью, keyspace) по данным read-модели, наполняемой коллектором, — без прямого подключения к Redis.

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

Сервисы ▸ Сессии (Redis) на одном экране показывают состояние хранилища сессий и кэша ваших зарегистрированных узлов Redis. Экран переносит на Redis повествование раздела Сервисы ▸ База данных и читает данные по двум осям:

  1. Потолок ёмкости и текущее состояние — кольцевой индикатор насыщения памяти (used_memory ÷ потолок ёмкости), клиентские подключения (connected / maxclients) и заблокированные клиенты.
  2. Пропускная способность — операции в секунду (instantaneous_ops_per_sec), доля попаданий за недавнее окно (Δhits / Δ(hits+misses)) и сетевой ввод-вывод (вход/выход, кбит/с).

Сворачиваемая панель подробностей добавляет временной ряд по управлению памятью (наложение потолка ёмкости и отметки эпизодов вытеснения), а также анализ keyspace и сессий.

Этот экран никогда не подключается к Redis напрямую. Представительный коллектор внутренней сети (scripts/infr_redis_vts_collector.cjs, задание pm2 cron, запускаемое каждую минуту) выполняет на каждом узле redis-cli INFO и загружает снимки в центральную таблицу MySQL infr_redis_metric; приложение только читает её. Приложение не хранит учётных данных Redis и не запускает долгоживущих демонов (тем самым исключаются утечки соединений и жёстко зашитые учётные данные).


Когда применять


Состав экрана

Верхние KPI

KPI Значение
Узлы Карточки узлов Redis, по которым есть выборка в недавнем окне (30 минут)
Работают / Деградация / Недоступны Количество узлов со статусом up / degraded / down
Всего опер./с Сумма instantaneous_ops_per_sec по всем узлам
Всего ключей Сумма keyspace_keys по всем узлам

Карточки узлов (две оси)

Каждому узлу соответствует одна карточка. В заголовке — имя или псевдоним инстанса, версия Redis и роль (master/replica); в теле расположены обе оси.

① Ёмкость · свободно (левый кольцевой индикатор) — значение в центре равно used_pct (занято ÷ потолок ёмкости). Полоса показателей:

Показатель Поле Примечания
Клиенты connected_clients / maxclients Подключения относительно предела; у предела новые подключения отклоняются
Заблокировано blocked_clients Клиенты, ожидающие на BLPOP·BRPOP·WAIT (0 — здоровое значение)

② Пропускная способность (справа) — спарклайн и полоса:

Показатель Поле Примечания
опер./с instantaneous_ops_per_sec Команд, обработанных за секунду
Доля попаданий Δhits / Δ(hits+misses) Доля попаданий в кэш за недавнее окно (при малом числе выборок откатывается к значению с момента запуска)
Сетевой ввод-вывод instantaneous_input_kbps + output_kbps Сетевой вход/выход за секунду

Оценки эффективности (низ карточки)

Оценка фрагментации (frag_score) вычисляется только тогда, когда used_memory составляет не менее 64 MB. На небольших инстансах постоянные накладные расходы аллокатора преобладают в этом отношении и дают ложные тревоги, поэтому ниже указанного порога оценка исключается и из градации, и из статуса.

Полоса жизненного цикла сессий

Полоса во всю ширину внизу карточки отображает с истечением → поток → истекло накопительно. Слева — ключи, у которых сейчас действует TTL (keyspace_expires, вот-вот истекут естественным образом); справа — ключи, истекшие с момента запуска (expired_keys, то есть оборот сессий). Заливка около ≈100% означает чистое хранилище сессий.

Подробности (развернуть)

Два блока раскрываются по клику (при изменении высоты раскладка masonry перестраивается).

Обучающие всплывающие подсказки (edu)

При наведении на значок рядом с показателем открывается специально оформленная подсказка с описанием причин и способов устранения (более глубокие понятия — в статье Тюнинг Redis: разбор):

Подсказка Содержание
SLOWLOG 7 причин накопления медленных команд (команды O(N) · крупные ключи · нехватка памяти · задержки fork · Lua · конвейеры · массовый DEL)
Доля попаданий Основание расчёта keyspace hit ratio и способы его поднять (держать рабочий набор в памяти · настроить TTL · смягчить лавины запросов)
Фрагментация Здоровый диапазон RSS / used (1,0–1,5) · activedefrag · предупреждение о свопе (< 1,0)
Логические базы Понятие нумерованных баз Redis (0–15) · разделение по назначению · переносимость в Cluster
Истечение · вытеснение Истечение срока (нормальная жизнь) против вытеснения (нехватка памяти) · как это читать

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

  1. Опрос — после загрузки страница каждые 30 секунд опрашивает /service/session/live, обновляя KPI и карточки (сервер кэширует панель на 20 секунд).
  2. Порядок карточек — перетаскивайте карточки, выстраивая их по приоритету (SortableJS; порядок сохраняется в localStorage).
  3. Развернуть подробности — кнопкой [Развернуть] на карточке откройте блоки управления памятью и keyspace.
  4. Учиться через edu — наведите указатель на значок показателя, чтобы увидеть подсказку о причинах и мерах.
  5. Полный экран — кнопка полноэкранного режима рядом с индикатором LIVE в заголовке скрывает верхнюю навигацию и переключает в режим панели (выход — ESC).

Если карточек нет, значит ни один узел Redis ещё не зарегистрирован и не опрошен. В разделе Администрирование ▸ Коллекторы зарегистрируйте узлы redis_host у коллектора redis_vts и разверните коллектор через pm2 на представительном хосте.


Источники данных

Read-модель infr_redis_metric

Приложение отображает эту таблицу как модель только для чтения в стиле Legacy (App\Models\Infr\InfrRedisMetric, $timestamps=false). Миграции для неё намеренно нет — коллектор создаёт её сам командой CREATE TABLE IF NOT EXISTS, поэтому Schema::create на стороне приложения приводил бы к конфликту.

Правила построителя App\Services\Redis\RedisMetricService::dashboard():

-- Концептуально (фактически используется Eloquent). Взять недавнее окно пакетом и сгруппировать в PHP.
SELECT * FROM infr_redis_metric
 WHERE sampled_at >= (NOW() - INTERVAL 30 MINUTE)
 ORDER BY sampled_at;

Коллектор — scripts/infr_redis_vts_collector.cjs

Единственный представительный хост внутренней сети работает по расписанию pm2 cron: за один проход он опрашивает Redis нескольких узлов (redis-cli -h {ip} INFO) и vts у nginx, напрямую загружает данные в центральный MySQL и завершается (не резидентный → на каждый запуск новый процесс, без утечек). Конфигурация находится только в блоке CONFIG в начале файла (без переменных окружения и без зашитых учётных данных).

# Развёртывание на представительном хосте (проход каждую минуту, не резидентно)
npm i mysql2                 # единственная зависимость npm (для загрузки). redis-cli установите пакетом ОС.
pm2 start infr_redis_vts_collector.cjs --name infr-collector \
  --no-autorestart --cron-restart "* * * * *"
pm2 save

Связь с инстансом (псевдоним / целочисленный внешний ключ)

При записи коллектор находит в infr_instance соответствие «псевдоним узла → id» и записывает instance_id (целое число) напрямую. Приложение соединяет данные прежде всего по metric.instance_id = infr_instance.id (сравнение целых чисел — не зависит от collation и опирается на индекс первичного ключа). Для незарегистрированных или зарегистрированных позже инстансов используется запасной путь node_alias (в нижнем регистре) → infr_instance.alias, а фоновое дозаполнение infr:link-metrics (с блокировкой лидера, каждые 5 минут) позже проставляет instance_id.

Расчёт потолка ёмкости (cap)

Базовая линия 100% для кольцевого индикатора и графика памяти определяется в следующем порядке.

Вид cap Условие Потолок Оценка свободного (est_free)
maxmemory maxmemory > 0 Заданное значение maxmemory (жёсткий потолок) maxmemory − used
budget maxmemory не задан Всего RAM − буферный пул базы данных − резерв ОС budget − used

Определение статуса и пороги

statusOf() относит каждый узел к up / degraded / down.

Статус Условие
down Сбор не удался (ok=0) либо данные stale (последняя выборка старше redis_stale_min)
degraded Выполняется одна или несколько причин ниже
up Причин нет

Причины и пороги degraded (Администрирование ▸ Операционная политика, infr_setting group=ops):

Причина Условие Ключ порога По умолчанию
Насыщение памяти used_pct ≥ redis_mem_pct 85
Фрагментация frag_score ≥ redis_frag_ratio 1.6
Заблокированные клиенты blocked_clients ≥ redis_blocked 1
Разрыв связи с репликой master_link_status = down — —
Ошибка сохранения RDB rdb_last_bgsave_status = err — —

Доля попаданий НЕ является осью статуса. Хранилище сессий промахивается при каждом новом входе, каждом истечении срока и каждом выходе, поэтому доля попаданий 40–60% — это норма (например, 44,75% на совершенно здоровом узле сессий). Раньше доля попаданий ниже redis_hit_rate_min (по умолчанию 50) давала ложно-красный degraded; теперь доля попаданий только отображается в KPI карточки, на индикаторе градации и в подсказке edu и никогда не окрашивает узел в красный. Настоящие проблемы кэша (насыщение памяти, вытеснение, фрагментация) улавливаются метриками mem_saturation/fragmentation независимо от характера нагрузки.


Доступ

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


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

Карточки не появляются («Узлы Redis не собраны»)

В infr_redis_metric нет свежих выборок. Проверьте, что (1) вы зарегистрировали узлы redis_host у коллектора redis_vts в разделе Администрирование ▸ Коллекторы, (2) infr_redis_vts_collector.cjs запущен под pm2 на представительном хосте и (3) с представительного хоста доступен порт Redis каждого узла через redis-cli.

Узел показан как «Недоступен (stale)»

Последняя выборка старше redis_stale_min (по умолчанию 5 минут). Скорее всего, процесс pm2 представительного коллектора завершился или остановилось его расписание cron. Проверьте это командами pm2 list / pm2 logs infr-collector.

Потолок кольцевого индикатора выглядит неверным, свободного места кажется слишком много

Узлы без maxmemory используют в качестве потолка бюджет (всего RAM − буферный пул базы данных − 20% резерва ОС). Если нужен жёсткий потолок, задайте maxmemory в Redis — тогда это значение станет потолком напрямую.

Блок keyspace и сессий пуст

Детализацию по базам (raw.keyspace) и метрики базы сессий наполняет расширенный коллектор. Если коллектор устаревший, разверните его заново (при этом идемпотентно добавляются total_system_memory, keyspace_keys и raw-колонки по базам) — и блок появится. Если данные не собраны, раздел аккуратно скрывается.

Доля попаданий низкая — это проблема?

Для сессионной нагрузки — нет (см. предупреждение выше). Если же это чистый кэш и доля попаданий низка, возможно, рабочий набор не помещается в памяти или TTL слишком короткий — см. раздел о доле попаданий в статье Тюнинг Redis: разбор.

Оценка фрагментации не показана

Когда used_memory меньше 64 MB, отношение фрагментации определяется постоянными накладными расходами и теряет смысл, поэтому оно исключается из градации и статуса.


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

Redis 세션 관제 — 수용률·처리량·적중률
Redis 세션 관제 — 수용률·처리량·적중률