Redis Sentinel: alta disponibilidade self-hosted
Redis Sentinel monitora instâncias do Redis e executa failover automático quando o primary fica offline — promovendo uma replica a primary sem intervenção manual. Para aplicações que não podem perder conexão com o Redis (sessões, filas), Sentinel é a solução self-hosted de alta disponibilidade.
Arquitetura: Primary + Replica + Sentinel
Como o Redis Sentinel funciona:
bash
# Arquitetura mínima de Sentinel (3 nós):
# ┌──────────────┐ replicação ┌──────────────┐
# │ Primary │ ──────────────→ │ Replica │
# │ :6379 │ │ :6380 │
# └──────────────┘ └──────────────┘
# ↑ ↑
# │ monitoramento │
# ┌───────┴────────────────────────────────┴───────┐
# │ Sentinel 1 Sentinel 2 Sentinel 3 │
# │ :26379 :26380 :26381 │
# └────────────────────────────────────────────────┘
# Com 3 Sentinels (quorum = 2):
# - Se o primary ficar offline e 2/3 Sentinels concordarem:
# → Um Sentinel é eleito líder
# → Escolhe a replica mais atualizada
# → Promove a replica a primary
# → Reconfigura outros Sentinels
# → Notifica os clientes (PUBLISH __sentinel__:hello)
# Para VPS única: rodar primary, replica e 3 Sentinels localmente
# Para alta disponibilidade real: primary e replica em VPS diferentesConfigurar Primary e Replica
Configuração do Redis em modo primary-replica:
bash
# redis-primary.conf:
port 6379
bind 127.0.0.1
requirepass SUA_SENHA_REDIS
masterauth SUA_SENHA_REDIS # senha para autenticação entre instâncias
# Persistência:
appendonly yes
appendfsync everysec
save 3600 1
# redis-replica.conf:
port 6380
bind 127.0.0.1
requirepass SUA_SENHA_REDIS
masterauth SUA_SENHA_REDIS
# Apontar para o primary:
replicaof 127.0.0.1 6379
# Replica é somente leitura por padrão:
replica-read-only yes
# Iniciar as instâncias:
redis-server /etc/redis/redis-primary.conf --daemonize yes
redis-server /etc/redis/redis-replica.conf --daemonize yes
# Verificar replicação:
redis-cli -p 6379 -a SUA_SENHA_REDIS INFO replication
# role:master
# connected_slaves:1
# slave0:ip=127.0.0.1,port=6380,state=online,offset=1234,lag=0Configurar Sentinels
Três instâncias Sentinel para atingir o quorum:
bash
# sentinel-1.conf (repetir para sentinel-2.conf e sentinel-3.conf com portas 26380, 26381):
port 26379
daemonize yes
logfile /var/log/redis/sentinel-1.log
# Monitorar o primary (nome, IP, porta, quorum):
sentinel monitor mymaster 127.0.0.1 6379 2
# Autenticação:
sentinel auth-pass mymaster SUA_SENHA_REDIS
# Quanto tempo até considerar o primary offline (ms):
sentinel down-after-milliseconds mymaster 5000
# Timeout do failover:
sentinel failover-timeout mymaster 60000
# Quantas replicas sincronizam simultaneamente durante failover:
sentinel parallel-syncs mymaster 1
# Iniciar os 3 Sentinels:
redis-sentinel /etc/redis/sentinel-1.conf
redis-sentinel /etc/redis/sentinel-2.conf
redis-sentinel /etc/redis/sentinel-3.conf
# Verificar status do Sentinel:
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL slaves mymaster
redis-cli -p 26379 SENTINEL sentinels mymaster
# Simular falha do primary:
redis-cli -p 6379 -a SUA_SENHA_REDIS DEBUG SLEEP 10
# Após ~5s: Sentinel promove a replica automaticamenteIntegrar Node.js com Redis Sentinel
Configurar ioredis para conectar via Sentinel:
typescript
// npm install ioredis
import Redis from 'ioredis'
// Conectar via Sentinel — ioredis descobre o primary automaticamente:
const redis = new Redis({
sentinels: [
{ host: '127.0.0.1', port: 26379 },
{ host: '127.0.0.1', port: 26380 },
{ host: '127.0.0.1', port: 26381 },
],
name: 'mymaster', // nome configurado no sentinel.conf
password: process.env.REDIS_PASSWORD,
sentinelPassword: process.env.REDIS_PASSWORD,
// Reconectar automaticamente após failover:
maxRetriesPerRequest: 3,
enableReadyCheck: true,
lazyConnect: false,
// Timeout agressivo para detectar failover rápido:
connectTimeout: 2000,
commandTimeout: 3000,
})
// Evento de failover:
redis.on('error', (err) => console.error('Redis error:', err))
redis.on('reconnecting', (ms) => console.log('Redis reconectando em', ms, 'ms'))
// O cliente reconecta automaticamente ao novo primary após failover
// A janela de indisponibilidade é ~10-15s (tempo do Sentinel eleger o líder)
// Usar normalmente:
await redis.set('sessao:123', JSON.stringify(dados), 'EX', 3600)
const sessao = await redis.get('sessao:123')Docker Compose com Redis Sentinel
Stack completa containerizada com primary, replica e Sentinels:
yaml
# docker-compose.yml — Redis HA com Sentinel:
services:
redis-primary:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASSWORD} --masterauth ${REDIS_PASSWORD} --appendonly yes
ports:
- "127.0.0.1:6379:6379"
volumes:
- redis_primary:/data
redis-replica:
image: redis:7-alpine
command: >
redis-server
--requirepass ${REDIS_PASSWORD}
--masterauth ${REDIS_PASSWORD}
--replicaof redis-primary 6379
--replica-read-only yes
ports:
- "127.0.0.1:6380:6379"
depends_on:
- redis-primary
sentinel-1: &sentinel
image: redis:7-alpine
command: >
sh -c "echo 'sentinel monitor mymaster redis-primary 6379 2
sentinel auth-pass mymaster ${REDIS_PASSWORD}
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1' > /tmp/sentinel.conf
&& redis-sentinel /tmp/sentinel.conf"
depends_on:
- redis-primary
- redis-replica
sentinel-2:
<<: *sentinel
sentinel-3:
<<: *sentinel
volumes:
redis_primary:$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.