Налаштування Redis Sentinel для високої доступності
Redis Sentinel — система мониторингу та автоматичного failover для одиничного інстансу Redis. На відміну від Cluster, Sentinel не шардує дані — весь набір даних на одному master'і з репліками. Sentinel стежить за станом master'а та при його падінні автоматично підвищує реплику до нового master'а і сповіщає клієнтів про зміну адреси.
Sentinel підходить, коли обсяг даних помещається у RAM одного сервера, але потрібна автоматична відказоустійчивість без ручного втручання.
Архітектура
Мінімальна конфігурація: 1 master + 2 реплики + 3 інстансу Sentinel. Три Sentinel потрібні для кворума: при втраті зв'язку з master'ом Sentinels голосують за failover, потрібна більшість (quorum ≥ 2). Якщо Sentinels менше трьох, можливий split-brain.
Sentinel можна запустити на тих же серверах, що й Redis — окремих машин не потребує.
Сервер 1: Redis Master (6379) + Sentinel (26379)
Сервер 2: Redis Replica 1 (6379) + Sentinel (26379)
Сервер 3: Redis Replica 2 (6379) + Sentinel (26379)
Налаштування Master'а та Реплік
Master /etc/redis/redis.conf (сервер 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 (сервер 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 — реплики приймають тільки читання. Запис через master.
Налаштування Sentinel
/etc/redis/sentinel.conf на кожному сервері (змінюється тільки sentinel announce-ip):
port 26379
daemonize yes
logfile /var/log/redis/sentinel.log
# Ім'я master'а, IP, порт, quorum
sentinel monitor mymaster 192.168.1.10 6379 2
# Пароль для підключення до Redis
sentinel auth-pass mymaster RedisPassword123
# Через скільки ms без відповіді master вважається недоступним
sentinel down-after-milliseconds mymaster 5000
# Паралельне переключення реплік на новий master
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 щоб вирішити що master недоступен. При down-after-milliseconds 5000 — failover почнеться через 5–15 секунд після падіння master'а.
Запуск Sentinel:
redis-sentinel /etc/redis/sentinel.conf
# або
redis-server /etc/redis/sentinel.conf --sentinel
Перевірка стану
# Підключитися до Sentinel
redis-cli -p 26379
# Інформація про master'а
SENTINEL masters
SENTINEL master mymaster
# Список реплік
SENTINEL replicas mymaster
# Список Sentinel'ів
SENTINEL sentinels mymaster
# Вручну ініціювати failover (для тесту)
SENTINEL failover mymaster
Після SENTINEL failover mymaster — Sentinel підвищить одну з реплік до master'а та оновить конфіги. Старий master (якщо живий) стане репліцею нового master'а.
Підключення додатків через Sentinel
Клієнти не підключаються напрямки до master'а — вони підключаються до Sentinel, запитують поточну адресу master'а та вже до нього відкривають з'єднання. При failover Sentinel сповіщає клієнтів про новий master.
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
Тест перед продакшеном:
# На сервері з master'ом — зупинити Redis
systemctl stop redis
# Спостерігати в логах Sentinel
tail -f /var/log/redis/sentinel.log
# Через 5–15 секунд — одна з реплік стала master'ом
redis-cli -p 26379 SENTINEL master mymaster
# ip поле покаже новий master
# Запустити старий master назад — він стане репліцею
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 робочих дня.







