Плагин Redis

Мониторинг экземпляров кэша и базы данных Redis с подробными метриками, отслеживающими использование памяти, производительность, персистентность и репликацию.

Обзор

Плагин Redis собирает детальные метрики с серверов Redis, включая:

  • Использование памяти - Потребление памяти, фрагментация, пиковое использование
  • Производительность - Команды в секунду, попадания/промахи keyspace, эффективность кэша
  • Соединения - Подключённые клиенты, заблокированные клиенты, отклонённые соединения
  • Персистентность - Статус RDB и AOF, время последнего сохранения, изменения с момента последнего сохранения
  • Репликация - Статус master/slave, лаг репликации, подключённые реплики
  • Keyspace - Ключи по базам данных, истекающие ключи, средний TTL

Требования

Версия Redis

  • Минимум: Redis 4.0
  • Рекомендуется: Redis 6.0 или новее
  • Протестировано с: Redis 5.0, 6.0, 6.2, 7.0, 7.2

Зависимости Python

pip install redis>=4.5.0

Устанавливается автоматически при использовании PLUGINS=redis во время установки агента.

Сетевой доступ

Агент должен иметь возможность подключиться к Redis:

# Test connectivity
redis-cli -h localhost -p 6379 ping

Ожидаемый ответ: PONG

Конфигурация

Базовая конфигурация

plugins:
  redis:
    enabled: true
    host: localhost
    port: 6379

С паролем

plugins:
  redis:
    enabled: true
    host: localhost
    port: 6379
    password: 'your-redis-password'

С SSL/TLS

plugins:
  redis:
    enabled: true
    host: redis.example.com
    port: 6380
    password: 'your-redis-password'
    ssl: true

Удалённый сервер Redis

plugins:
  redis:
    enabled: true
    host: redis-server.example.com
    port: 6379
    password: 'secure-password'
    database: 0

Все параметры конфигурации

plugins:
  redis:
    enabled: true           # Enable/disable plugin
    host: localhost         # Redis hostname or IP
    port: 6379             # Redis port (default: 6379)
    password: ''           # Redis password (optional)
    database: 0            # Database number to connect to (default: 0)
    ssl: false             # Use SSL/TLS connection (default: false)
    socket_timeout: 5      # Connection timeout in seconds (default: 5)
    socket_connect_timeout: 5  # Connect timeout in seconds (default: 5)

Переменные окружения

Конфигурацию можно переопределить переменными окружения:

export REDIS_HOST="localhost"
export REDIS_PORT="6379"
export REDIS_PASSWORD="secret"
export REDIS_DATABASE="0"
export REDIS_SSL="false"

Собираемые метрики

Все метрики собираются командой Redis INFO.

Метрика Описание Единица Тип
used_memory_mb Всего памяти, выделенной Redis Мегабайты Gauge
memory_fragmentation_ratio Отношение RSS к выделенной памяти Коэффициент Gauge
keyspace_hits_total Успешные обращения к ключам (накопительно) Количество Counter
keyspace_misses_total Неудачные обращения к ключам (накопительно) Количество Counter
hit_rate_percent Процент попаданий в кэш Проценты Gauge
connected_clients Количество подключённых клиентов Количество Gauge
ops_per_sec Текущее число операций в секунду ops/s Gauge
evicted_keys Ключи, вытесненные из-за maxmemory (накопительно) Количество Counter
expired_keys Истёкшие ключи (накопительно) Количество Counter
uptime_seconds Время работы сервера Redis Секунды Gauge
used_memory_peak_mb Пиковое использование памяти Мегабайты Gauge
connected_slaves Количество подключённых реплик Количество Gauge
rdb_last_save_time Unix-метка времени последнего сохранения RDB Метка времени Gauge

Примечания:

  • Memory Fragmentation Ratio: Здоровый диапазон — 1.0-1.5. Значения < 1.0 указывают на свопинг (плохо), значения > 1.5 указывают на фрагментацию (рассмотрите перезапуск)
  • Hit Rate: Вычисляется как keyspace_hits / (keyspace_hits + keyspace_misses) * 100. У здорового кэша hit rate должен быть > 90%
  • Connected Slaves: Актуально только для master-экземпляров в конфигурации с репликацией

Метрики дашборда

Дашборд StatusRadar отображает:

Карточка обзора

  • Status - Сервер Redis работает/не работает
  • Uptime - Человекочитаемое время работы (преобразовано из uptime_seconds)
  • Connected Clients - Активные клиентские соединения

График использования памяти

  • Used Memory (MB) - used_memory_mb
  • Peak Memory (MB) - used_memory_peak_mb
  • Memory Fragmentation Ratio - memory_fragmentation_ratio

График производительности

  • Operations per second - ops_per_sec
  • Cache hit rate (%) - hit_rate_percent
  • Keyspace hits (total) - keyspace_hits_total
  • Keyspace misses (total) - keyspace_misses_total

Вытеснение и истечение

  • Evicted keys (total) - evicted_keys
  • Expired keys (total) - expired_keys

Статус репликации

  • Connected slaves - connected_slaves
  • Last RDB save time - rdb_last_save_time

Конфигурация Redis

Особая настройка не требуется

Мониторинг Redis работает с конфигурацией Redis по умолчанию. Никаких особых настроек не нужно.

Опционально: защита паролем

Установите пароль Redis:

Отредактируйте /etc/redis/redis.conf:

requirepass your-secure-password-here

Перезапустите Redis:

sudo systemctl restart redis

Обновите конфигурацию агента:

plugins:
  redis:
    enabled: true
    password: 'your-secure-password-here'

Опционально: включение персистентности

RDB (снапшоты):

Отредактируйте /etc/redis/redis.conf:

save 900 1      # Save after 900 sec if 1 key changed
save 300 10     # Save after 300 sec if 10 keys changed
save 60 10000   # Save after 60 sec if 10000 keys changed

AOF (Append-Only File):

appendonly yes
appendfsync everysec  # Options: always, everysec, no

Опционально: ограничение памяти

Предотвратите неограниченный рост памяти:

maxmemory 2gb
maxmemory-policy allkeys-lru  # LRU eviction policy

Политики вытеснения:

  • noeviction - Возвращать ошибки при достижении лимита памяти
  • allkeys-lru - Вытеснять давно не использовавшиеся ключи
  • volatile-lru - Вытеснять LRU-ключи с установленным сроком истечения
  • allkeys-random - Вытеснять случайные ключи
  • volatile-random - Вытеснять случайные ключи со сроком истечения
  • volatile-ttl - Вытеснять ключи с наименьшим TTL

Установка

Быстрая установка

PLUGINS='redis' \
TOKEN='your-agent-token' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Установите зависимость Python:

    cd /opt/statusradar
    source venv/bin/activate  # If using venv
    pip install redis
  2. Включите плагин в конфигурации:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      redis:
        enabled: true
        host: localhost
        port: 6379
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep redis

    Ожидаемо:

    INFO: Plugin redis: Metrics collected successfully

Тестирование

Ручной тест плагина

cd /opt/statusradar
export PLUGINS=redis
python3 plugins/redis_plugin.py

Ожидаемый вывод:

Plugin name: redis
Enabled: True
Available: True

Metrics collected (13 keys):
  used_memory_mb: 32.5
  memory_fragmentation_ratio: 1.2
  keyspace_hits_total: 1000
  keyspace_misses_total: 100
  hit_rate_percent: 90.91
  connected_clients: 5
  ops_per_sec: 42
  evicted_keys: 0
  expired_keys: 50
  uptime_seconds: 86400
  used_memory_peak_mb: 48.3
  connected_slaves: 0
  rdb_last_save_time: 1697123456
}

Тест подключения к Redis

# Basic ping
redis-cli ping

# With password
redis-cli -a your-password ping

# Remote server
redis-cli -h redis.example.com -p 6379 -a password ping

# Check INFO output
redis-cli info

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

Плагин не собирает метрики

Проверка 1: Запущен ли Redis?

sudo systemctl status redis

Проверка 2: Может ли агент подключиться?

redis-cli -h localhost -p 6379 ping

Проверка 3: Верен ли пароль?

redis-cli -a your-password ping

Проверка 4: Включён ли плагин?

grep -A5 "redis:" /opt/statusradar/config/agent.yaml

Проверка 5: Установлен ли Python-пакет?

python3 -c "import redis; print(redis.__version__)"

Распространённые ошибки

"Connection refused"

Ошибка:

ERROR: Plugin redis: [Errno 111] Connection refused

Причина: Redis не запущен или неверный host/port

Решение:

# Check if Redis is running
sudo systemctl status redis

# Start Redis
sudo systemctl start redis

# Verify port
sudo netstat -tlnp | grep 6379

# Check configuration
cat /opt/statusradar/config/agent.yaml | grep -A5 redis

"Authentication required"

Ошибка:

ERROR: Plugin redis: NOAUTH Authentication required

Причина: Redis требует пароль, но он не указан

Решение:

Добавьте пароль в конфигурацию агента:

plugins:
  redis:
    enabled: true
    password: 'your-redis-password'

"No module named 'redis'"

Ошибка:

ERROR: No module named 'redis'

Причина: Python-пакет redis не установлен

Решение:

pip install redis
# Or
cd /opt/statusradar && source venv/bin/activate && pip install redis

"Wrong password"

Ошибка:

ERROR: Plugin redis: WRONGPASS invalid username-password pair

Причина: Неверный пароль в конфигурации

Решение:

  1. Проверьте пароль Redis:

    grep "^requirepass" /etc/redis/redis.conf
  2. Обновите конфигурацию агента правильным паролем

  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent

Метрики показывают ноль

Симптом: Некоторые метрики всегда показывают 0

Проверьте вывод INFO:

redis-cli info

Обратите внимание на:

  • keyspace_hits:0, keyspace_misses:0 - Кэш ещё не использовался
  • connected_slaves:0 - Сервер не является master с репликами
  • db0_keys:0 - В базе данных 0 нет ключей

Это нормально, если:

  • Redis только что запустился
  • Ни одно приложение его пока не использует
  • База данных пуста

Влияние на производительность

На Redis

Незначительное влияние:

  • Плагин выполняет команду INFO ALL один раз за интервал сбора
  • Команда INFO легковесна (время выполнения < 1 мс)
  • Операция только для чтения, без изменения данных
  • Нет конкуренции за блокировки

Бенчмарк:

  • QPS Redis с мониторингом: 100,000+ ops/sec
  • QPS Redis без мониторинга: 100,000+ ops/sec
  • Накладные расходы: < 0.01%

На агент

Использование ресурсов:

  • Память: +10 MB
  • CPU: +2% во время сбора (0.1-0.3 секунды)
  • Сеть: +1 KB за сбор

Сценарии использования

1. Мониторинг производительности кэша

Отслеживайте:

  • Hit rate (должен быть > 90%)
  • Вытесненные ключи (высокое вытеснение = нужно больше памяти)
  • Фрагментацию памяти

Настройте оповещения на:

  • Hit rate < 80%
  • Использование памяти > 90%
  • Коэффициент фрагментации > 1.5

2. Мониторинг хранилища сессий

Отслеживайте:

  • Подключённые клиенты
  • Всего ключей
  • Истекающие ключи

Настройте оповещения на:

  • Внезапное падение числа клиентов (сбой приложения)
  • Ключи не истекают (утечка памяти)

3. Мониторинг очередей

Отслеживайте:

  • Заблокированные клиенты (потребители очереди)
  • Длины списков (через пользовательские скрипты)
  • Операции в секунду

Настройте оповещения на:

  • Отсутствие заблокированных клиентов (потребители упали)
  • Высокий ops/sec (переполнение очереди)

4. Мониторинг репликации

Отслеживайте:

  • Статус подключения реплик
  • Лаг репликации
  • Количество подключённых реплик

Настройте оповещения на:

  • Отключение реплики
  • Лаг репликации > 10 секунд
  • Падение числа реплик

Лучшие практики

1. Используйте последнюю версию Redis

Преимущества:

  • Более эффективное использование памяти
  • Улучшенная производительность команды INFO
  • Более детальные метрики

2. Включите персистентность для продакшена

RDB для резервных копий:

save 900 1
save 300 10
save 60 10000

AOF для надёжности:

appendonly yes
appendfsync everysec

3. Установите лимит maxmemory

Предотвратите OOM:

maxmemory 4gb
maxmemory-policy allkeys-lru

4. Следите за фрагментацией памяти

Если mem_fragmentation_ratio > 1.5:

  • Перезапустите Redis в период низкого трафика
  • Рассмотрите использование аллокатора jemalloc

5. Защитите паролем

В продакшене всегда устанавливайте requirepass:

requirepass strong-random-password-here

6. Следите за лагом репликации

Для конфигураций master-slave настройте оповещение на:

  • master_link_status = 0 (реплика отключена)
  • lag > 5 seconds

Расширенная конфигурация

Несколько экземпляров Redis

Чтобы мониторить несколько экземпляров Redis, разверните отдельные агенты или используйте мониторинг Sentinel/Cluster (скоро).

Redis Cluster

Плагин мониторит отдельные узлы. Для метрик в масштабе кластера опрашивайте каждый узел по отдельности.

Redis Sentinel

Плагин подключается к экземпляру Redis, а не к Sentinel. Мониторьте Sentinel отдельно через HTTP API.

Примеры конфигураций

Сервер разработки

plugins:
  redis:
    enabled: true
    host: localhost
    port: 6379

Продакшен-сервер (защищённый)

plugins:
  redis:
    enabled: true
    host: localhost
    port: 6379
    password: 'strong-password-from-env'
    database: 0

Удалённый Redis (SSL)

plugins:
  redis:
    enabled: true
    host: redis.example.com
    port: 6380
    password: 'secure-password'
    ssl: true
    socket_timeout: 10

Redis на нестандартном порту

plugins:
  redis:
    enabled: true
    host: localhost
    port: 6380  # Custom port
    password: 'password'

Справочник по метрикам

Полный список метрик

Плагин собирает 13 метрик командой Redis INFO:

Память (3 метрики):

  • used_memory_mb - Текущее использование памяти в мегабайтах
  • used_memory_peak_mb - Пиковое использование памяти в мегабайтах
  • memory_fragmentation_ratio - Коэффициент фрагментации памяти

Производительность (5 метрик):

  • ops_per_sec - Текущее число операций в секунду
  • keyspace_hits_total - Всего успешных обращений к ключам (counter)
  • keyspace_misses_total - Всего неудачных обращений к ключам (counter)
  • hit_rate_percent - Вычисленный процент попаданий в кэш
  • connected_clients - Количество подключённых клиентов

Вытеснение и истечение (2 метрики):

  • evicted_keys - Всего ключей, вытесненных из-за maxmemory (counter)
  • expired_keys - Всего истёкших ключей (counter)

Система (2 метрики):

  • uptime_seconds - Время работы сервера Redis в секундах

Репликация (1 метрика):

  • connected_slaves - Количество подключённых экземпляров-реплик

Персистентность (1 метрика):

  • rdb_last_save_time - Unix-метка времени последнего снапшота RDB

Дальнейшие шаги

On this page