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 серверу. Переименуйте или отключите опасные команды.