Перейти к основному содержимому

Redis установка и настройка

Установка и настройка Redis сервера для кэширования и очередей.

Установка Redis

Ubuntu/Debian

# Обновление пакетов
sudo apt update

# Установка Redis
sudo apt install redis-server

# Проверка статуса
sudo systemctl status redis-server

# Включение автозапуска
sudo systemctl enable redis-server

CentOS/RHEL/Rocky Linux

# Включение EPEL репозитория
sudo dnf install epel-release

# Установка Redis
sudo dnf install redis

# Запуск и автозагрузка
sudo systemctl start redis
sudo systemctl enable redis

Компиляция из исходников

# Загрузка и компиляция
cd /tmp
wget https://download.redis.io/redis-stable.tar.gz
tar -xzf redis-stable.tar.gz
cd redis-stable
make
sudo make install

# Создание конфигурационной директории
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/

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

Основной файл конфигурации

# /etc/redis/redis.conf

# Bind интерфейсы
bind 127.0.0.1 192.168.1.100
protected-mode yes

# Порт
port 6379

# Фоновый режим
daemonize yes

# PID файл
pidfile /var/run/redis/redis-server.pid

# Уровень логирования (debug, verbose, notice, warning)
loglevel notice

# Файл логов
logfile /var/log/redis/redis-server.log

# Директория для данных
dir /var/lib/redis

# Сохранение на диск
save 900 1 # Сохранить если хотя бы 1 ключ изменился за 900 секунд
save 300 10 # Сохранить если хотя бы 10 ключей изменились за 300 секунд
save 60 10000 # Сохранить если хотя бы 10000 ключей изменились за 60 секунд

# Сжатие RDB файлов
rdbcompression yes

# Проверка контрольной суммы
rdbchecksum yes

# Имя RDB файла
dbfilename dump.rdb

Настройка безопасности

# Установка пароля
requirepass your_strong_password_here

# Переименование опасных команд
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG "CONFIG_9a8b7c6d5e4f"
rename-command SHUTDOWN "SHUTDOWN_1a2b3c4d5e6f"
rename-command DEBUG ""
rename-command EVAL ""

# Ограничение клиентов
maxclients 10000

# Ограничение памяти
maxmemory 2gb
maxmemory-policy allkeys-lru

Настройка производительности

Оптимизация памяти

# /etc/redis/redis.conf

# Политика освобождения памяти
maxmemory-policy allkeys-lru

# Частота проверки истечения ключей
hz 10

# TCP keepalive
tcp-keepalive 300

# TCP backlog
tcp-backlog 511

# Отключение прозрачных huge pages (в системе)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

Настройка ввода/вывода

# Отключение fsync для лучшей производительности (осторожно!)
appendfsync no

# Или используйте более безопасный вариант
appendfsync everysec

# Настройка ядра для оптимизации
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf
sysctl -p

Мониторинг и логирование

Настройка расширенного логирования

# /etc/redis/redis.conf

# Slow log для медленных запросов
slowlog-log-slower-than 10000 # Логировать запросы дольше 10ms
slowlog-max-len 128 # Максимум записей в slow log

# Уведомления о событиях
notify-keyspace-events "Ex" # Уведомления об истечении ключей

Мониторинг команды

# Подключение к Redis CLI
redis-cli -h localhost -p 6379 -a your_password

# Базовая информация о сервере
INFO

# Статистика производительности
INFO stats

# Информация о памяти
INFO memory

# Информация о репликации
INFO replication

# Мониторинг в реальном времени
MONITOR

# Просмотр slow log
SLOWLOG GET 10

# Статистика по командам
INFO commandstats

Репликация Master-Slave

Настройка Master сервера

# /etc/redis/redis-master.conf

bind 192.168.1.100
port 6379
requirepass master_password

# Настройки для slave подключений
masterauth master_password

# Сохранение данных
save 900 1
save 300 10
save 60 10000

Настройка Slave сервера

# /etc/redis/redis-slave.conf

bind 192.168.1.101
port 6379
requirepass slave_password

# Подключение к мастеру
replicaof 192.168.1.100 6379
masterauth master_password

# Только чтение
replica-read-only yes

# Приоритет для выбора нового мастера (0 = никогда не станет мастером)
replica-priority 100

Redis Sentinel (высокая доступность)

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

# /etc/redis/sentinel.conf

port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster master_password
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000

# Уведомления о событиях
sentinel notification-script mymaster /etc/redis/notify.sh

Скрипт уведомлений

#!/bin/bash
# /etc/redis/notify.sh

EVENT_TYPE=$1
EVENT_DESCRIPTION=$2

case $EVENT_TYPE in
"+sdown")
echo "Master down: $EVENT_DESCRIPTION" | mail -s "Redis Alert" admin@example.com
;;
"+failover-end")
echo "Failover completed: $EVENT_DESCRIPTION" | mail -s "Redis Failover" admin@example.com
;;
esac

Кластеризация Redis

Настройка кластера

# Создание директорий для узлов
mkdir -p /etc/redis/cluster/{7000,7001,7002,7003,7004,7005}

# Конфигурация для каждого узла (пример для порта 7000)
# /etc/redis/cluster/7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
dir /var/lib/redis/cluster/7000

Создание кластера

# Запуск всех узлов
for port in {7000..7005}; do
redis-server /etc/redis/cluster/$port/redis.conf &
done

# Создание кластера
redis-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

# Проверка статуса кластера
redis-cli -c -p 7000 cluster info
redis-cli -c -p 7000 cluster nodes

Бэкап и восстановление

Скрипт автоматического бэкапа

#!/bin/bash
# redis-backup.sh

BACKUP_DIR="/var/backups/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_DATA_DIR="/var/lib/redis"
RETENTION_DAYS=7

# Создание директории для бэкапов
mkdir -p $BACKUP_DIR

# Создание снимка данных
redis-cli -a "your_password" BGSAVE

# Ожидание завершения сохранения
while [ $(redis-cli -a "your_password" LASTSAVE) -eq $(redis-cli -a "your_password" LASTSAVE) ]; do
sleep 1
done

# Копирование RDB файла
cp $REDIS_DATA_DIR/dump.rdb $BACKUP_DIR/redis_backup_$DATE.rdb

# Сжатие бэкапа
gzip $BACKUP_DIR/redis_backup_$DATE.rdb

# Удаление старых бэкапов
find $BACKUP_DIR -name "redis_backup_*.rdb.gz" -mtime +$RETENTION_DAYS -delete

echo "Бэкап Redis завершен: redis_backup_$DATE.rdb.gz"

Восстановление из бэкапа

#!/bin/bash
# redis-restore.sh

BACKUP_FILE=$1
REDIS_DATA_DIR="/var/lib/redis"

if [ -z "$BACKUP_FILE" ]; then
echo "Использование: $0 /path/to/backup.rdb.gz"
exit 1
fi

# Остановка Redis
sudo systemctl stop redis-server

# Восстановление из бэкапа
gunzip -c $BACKUP_FILE > $REDIS_DATA_DIR/dump.rdb
chown redis:redis $REDIS_DATA_DIR/dump.rdb

# Запуск Redis
sudo systemctl start redis-server

echo "Восстановление Redis завершено"

Настройка systemd сервиса

Создание systemd unit файла

# /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Активация сервиса

# Перезагрузка systemd
sudo systemctl daemon-reload

# Включение автозапуска
sudo systemctl enable redis

# Запуск сервиса
sudo systemctl start redis

# Проверка статуса
sudo systemctl status redis

Полезные команды Redis

Управление ключами

# Подключение к Redis
redis-cli -h localhost -p 6379 -a password

# Просмотр всех ключей (осторожно в production!)
KEYS *

# Поиск ключей по шаблону
KEYS user:*

# Получение информации о ключе
TYPE mykey
TTL mykey
PTTL mykey # В миллисекундах

# Установка времени жизни
EXPIRE mykey 3600 # 1 час
EXPIREAT mykey 1609459200 # Unix timestamp

# Удаление ключей
DEL key1 key2 key3
FLUSHDB # Очистка текущей БД
FLUSHALL # Очистка всех БД

Мониторинг и отладка

# Статистика
INFO all
INFO memory
INFO stats
INFO replication

# Мониторинг команд
MONITOR

# Анализ памяти
MEMORY USAGE mykey
MEMORY STATS

# Проверка подключений
CLIENT LIST
CLIENT KILL ip:port
Производительность

Настройте Redis с учетом вашей рабочей нагрузки. Для кэширования используйте LRU политику, для очередей - настройте персистентность.

Безопасность

Всегда устанавливайте пароль и ограничивайте сетевой доступ к Redis серверу. Переименуйте или отключите опасные команды.