Operações distribuídas e concorrência

Boas práticas em ambientes de produção

Checklist completo para operar cache em produção — segurança, monitoramento, backup, disaster recovery, runbooks e cultura de game days.

Avançado 35 min 30 pontos Leitura 0%

Nesta aula você vai

  • Aplicar checklist de segurança e hardening para Redis em produção
  • Configurar monitoramento, alertas e observabilidade com métricas essenciais
  • Elaborar planos de backup, disaster recovery e runbooks operacionais

Boas práticas em ambientes de produção

Objetivos

Nesta aula você vai:

  • Aplicar hardening de segurança para Redis em produção
  • Configurar monitoramento, alertas e observabilidade
  • Elaborar planos de backup, disaster recovery e runbooks

Conteúdo

O epílogo operacional

Chegamos ao capítulo final do módulo — aquele em que os personagens (dados, cache, replicas) precisam sobreviver não apenas à história feliz do deploy, mas às segundas-feiras de tráfego real, às madrugadas de incidente e às auditorias de segurança. Operar cache em produção é a diferença entre um sistema que funciona no demo e um que funciona por anos.

Segurança: hardening essencial

Autenticação e rede

# Senha obrigatória
redis-cli CONFIG SET requirepass "senha-forte-com-32-chars-minimo"

# Renomear comandos perigosos
redis-cli CONFIG SET rename-command FLUSHALL ""
redis-cli CONFIG SET rename-command FLUSHDB ""
redis-cli CONFIG SET rename-command CONFIG "CONFIG-a8b3c9d2"
redis-cli CONFIG SET rename-command DEBUG ""
redis-cli CONFIG SET rename-command KEYS ""

# Bind apenas em interfaces necessárias
# redis.conf: bind 10.0.1.5 (não 0.0.0.0)
Risco Mitigação
Redis exposto na internet Firewall + bind em IP privado + VPN
Sem autenticação requirepass ou ACL
Comandos destrutivos rename-command para desabilitar
Acesso não autorizado Redis ACL (6.0+) com usuários granulares

ACL (Redis 6.0+)

# Criar usuário com permissões limitadas
redis-cli ACL SETUSER app-readonly on >senha-app ~cache:* +get +mget +hgetall -@all
redis-cli ACL SETUSER app-writer on >senha-app ~cache:* +get +set +del +hset +expire -@all

# Listar usuários
redis-cli ACL LIST

# Verificar permissões
redis-cli ACL GETUSER app-readonly

TLS

# redis.conf — criptografia em trânsito
tls-port 6379
port 0                    # Desabilitar porta não-TLS
tls-cert-file /path/to/cert.pem
tls-key-file /path/to/key.pem
tls-ca-cert-file /path/to/ca.pem

Monitoramento e alertas

Métricas essenciais

Métrica Alerta Severidade
used_memory / maxmemory > 85% Warning
used_memory / maxmemory > 95% Critical
mem_fragmentation_ratio > 1.5 Warning
connected_clients > 80% de maxclients Warning
rejected_connections > 0 Critical
evicted_keys (rate) > 0 sustentado Warning
master_link_status != "up" Critical
Replication lag > 1s Warning
latest_fork_usec > 100ms Warning
Slowlog entries > 10/min Warning
# Coleta manual para diagnóstico
redis-cli INFO memory
redis-cli INFO stats
redis-cli INFO replication
redis-cli INFO clients
redis-cli SLOWLOG GET 10
redis-cli LATENCY DOCTOR

Prometheus + Grafana

# redis_exporter expõe métricas em :9121/metrics
# Queries Grafana essenciais:

# Memória
redis_memory_used_bytes / redis_memory_max_bytes

# Ops por segundo
rate(redis_commands_processed_total[1m])

# Latência P99 (se instrumentado)
histogram_quantile(0.99, rate(redis_commands_duration_seconds_bucket[5m]))

# Eviction rate
rate(redis_evicted_keys_total[5m])

# Replication lag
redis_master_repl_offset - redis_slave_repl_offset

Backup e disaster recovery

Estratégia RDB + AOF

# RDB: snapshot periódico
# redis.conf
save 900 1       # 1 mudança em 15 min
save 300 10      # 10 mudanças em 5 min
save 60 10000    # 10000 mudanças em 1 min

# AOF: log de cada escrita
appendonly yes
appendfsync everysec    # Balanceado (perda máxima: 1s)

# Backup manual
redis-cli BGSAVE
redis-cli LASTSAVE
# Copiar dump.rdb para storage seguro (S3, GCS)
Estratégia RPO (perda máxima) RTO (tempo de recuperação)
RDB apenas (save 60) Até 60s de dados 5–15 min (carga do RDB)
AOF everysec ~1s 5–30 min (replay AOF)
AOF always 0 30–60 min (mais lento)
Replica + RDB ~0 (failover) 10–30s (Sentinel)

Procedimento de restore

# 1. Parar Redis
systemctl stop redis

# 2. Restaurar arquivo
cp /backup/dump.rdb /var/lib/redis/dump.rdb
# ou: cp /backup/appendonly.aof /var/lib/redis/appendonly.aof

# 3. Verificar permissões
chown redis:redis /var/lib/redis/dump.rdb

# 4. Iniciar e validar
systemctl start redis
redis-cli PING
redis-cli DBSIZE
redis-cli --scan --pattern "sessao:*" | wc -l

Runbooks operacionais

Runbook: memória acima de 90%

1. Verificar: redis-cli INFO memory
2. Identificar maiores chaves: redis-cli --bigkeys
3. Verificar eviction: redis-cli INFO stats | grep evicted
4. Ações imediatas:
   a. Aumentar maxmemory (se RAM disponível)
   b. Reduzir TTLs de cache não-crítico
   c. Remover chaves obsoletas (SCAN + DEL em lote)
5. Ações de médio prazo:
   a. Revisar política de eviction
   b. Avaliar sharding (Redis Cluster)
   c. Otimizar estruturas de dados (Hash vs JSON)

Runbook: failover com Sentinel

1. Detectar: alerta master_link_status=down
2. Verificar: redis-cli -p 26379 SENTINEL master mymaster
3. Sentinel promove replica automaticamente (10-30s)
4. Validar novo master:
   redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
5. Verificar aplicações reconectaram (logs de app)
6. Pós-incidente:
   a. Investigar causa do master original
   b. Reintegrar nó antigo como replica
   c. Documentar timeline no postmortem

Runbook: latência P99 degradada

1. redis-cli LATENCY DOCTOR
2. redis-cli SLOWLOG GET 20
3. Verificar:
   a. BGSAVE em andamento? (INFO persistence)
   b. Fragmentação alta? (mem_fragmentation_ratio)
   c. Hot key? (--hotkeys)
   d. Rede saturada? (iftop, ping entre nós)
4. Ações:
   a. Comando lento → otimizar ou proibir
   b. BGSAVE → agendar em janela de baixo tráfego
   c. Hot key → local cache ou sharding
   d. Fragmentação → activedefrag ou restart planejado

Configuração de produção recomendada

# redis.conf — produção essencial

# Memória
maxmemory 6gb
maxmemory-policy allkeys-lru

# Persistência
save 300 10
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite yes

# Replicação
min-replicas-to-write 1
min-replicas-max-lag 10
repl-backlog-size 256mb

# Segurança
requirepass "senha-forte"
rename-command FLUSHALL ""
rename-command KEYS ""

# Performance
tcp-keepalive 300
timeout 0
hz 10
dynamic-hz yes

# Defrag (Redis 4.0+)
activedefrag yes

# Slowlog
slowlog-log-slower-than 10000
slowlog-max-len 128

# Limites
maxclients 10000

Game days: testar antes do incidente

Exercício Frequência Objetivo
Failover Sentinel Trimestral Validar RTO real
Restore de backup Trimestral Validar RPO real
Simular OOM (maxmemory) Semestral Validar eviction
Kill de processo Redis Mensal Validar auto-restart
Carga de stress Pré-deploy Validar P99 sob carga
# Simular failover controlado
redis-cli -p 26379 SENTINEL failover mymaster
# Monitorar tempo de recuperação

# Simular kill
redis-cli DEBUG SEGFAULT  # NUNCA em produção!
# Em staging: kill -9 <pid> e medir recovery

Checklist de produção

Segurança:

  • Autenticação habilitada (requirepass ou ACL)
  • Comandos perigosos renomeados/desabilitados
  • Bind em IP privado (não 0.0.0.0 público)
  • TLS habilitado (se dados sensíveis)
  • Firewall restritivo

Disponibilidade:

  • Mínimo 1 replica + 3 Sentinels
  • min-replicas-to-write configurado
  • Clientes usam Sentinel-aware drivers
  • Failover testado (game day)

Performance:

  • maxmemory configurado (70-80% RAM)
  • Política de eviction alinhada ao domínio
  • Slowlog monitorado
  • P99 medido e com SLA definido

Dados:

  • Backup automatizado (RDB + AOF)
  • Restore testado
  • RPO e RTO documentados

Operação:

  • Runbooks escritos e acessíveis
  • Alertas configurados (Prometheus/Grafana)
  • On-call rotation definida
  • Postmortem template pronto

Resumo

  • Segurança: autenticação, ACL, desabilitar comandos perigosos, rede privada
  • Monitoramento: memória, eviction, replication lag, slowlog, P99
  • Backup: RDB + AOF com restore testado; Sentinel para HA
  • Game days regulares validam que runbooks funcionam antes do incidente real

Para refletir

"Produção não é o lugar onde se aprende — é o lugar onde se aplica o que já foi ensaiado."

Quantos itens do checklist de produção seu ambiente Redis atende hoje? Qual seria o primeiro a implementar?