Configurando um Cluster Redis 7.4 de Alta Disponibilidade com Sentinel no Docker
Este guia detalha o processo de implantação de um cluster Redis 7.4 com alta disponibilidade, utilizando o mecanismo Sentinel, em um ambiente Docker. A arquitetura consiste em um servidor principal (master) e duas réplicas (slaves), distribuídos em três servidores Linux distintos, sem o uso do Docker Compose.
Preparações Essenciais
Requisitos de Servidor
- Três máquinas Linux (físicas ou virtuais).
- Instalação do Docker em cada servidor.
- Conectividade de rede entre os servidores.
- Liberação das seguintes portas:
- Redis:
6379 - Sentinel:
26379
- Redis:
Configuração da Rede Docker
Para permitir a comunicação entre os contêineres Redis e Sentinel, é necessário criar uma rede interna no Docker. Execute o comando abaixo em um dos servidores para criar a rede de ponte:
docker network create rede-redis-ha
Todos os contêineres do cluster serão conectados a esta rede rede-redis-ha.
Implantação do Cluster Redis (Mestre-Réplica)
1. Configuração do Nodo Principal
No primeiro servidor, inicie o contêiner do Redis principal:
docker run -d --name redis-principal --net rede-redis-ha \
-p 6379:6379 \
-v /opt/redis/dados_principal:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass minha_senha_secreta
Explicação dos parâmetros:
--net rede-redis-ha: Conecta o contêiner à rede Docker criada.-p 6379:6379: Mapeia a porta do contêiner para a porta do host.-v /opt/redis/dados_principal:/data: Garante a persistência dos dados do Redis em um volume local.--appendonly yes: Ativa a persistência AOF (Append Only File) para maior segurança dos dados.--requirepass minha_senha_secreta: Define a senha de acesso ao Redis.
2. Configuração dos Nodos de Réplica
Nos segundo e terceiro servidores, execute os comandos a seguir para iniciar os contêineres das réplicas:
# Servidor da primeira réplica
docker run -d --name redis-replica1 --net rede-redis-ha \
-p 6379:6379 \
-v /opt/redis/dados_replica1:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass minha_senha_secreta \
--slaveof redis-principal 6379 --masterauth minha_senha_secreta
# Servidor da segunda réplica
docker run -d --name redis-replica2 --net rede-redis-ha \
-p 6379:6379 \
-v /opt/redis/dados_replica2:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass minha_senha_secreta \
--slaveof redis-principal 6379 --masterauth minha_senha_secreta
É crucial notar que os contêineres das réplicas utilizam --slaveof redis-principal 6379 para se conectar ao nodo principal e --masterauth minha_senha_secreta para autenticação, usando a mesma senha definida no principal.
3. Verificação do Estado de Replicação
No servidor que hospeda o nodo principal, execute este comando para inspecionar o status da replicação:
docker exec -it redis-principal redis-cli -a minha_senha_secreta INFO replication
A saída esperada deve indicar role:master e listar as duas réplicas conectadas.
Implantação do Cluster Redis Sentinel
1. Criação do Arquivo de Configuração do Sentinel
Em cada um dos três servidores, crie um arquivo sentinel.conf com o seguinte conteúdo:
port 26379
sentinel monitor meucluster redis-principal 6379 2
sentinel auth-pass meucluster minha_senha_secreta
sentinel down-after-milliseconds meucluster 5000
sentinel parallel-syncs meucluster 1
sentinel failover-timeout meucluster 10000
Parâmetros importantes:
sentinel monitor meucluster redis-principal 6379 2: Instruções para o Sentinel monitorar o nodo principal chamadomeucluster, localizado emredis-principal:6379. Um mínimo de 2 Sentinels devem concordar sobre a inatividade do principal para iniciar um failover.sentinel auth-pass meucluster minha_senha_secreta: Senha para autenticação no Redis.sentinel down-after-milliseconds meucluster 5000: Define o tempo (em milissegundos) para que um nodo seja considerado offline se não responder.sentinel parallel-syncs meucluster 1: O número de réplicas que o Sentinel pode reconfigurar para sincronizar com o novo principal durante um failover.sentinel failover-timeout meucluster 10000: Tempo limite para o processo de failover.
2. Lançamento dos Contêineres Sentinel
Em cada servidor, inicie um contêiner Sentinel. Certifique-se de substituir /caminho/para/seu/sentinel.conf pelo caminho real do arquivo no seu host.
# No primeiro servidor
docker run -d --name redis-sentinel1 --net rede-redis-ha \
-p 26379:26379 \
-v /caminho/para/seu/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf
# No segundo servidor
docker run -d --name redis-sentinel2 --net rede-redis-ha \
-p 26379:26379 \
-v /caminho/para/seu/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf
# No terceiro servidor
docker run -d --name redis-sentinel3 --net rede-redis-ha \
-p 26379:26379 \
-v /caminho/para/seu/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf
3. Verificação do Status do Sentinel
Para confirmar o funcionamento do cluster Sentinel, execute o seguinte comando em qualquer um dos servidores:
docker exec -it redis-sentinel1 redis-cli -p 26379 INFO sentinel
A saída deve exibir informações sobre o principal monitorado e a contagem de nodos Sentinel ativos.
Testando a Recuperação Automática (Failover)
1. Simulação de Falha do Nodo Principal
Para testar o failover, pare o contêiner do Redis principal no seu servidor:
docker stop redis-principal
2. Observando o Failover
Após alguns segundos (aproximadamente 10-15), verifique os logs de um dos Santinels para observar a detecção da falha e o início do processo de failover:
docker logs redis-sentinel1
3. Identificação do Novo Principal
Para descobrir qual réplica foi promovida a principal, execute:
docker exec -it redis-sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name meucluster
O resultado será o IP e a porta de redis-replica1 ou redis-replica2.
4. Restauração do Nodo Original
Se desejar reativar o nodo principal original, basta iniciá-lo novamente:
docker start redis-principal
Após reiniciar, o nodo original será automaticamente reintegrado ao cluster como uma nova réplica.
Conexão de Aplicações ao Cluster
As aplicações devem se conectar ao cluster Redis via Sentinels, e não diretamente aos nodos Redis, para aproveitar a alta disponibilidade. Um exemplo em Python:
from redis.sentinel import Sentinel
# Lista de endereços IP e portas dos Sentinels
servidores_sentinel = [
('ip_sentinel_1', 26379),
('ip_sentinel_2', 26379),
('ip_sentinel_3', 26379)
]
# Inicializa o cliente Sentinel
cliente_sentinel = Sentinel(servidores_sentinel, socket_timeout=0.5, password='minha_senha_secreta')
# Obtém uma conexão com o nodo principal (escrita)
conexao_principal = cliente_sentinel.master_for('meucluster', socket_timeout=0.5, password='minha_senha_secreta')
# Obtém uma conexão com uma réplica (leitura)
conexao_replica = cliente_sentinel.slave_for('meucluster', socket_timeout=0.5, password='minha_senha_secreta')
# Exemplo de escrita de dados no principal
conexao_principal.set('produto:123', '{"nome": "Smart TV", "preco": 1500.00}')
# Exemplo de leitura de dados de uma réplica
dados_produto = conexao_replica.get('produto:123')
print(f"Dados do produto: {dados_produto.decode('utf-8')}")
Recomendações Importantes
- Unidade de Senhas: Todas as instâncias do Redis (principle e réplicas) e os Sentinels devem operar com a mesma senha de autenticação.
- Latência de Rede: Redes com baixa latência entre os servidores são cruciais para o desempenho do Sentinel na detecção de falhas e failover.
- Configuração de Persistência: Habilitar a persistência AOF (
--appendonly yes) é altamente recomendado para a segurança dos seus dados. - Gerenciamento de Recursos: Defina limites de memória e CPU para os contêineres Docker para evitar que o Redis consuma excessivamente os recursos do host.
- Monitoramento e Alertas: Implemente um sistema de monitoramento robusto para os nodos Redis e Sentinels. Isso permitirá a detecção proativa de anomalias e a resposta rápida a quaisquer problemas.