Skip to content

Repository files navigation

Redis Sentinel + HAProxy - Alta Disponibilidade

Sistema de alta disponibilidade para Redis usando Sentinel para detecção automática de falhas e promoção de master, com HAProxy para roteamento inteligente de conexões.

🎯 Características

  • Alta Disponibilidade: Failover automático em caso de falha do master
  • Detecção Automática: Sentinel monitora e detecta falhas em ~5 segundos
  • Roteamento Inteligente: HAProxy roteia apenas para o master atual
  • Replicação Automática: Dados replicados em tempo real para todas as réplicas
  • Recuperação Automática: Nós se reconectam e sincronizam automaticamente
  • Zero Downtime: Failover completo em ~8-10 segundos
  • Testado e Validado: Suíte completa de testes automatizados

📐 Arquitetura

┌─────────────┐
│   Cliente   │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│   HAProxy   │  (porta 6379)
│  (TCP Check)│  - Health check via comando ROLE
└──────┬──────┘  - Roteia apenas para master
       │
       ├──────────┬──────────┬──────────┐
       ▼          ▼          ▼          ▼
   ┌───────┐  ┌───────┐  ┌───────┐
   │Redis-1│  │Redis-2│  │Redis-3│
   │(6379) │  │(6379) │  │(6379) │
   └───┬───┘  └───┬───┘  └───┬───┘
       │          │          │
   ┌───┴──────────┴──────────┴───┐
   │   Sentinel Cluster          │
   │ (sentinel-1, 2, 3)          │
   │   (monitora: mymaster)      │
   │   (quorum: 2)               │
   └─────────────────────────────┘

Componentes

  • 3x Redis: 1 master + 2 réplicas
  • 3x Sentinel: Quorum de 2 para decisões de failover
  • 1x HAProxy: Load balancer com health check inteligente

🚀 Como Usar

Pré-requisitos

  • Docker
  • Docker Compose

Iniciar o Cluster

docker compose up -d

Aguarde ~10 segundos para o cluster estabilizar.

Verificar Status

# Ver containers rodando
docker compose ps

# Ver qual Redis é o master
docker exec sentinel-1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

# Ver HAProxy stats (quem está UP)
curl http://localhost:8404/stats
# Ou abra no navegador: http://localhost:8404/stats

Conectar ao Redis

# Conectar através do HAProxy (sempre roteia para o master)
docker exec redis-1 redis-cli -h haproxy -p 6379

# Exemplo: escrever e ler
docker exec redis-1 redis-cli -h haproxy -p 6379 SET chave "valor"
docker exec redis-1 redis-cli -h haproxy -p 6379 GET chave

Parar o Cluster

docker compose down

Limpar Dados

docker compose down -v

🧪 Testes

Executar Testes Automatizados

cd tests
./run-all-tests.sh

Testes Disponíveis

Teste Descrição Duração
Teste 01 Validação inicial do cluster ~5s
Teste 02 Failover do master ~15s
Teste 03 Operação com 1 nó ~10s
Teste 04 Recuperação completa ~25s

Veja documentação completa dos testes.

Resultados dos Testes

Todos os testes PASSARAM

  • ✅ Detecção automática de falhas
  • ✅ Promoção automática de novo master
  • ✅ Roteamento automático do HAProxy
  • ✅ Replicação funcionando
  • ✅ Recuperação automática
  • ✅ Persistência de dados 100%

⚙️ Configuração

Redis

Arquivos: redis/redis-*.conf

bind 0.0.0.0
port 6379
protected-mode no          # Permite conexões externas
appendonly yes             # Persistência AOF
repl-diskless-sync yes     # Replicação sem disco

Sentinel

Arquivos: sentinel/sentinel-*.conf

sentinel monitor mymaster redis-1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1

Configuração importante:

  • down-after-milliseconds: 5000ms (5s) - tempo para detectar falha
  • quorum: 2 - necessário 2 de 3 Sentinels para promover master
  • failover-timeout: 15000ms (15s) - timeout máximo para failover

HAProxy

Arquivo: haproxy/haproxy.cfg

backend redis_master
  mode tcp
  option tcp-check
  
  tcp-check connect
  tcp-check send-binary 2a310d0a24340d0a524f4c450d0a  # Comando ROLE em RESP
  tcp-check expect rstring master                     # Espera "master" na resposta
  
  default-server inter 1s fall 2 rise 1
  
  server redis1 redis-1:6379 check
  server redis2 redis-2:6379 check
  server redis3 redis-3:6379 check

Health Check Inteligente:

  • Envia comando ROLE em formato RESP
  • Verifica se a resposta contém "master"
  • Apenas o master passa no health check
  • Verifica a cada 1 segundo

📊 Monitoramento

HAProxy Stats

Acesse: http://localhost:8404/stats

Mostra:

  • Quais servidores estão UP/DOWN
  • Número de conexões ativas
  • Health check status
  • Estatísticas de tráfego

Logs

# Logs do Sentinel (ver failovers)
docker logs sentinel-1 --tail=50

# Logs do HAProxy (ver health checks)
docker logs haproxy --tail=50

# Logs do Redis
docker logs redis-1 --tail=50

Comandos Úteis

# Ver role de cada Redis
docker exec redis-1 redis-cli ROLE | head -1
docker exec redis-2 redis-cli ROLE | head -1
docker exec redis-3 redis-cli ROLE | head -1

# Ver info de replicação do master
docker exec redis-1 redis-cli INFO replication

# Ver info do Sentinel sobre o master
docker exec sentinel-1 redis-cli -p 26379 SENTINEL master mymaster

# Ver todas as réplicas conhecidas pelo Sentinel
docker exec sentinel-1 redis-cli -p 26379 SENTINEL replicas mymaster

🔄 Fluxo de Failover

O que acontece quando o master cai:

  1. T+0s: Master falha (ex: redis-1)
  2. T+5s: Sentinels detectam falha (down-after-milliseconds)
  3. T+6s: Sentinels votam (quorum de 2/3)
  4. T+7s: Sentinel promove nova réplica (ex: redis-3) a master
  5. T+8s: Réplica restante (ex: redis-2) se reconecta ao novo master
  6. T+9s: HAProxy detecta novo master via health check
  7. T+10s: Sistema totalmente operacional

Downtime percebido: ~8-10 segundos

Recuperação Automática

Quando o nó original volta:

  1. Nó se conecta ao Sentinel
  2. Sentinel informa quem é o master atual
  3. Nó se configura como réplica do master atual
  4. Sincronização inicial de dados
  5. Replicação contínua estabelecida

Tempo de recuperação: ~15-20 segundos

🛡️ Produção

Recomendações

Fazer:

  • Sempre rodar 3 ou mais Sentinels (número ímpar)
  • Configurar quorum como (N/2) + 1 onde N = número de Sentinels
  • Monitorar health checks do HAProxy
  • Configurar alertas para failovers
  • Fazer backup regular dos dados
  • Testar failover em ambiente de staging

Evitar:

  • Rodar apenas 2 Sentinels (não há consenso)
  • Colocar todos os componentes no mesmo host
  • Desabilitar AOF (persistência)
  • Aumentar muito down-after-milliseconds (detecção lenta)

Segurança

Para produção, adicione:

# Redis
requirepass seu_password_forte
masterauth seu_password_forte

# Sentinel
sentinel auth-pass mymaster seu_password_forte

E configure o HAProxy para enviar comando AUTH antes do ROLE.

📁 Estrutura do Projeto

.
├── README.md                    # Este arquivo
├── TESTING.md                   # Documentação de testes
├── docker-compose.yml           # Definição dos containers
├── haproxy/
│   └── haproxy.cfg             # Configuração do HAProxy
├── redis/
│   ├── redis-master.conf       # Config do Redis master
│   ├── redis-replica-2.conf    # Config da réplica 2
│   └── redis-replica-3.conf    # Config da réplica 3
├── sentinel/
│   ├── sentinel-1.conf         # Config do Sentinel 1
│   ├── sentinel-2.conf         # Config do Sentinel 2
│   └── sentinel-3.conf         # Config do Sentinel 3
└── tests/
    ├── README.md               # Documentação dos testes
    ├── run-all-tests.sh        # Script para executar todos os testes
    ├── TEST-01-*.md            # Teste 01
    ├── TEST-02-*.md            # Teste 02
    ├── TEST-03-*.md            # Teste 03
    ├── TEST-04-*.md            # Teste 04
    └── results/                # Logs das execuções

📚 Documentação

🤝 Contribuindo

Este é um projeto de referência para alta disponibilidade com Redis. Sinta-se livre para:

  • Reportar issues
  • Sugerir melhorias
  • Adicionar novos testes
  • Compartilhar sua experiência

📝 Changelog

v1.0.0 - 2026-02-15

  • ✅ Configuração inicial do cluster Redis + Sentinel + HAProxy
  • ✅ Health check inteligente no HAProxy (comando ROLE)
  • ✅ Suíte completa de testes automatizados
  • ✅ Documentação completa
  • ✅ Todos os testes passando

📄 Licença

MIT License - veja o arquivo LICENSE para detalhes.


Desenvolvido e testado em: 2026-02-15
Status: ✅ Produção-ready
Testes: ✅ 100% passando

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages