Настройка Redis Sentinel для высокой доступности
Redis Sentinel — система мониторинга и автоматического failover для одиночного инстанса Redis. В отличие от Cluster, Sentinel не шардирует данные — весь набор данных на одном мастере с репликами. Sentinel отслеживает состояние мастера и при его падении автоматически повышает реплику до нового мастера и уведомляет клиентов о смене адреса.
Sentinel подходит, когда объём данных помещается в RAM одного сервера, но нужна автоматическая отказоустойчивость без ручного вмешательства.
Архитектура
Минимальная конфигурация: 1 мастер + 2 реплики + 3 инстанса Sentinel. Три Sentinel нужны для кворума: при потере связи с мастером Sentinels голосуют за failover, нужно большинство (quorum ≥ 2). Если Sentinels меньше трёх, возможен split-brain.
Sentinel можно запустить на тех же серверах, что и Redis — отдельных машин не требует.
Server 1: Redis Master (6379) + Sentinel (26379)
Server 2: Redis Replica 1 (6379) + Sentinel (26379)
Server 3: Redis Replica 2 (6379) + Sentinel (26379)
Настройка Mастера и Реплик
Master /etc/redis/redis.conf (server 1):
bind 0.0.0.0
port 6379
requirepass RedisPassword123
masterauth RedisPassword123
maxmemory 4gb
maxmemory-policy volatile-lru
appendonly yes
appendfsync everysec
protected-mode no
Replica /etc/redis/redis.conf (server 2, 3):
bind 0.0.0.0
port 6379
requirepass RedisPassword123
masterauth RedisPassword123
replicaof 192.168.1.10 6379
replica-read-only yes
replica-lazy-flush no
appendonly yes
appendfsync everysec
protected-mode no
replica-read-only yes — реплики принимают только чтение. Запись через мастер.
Настройка Sentinel
/etc/redis/sentinel.conf на каждом сервере (меняется только sentinel announce-ip):
port 26379
daemonize yes
logfile /var/log/redis/sentinel.log
# Имя мастера, IP, порт, quorum
sentinel monitor mymaster 192.168.1.10 6379 2
# Пароль для подключения к Redis
sentinel auth-pass mymaster RedisPassword123
# Через сколько мс без ответа мастер считается недоступным
sentinel down-after-milliseconds mymaster 5000
# Параллельное переключение реплик на новый мастер
sentinel parallel-syncs mymaster 1
# Таймаут failover
sentinel failover-timeout mymaster 60000
# Уведомление при failover
sentinel notification-script mymaster /opt/redis/notify.sh
# Объявить свой IP (важно при NAT/Docker)
sentinel announce-ip 192.168.1.10
sentinel announce-port 26379
quorum 2 — нужно 2 из 3 Sentinels чтобы решить что мастер недоступен. При down-after-milliseconds 5000 — failover начнётся через 5–15 секунд после падения мастера.
Запуск Sentinel:
redis-sentinel /etc/redis/sentinel.conf
# или
redis-server /etc/redis/sentinel.conf --sentinel
Проверка состояния
# Подключиться к Sentinel
redis-cli -p 26379
# Информация о мастере
SENTINEL masters
SENTINEL master mymaster
# Список реплик
SENTINEL replicas mymaster
# Список Sentinel'ов
SENTINEL sentinels mymaster
# Вручную инициировать failover (для теста)
SENTINEL failover mymaster
После SENTINEL failover mymaster — Sentinel повысит одну из реплик до мастера и обновит конфиги. Старый мастер (если живой) станет репликой нового мастера.
Подключение приложений через Sentinel
Клиенты не подключаются напрямую к мастеру — они подключаются к Sentinel, спрашивают текущий адрес мастера и уже к нему открывают соединение. При failover Sentinel уведомляет клиентов о новом мастере.
PHP phpredis:
$sentinel = new RedisSentinel(
host: '192.168.1.10',
port: 26379,
timeout: 2.5,
persistent: null,
retryInterval: 100,
readTimeout: 2.5,
auth: 'RedisPassword123'
);
$masterInfo = $sentinel->master('mymaster');
// ['name' => 'mymaster', 'ip' => '192.168.1.11', 'port' => '6379', ...]
Predis с поддержкой Sentinel:
use Predis\Client;
$client = new Client(
[
'tcp://192.168.1.10:26379',
'tcp://192.168.1.11:26379',
'tcp://192.168.1.12:26379',
],
[
'replication' => 'sentinel',
'service' => 'mymaster',
'parameters' => [
'password' => 'RedisPassword123',
],
]
);
Laravel config/database.php с Sentinel:
'redis' => [
'client' => 'predis',
'options' => [
'replication' => 'sentinel',
'service' => env('REDIS_SENTINEL_SERVICE', 'mymaster'),
'parameters' => [
'password' => env('REDIS_PASSWORD'),
'database' => 0,
],
],
'default' => [
['host' => '192.168.1.10', 'port' => 26379],
['host' => '192.168.1.11', 'port' => 26379],
['host' => '192.168.1.12', 'port' => 26379],
],
],
Скрипт уведомления при failover
/opt/redis/notify.sh:
#!/bin/bash
EVENT_TYPE=$1
EVENT_NAME=$2
EVENT_DESCRIPTION=$3
TELEGRAM_BOT_TOKEN="your_token"
TELEGRAM_CHAT_ID="your_chat_id"
MESSAGE="Redis Sentinel Event: $EVENT_TYPE
Service: $EVENT_NAME
Details: $EVENT_DESCRIPTION
Time: $(date)"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${TELEGRAM_CHAT_ID}" \
-d "text=${MESSAGE}"
chmod +x /opt/redis/notify.sh
Симуляция failover
Тест перед продакшеном:
# На сервере с мастером — остановить Redis
systemctl stop redis
# Наблюдать в логах Sentinel
tail -f /var/log/redis/sentinel.log
# Через 5–15 секунд — один из реплик стал мастером
redis-cli -p 26379 SENTINEL master mymaster
# ip field покажет новый мастер
# Запустить старый мастер обратно — он станет репликой
systemctl start redis
redis-cli -p 26379 SENTINEL replicas mymaster
Sentinel vs. Cluster
Sentinel — для наборов данных, умещающихся на одном сервере. Автоматический failover, read-scaling через реплики, простая настройка. Нет горизонтального масштабирования записи.
Cluster — для объёмов данных > RAM одного сервера, горизонтальное масштабирование записи. Сложнее в настройке, ограничения на multi-key операции.
Сроки
Настройка Sentinel с 3 серверами, тестирование автоматического failover, настройка клиентов и уведомлений — 1–2 рабочих дня.







