В контексте Redis, Sentinel — это система наблюдения и автоматического переключения Redis на резервный сервер при отказе основного.
Проще говоря, Sentinel отвечает не за хранение данных, а за то, чтобы Redis-кластер типа master + replicas продолжал работать, если master умер.
Sentinel выполняет четыре основные функции.
1. Следит за Redis-серверами
Sentinel регулярно проверяет:
- доступен ли master;
- доступны ли replicas;
- доступны ли другие Sentinel-инстансы.
Упрощённо:
Sentinel → PING → Redis master
Sentinel → PING → Redis replica
Если Redis перестаёт отвечать, Sentinel начинает считать его подозрительным.
2. Определяет, действительно ли master упал
Здесь есть два состояния.
SDOWN: Subjectively Down
Один Sentinel решил:
Я не могу достучаться до master.
Это ещё не означает, что master действительно признан мёртвым всей системой. Возможно, проблема только у этого Sentinel или в сетевом соединении между ними.
ODOWN: Objectively Down
Несколько Sentinel-инстансов согласились:
Да, master действительно недоступен.
Для этого используется параметр quorum.
Например:
quorum = 2
Это означает, что минимум два Sentinel должны признать master недоступным.
3. Выполняет failover
Если master признан недоступным, Sentinel:
- выбирает одну из replicas;
- повышает её до нового master;
- перенастраивает остальные replicas на новый master;
- сообщает клиентам, где теперь находится master.
Было:
Redis A — master
Redis B — replica
Redis C — replica
Redis A упал.
Стало:
Redis A — недоступен
Redis B — новый master
Redis C — replica Redis B
Если Redis A потом вернётся, он обычно будет подключён уже как replica нового master.
4. Сообщает клиентам адрес текущего master
Клиент не должен жёстко подключаться к конкретному Redis-серверу:
redis-a:6379
Вместо этого клиент знает адреса Sentinel и имя master-группы:
Sentinel 1
Sentinel 2
Sentinel 3
master name: mymaster
Клиент спрашивает у Sentinel:
Где сейчас master для
mymaster?
Sentinel возвращает актуальный адрес.
Это важно, потому что после failover адрес master меняется.
Типичная схема
┌─────────────────┐
│ Client │
└────────┬────────┘
│
спрашивает адрес master
│
┌──────────────────┼──────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Sentinel 1 │ │ Sentinel 2 │ │ Sentinel 3 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└──────────────────┼──────────────────┘
│ наблюдение
┌────────▼────────┐
│ Redis master A │
└───────┬─────────┘
│ replication
┌──────────┴──────────┐
│ │
┌────────▼────────┐ ┌────────▼────────┐
│ Redis replica B │ │ Redis replica C │
└─────────────────┘ └─────────────────┘
Обычно используют не менее трёх Sentinel-инстансов, чтобы решение об отказе принималось большинством, а не одним наблюдателем.
Sentinel не хранит данные
Это ключевое различение.
Redis master / replica → хранят данные
Sentinel → следит и управляет переключением
Sentinel не является:
- отдельным хранилищем;
- прокси для всех Redis-запросов;
- заменой replication;
- заменой Redis Cluster.
Sentinel и replication
Обычная Redis replication сама по себе выглядит так:
master → replica
Если master упал, replica не становится master автоматически. Кто-то должен:
- обнаружить отказ;
- выбрать replica;
- повысить её;
- перенастроить систему.
Именно это делает Sentinel.
То есть:
Replication = создание копий данных
Sentinel = обнаружение отказа и автоматический failover
Sentinel и Redis Cluster
Это разные архитектуры.
Sentinel
Используется схема:
один master + replicas
Все данные находятся на одном master. Реплики содержат копии этих же данных.
Sentinel обеспечивает высокую доступность, но не распределяет данные по нескольким master.
Redis Cluster
Данные разделены между несколькими master по hash slots:
Master A → часть ключей
Master B → часть ключей
Master C → часть ключей
Redis Cluster решает сразу две задачи:
- sharding;
- high availability.
Sentinel в первую очередь решает только high availability.
Что Sentinel не гарантирует
Sentinel не превращает Redis в систему со строгой гарантией отсутствия потерь.
Redis replication обычно асинхронная.
Возможна ситуация:
- клиент записал значение в master;
- master подтвердил запись;
- master упал до передачи записи replica;
- replica стала новым master;
- подтверждённой записи на новом master нет.
То есть автоматический failover возможен, но небольшое окно потери последних записей остаётся.
Минимальный конфиг Sentinel
Пример sentinel.conf:
port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
Главная строка:
sentinel monitor mymaster redis-master 6379 2
Она означает:
mymaster → логическое имя master-группы
redis-master → hostname master
6379 → порт Redis
2 → quorum
Sentinel обычно запускается на порту:
26379
В одной формуле
Redis Sentinel =
мониторинг Redis
+ согласованное обнаружение отказа
+ выбор новой replica
+ автоматический failover
+ обнаружение клиентами нового master
То есть Sentinel — это диспетчер аварийного переключения для Redis replication. Он не перевозит данные сам, а следит, кто сейчас является главным, и меняет главного, когда прежний исчезает.