Workstation Logo
Produtos
Labs de IAAgentes OpenAIAgentes ClaudeGrok BotWorkstation CRM (WSL CRM)MarketingTodos os Produtos
Soluções IA
Estações de Trabalho IAAI SME PackagesIA PrivadaClusters GPUIA EdgeLaboratório IA EmpresarialIA por Indústria
Serviços
Modernização de plataformaEngenharia digitalFundações de dados e IAOperações autónomasConsultoria de IAAutomação DevOpsCibersegurançaDesenvolvimento de softwareConstrução de agentesConfiguração MLOps
Sobre Nós
ParceirosHistórias de Clientes
Artigos
Documentação
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
Blog
Contacte-nosLogin
Workstation

Estações de trabalho de IA, software multiagente de IA, infraestrutura de GPU e soluções de agentes inteligentes para empresas modernas.

Contacte-nos

Soluções de IA

Estações de Trabalho IAAI SME PackagesIA PrivadaClusters GPUIA EdgeLaboratório IA EmpresarialIA por Indústria

Produtos

Todos os ProdutosWSL CRM e ERPMarketingAgentes OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

Empresa

Sobre NósPor que WorkstationParceirosHistórias de ClientesPreçosContato

Recursos

ArtigosDocumentaçãoBlogPesquisarMapa do Site
Escritório Reino Unido
77-79 Marlowes, Hemel Hempstead HP1 1LFComo chegar: pegue a saída 20 da M25, Outer LondonN.º da empresa: 11641870Seg - Sex: 9:00 - 18:00 GMT
+44 7515 356 146
Escritório Bélgica
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683Seg - Sex: 9:00 - 18:00 CET
+32 492 45 67 46
Escritório Índia
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI. Todos os direitos reservados.

PrivacidadeCookiesTermos de ServiçoMapa do site

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

Alta disponibilidade Redis em produção: operadores Sentinel, Cluster e Kubernetes

Redis HA com Sentinel, modo cluster e operadores Kubernetes

Balinder Walia12 de abril de 202644 min read

Redis é a espinha dorsal da infraestrutura de aplicativos moderna. Ele serve como cache, armazenamento de sessão, corretor de mensagens, limitador de taxa, mecanismo de classificação e pipeline de análise em tempo real para milhões de aplicativos em todo o mundo. Uma única instância Redis pode lidar com centenas de milhares de operações por segundo com latência inferior a um milissegundo, mas uma única instância também é um ponto único de falha. Quando o Redis fica inativo, os aplicativos sofrem falhas em cascata: estouros de cache sobrecarregam os bancos de dados de back-end, sessões são perdidas, limitadores de taxa param de funcionar e recursos em tempo real ficam desativados. Criar uma implantação Redis altamente disponível não é opcional para sistemas de produção — é um requisito de engenharia.

Este guia é um aprofundamento abrangente e focado na produção sobre a alta disponibilidade do Redis. Abordaremos os fundamentos da replicação Redis (replicação assíncrona, o comando WAIT e ressincronização parcial), Redis Sentinel para failover automático e descoberta de serviço, Cluster Redis para escalonamento horizontal com distribuição de slot de hash, operadores Kubernetes (Spotahome, OpsTree e Redis Enterprise), estratégias de persistência (instantâneos RDB, AOF e persistência híbrida), implantações gerenciadas em nuvem no AWS ElastiCache, Cache Azure para Redis e GCP Memorystore, implantações bare metal k3s com Rancher e Longhorn, gerenciamento de memória e políticas de despejo, criptografia TLS e controle de acesso baseado em ACL, comportamento Pub/Sub e Streams em configurações HA, módulos Redis (RedisJSON, RediSearch, RedisTimeSeries) em HA, pooling de conexões e configuração de cliente para resiliência de failover, estratégias de backup e restauração, monitoramento com Redis INFO, exportador Prometheus e painéis Grafana, Dragonfly e KeyDB como alternativas compatíveis com Redis, ajuste de desempenho com pipeline, script Lua e otimização de memória, cenários de falha comuns e procedimentos de solução de problemas e planejamento de capacidade e estratégias de escalabilidade.

Fundamentos da replicação

Redis

A replicação

Redis é a base sobre a qual todas as arquiteturas de alta disponibilidade são construídas. Uma instância mestre Redis aceita gravações e as propaga de forma assíncrona para uma ou mais instâncias de réplica. As réplicas mantêm uma cópia quase em tempo real do conjunto de dados do mestre e atendem consultas de leitura, fornecendo redundância de dados e escalabilidade de leitura.

Ao contrário da replicação de streaming baseada em WAL da PostgreSQL, a Redis usa um protocolo de replicação baseado em comandos. Cada comando de gravação executado no mestre é serializado no fluxo de replicação e enviado para réplicas conectadas, que executam os mesmos comandos em seus conjuntos de dados locais. Essa abordagem é simples e eficiente, mas tem implicações importantes para a consistência — como a replicação é assíncrona por padrão, há sempre uma janela onde as gravações reconhecidas no mestre ainda não atingiram as réplicas.

Replicação assíncrona

e o comando WAIT

Por padrão, a replicação Redis é totalmente assíncrona. O mestre reconhece uma gravação ao cliente imediatamente após aplicá-la localmente, sem esperar por qualquer réplica para confirmar o recebimento. Isso fornece o máximo rendimento de gravação, mas introduz uma janela potencial de perda de dados – se o mestre travar antes que uma gravação alcance qualquer réplica, essa gravação será perdida.

O comandoWAITfornece uma primitiva de replicação síncrona. Depois de emitir uma gravação, o cliente pode chamarWAIT numreplicas timeoutpara bloquear até que o número especificado de réplicas tenha confirmado a gravação ou o tempo limite expire. Isso não torna o Redis totalmente síncrono – oWAITapenas garante que as réplicas receberam os dados, e não que eles foram persistidos no disco nas réplicas. No entanto, reduz significativamente a janela de perda de dados.

# Write a critical value and wait for 2 replicas to acknowledge
SET order:12345 '{"status":"confirmed","amount":599.99}'
WAIT 2 5000
# Returns the number of replicas that acknowledged within 5000ms
# Returns 0 if no replica acknowledged (timeout or no replicas connected)

UseWAITseletivamente para gravações críticas (transações financeiras, confirmações de pedidos), permitindo que gravações não críticas (atualizações de cache, atualizações de sessão) prossigam de forma assíncrona. A flexibilidade por comando evita a penalidade de latência da replicação síncrona completa.

Ressincronização Parcial (PSYNC)

Quando uma réplica se desconecta brevemente (blip de rede, reinicialização), ela não precisa de uma transferência completa do conjunto de dados para reingressar. A Redis mantém um backlog de replicação – um buffer circular de comandos de gravação recentes – no mestre. Quando a réplica se reconecta, ela envia seu deslocamento de replicação ao mestre. Se o deslocamento ainda estiver dentro do backlog, o mestre envia apenas os comandos faltantes (ressincronização parcial). Se o deslocamento estiver fora do backlog, uma ressincronização completa será acionada, o que envolve a geração e a transferência de um instantâneo RDB.

# redis.conf — Replication backlog configuration
repl-backlog-size 256mb          # Size of the replication backlog buffer
repl-backlog-ttl 3600            # Seconds to retain backlog after last replica disconnects
repl-diskless-sync yes           # Transfer RDB via socket instead of disk (faster for full sync)
repl-diskless-sync-delay 5       # Wait 5s for more replicas before starting diskless sync
repl-diskless-sync-period 0      # No periodic full sync
repl-diskless-load on-empty-db   # Replica loads RDB from socket directly into memory

Dimensionar corretamente o backlog de replicação é fundamental. Deve ser grande o suficiente para conter todos os comandos de gravação gerados durante a desconexão de réplica mais longa esperada. Para uma instância Redis processando 50 MB/s de tráfego de gravação, um backlog de 256 MB cobre cerca de 5 segundos de gravações. Aumente-o se suas réplicas ficarem off-line por períodos mais longos.

Configurando replicação mestre-réplica

# redis.conf — Master configuration
bind 0.0.0.0
port 6379
protected-mode no
requirepass strong_master_password
masterauth strong_master_password

# Persistence
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

# Replication
repl-backlog-size 256mb
repl-backlog-ttl 3600
repl-diskless-sync yes
min-replicas-to-write 1          # Refuse writes if fewer than 1 replica connected
min-replicas-max-lag 10          # Replica considered disconnected if lag > 10 seconds
# redis.conf — Replica configuration
bind 0.0.0.0
port 6379
protected-mode no
requirepass strong_master_password
masterauth strong_master_password

replicaof master-host 6379
replica-read-only yes
replica-serve-stale-data yes     # Serve (possibly stale) data during sync
replica-priority 100             # Lower values get promoted first by Sentinel

As configuraçõesmin-replicas-to-writeemin-replicas-max-lagimpedem que o mestre aceite escritas quando não consegue garantir a durabilidade dos dados nas réplicas. Esta é uma rede de segurança crítica — sem ela, um mestre particionado em rede continua aceitando gravações que serão perdidas quando o Sentinel promover uma réplica.

Redis Sentinel: Failover automático e descoberta de serviço

Redis Sentinel é um sistema distribuído que monitora instâncias mestres e réplicas Redis, detecta falhas mestres, executa failover automático promovendo uma réplica para mestre e fornece descoberta de serviço para que os clientes possam sempre encontrar o mestre atual. O Sentinel é executado como um processo separado junto com o Redis e opera por meio de um protocolo de consenso — um quorum de instâncias do Sentinel deve concordar que um mestre está inacessível antes de iniciar o failover.

ArquiteturaRedis Sentinel – Failover e Failover Automáticos Descoberta de serviçoClientes de aplicaçãoCluster Sentinela(quórum = 2)Sentinela1:26379Sentinela 2:26379Sentinela 3:26379SENTINEL obter endereço mestre por nomeRedis MestreNó1 - 10.0.1.10:6379Leitura/gravação— PrimárioMonitoramento PINGescreve tráfegoRéplica1Nó2— 10.0.1.11:6379somente leitura – prioridade 100Réplica2Nó3 - 10.0.1.12:6379somente leitura – prioridade 100Replicação assíncronaReplicação assíncronaFailover: mestre falha → Sentinela elegeRéplicapromovida & #x2192; Os clientes se reconectam via SentinelODOWN detectadoLegendaMestre (RW)Réplica(RO)SentinelaCaminho de failoverConfiguração Sentinela

O

Sentinel requer um mínimo de três instâncias para tolerar uma falha do Sentinel e ainda manter o quorum. Cada Sentinel monitora o mesmo mestre Redis e se comunica com outros Sentinelas por meio de um protocolo de fofoca para chegar a um acordo sobre o estado de saúde do mestre.

# /etc/redis/sentinel.conf — Sentinel instance configuration
port 26379
bind 0.0.0.0
protected-mode no

# Monitor the master named "mymaster" at 10.0.1.10:6379
# The quorum value (2) means 2 Sentinels must agree the master is down
sentinel monitor mymaster 10.0.1.10 6379 2

# Authentication
sentinel auth-pass mymaster strong_master_password

# Timing parameters
sentinel down-after-milliseconds mymaster 5000    # SDOWN after 5s of no PING response
sentinel failover-timeout mymaster 60000          # Max 60s for failover procedure
sentinel parallel-syncs mymaster 1                # Only 1 replica syncs from new master at a time

# Deny script execution for security
sentinel deny-scripts-reconfig yes

# Notification script (called on failover events)
# sentinel notification-script mymaster /opt/redis/notify.sh

# Client reconfiguration script (called when master changes)
# sentinel client-reconfig-script mymaster /opt/redis/reconfig.sh

# Logging
logfile /var/log/redis/sentinel.log
logevel notice

# Enable TLS for Sentinel communication
# tls-port 26379
# port 0
# tls-cert-file /etc/redis/tls/sentinel.crt
# tls-key-file /etc/redis/tls/sentinel.key
# tls-ca-cert-file /etc/redis/tls/ca.crt
# tls-replication yes
# tls-auth-clients optional
A detecção de falhas do

Sentinel funciona em duas fases. Primeiro, um Sentinel individual marca um mestre comoSubjectively Down (SDOWN)quando não recebe nenhuma resposta válida ao PING dentro dedown-after-milliseconds. Então, quando um quorum de Sentinelas concorda que o mestre está inacessível, ele é marcado comoObjectively Down (ODOWN)e o processo de failover começa. Um Sentinel é eleito líder de failover, que seleciona a melhor réplica (com base na prioridade, deslocamento de replicação e runid), promove-a a mestre, reconfigura as réplicas restantes para seguir o novo mestre e atualiza o estado do Sentinel.

Sentinel Service Discovery e configuração do cliente

A principal vantagem do Sentinel em relação às configurações estáticas de réplica mestre é a descoberta de serviço. Os clientes não se conectam a um endereço Redis fixo — eles solicitam ao Sentinel o endereço mestre atual e assinam notificações de failover. Todas as principais bibliotecas cliente Redis oferecem suporte nativo ao Sentinel.

# Node.js — ioredis with Sentinel support
const Redis = require('ioredis');

const redis = new Redis({
  sentinels: [
    { host: '10.0.1.20', port: 26379 },
    { host: '10.0.1.21', port: 26379 },
    { host: '10.0.1.22', port: 26379 }
  ],
  name: 'mymaster',
  password: 'strong_master_password',
  sentinelPassword: 'sentinel_password',
  db: 0,
  retryStrategy(times) {
    const delay = Math.min(times * 200, 5000);
    return delay;
  },
  reconnectOnError(err) {
    const targetError = 'READONLY';
    if (err.message.includes(targetError)) {
      return true; // Reconnect on READONLY error (failover happened)
    }
    return false;
  },
  maxRetriesPerRequest: 3,
  enableReadyCheck: true,
  connectTimeout: 10000,
  lazyConnect: false
});

redis.on('connect', () => console.log('Connected to Redis master'));
redis.on('error', (err) => console.error('Redis error:', err));
redis.on('+switch-master', (msg) => {
  console.log('Master switched:', msg);
});
# Python — redis-py with Sentinel support
from redis.sentinel import Sentinel
import redis

sentinel = Sentinel(
    [('10.0.1.20', 26379), ('10.0.1.21', 26379), ('10.0.1.22', 26379)],
    socket_timeout=5,
    password='strong_master_password',
    sentinel_kwargs={'password': 'sentinel_password'}
)

# Get a connection to the current master (for writes)
master = sentinel.master_for(
    'mymaster',
    socket_timeout=5,
    retry_on_timeout=True,
    db=0
)

# Get a connection to a replica (for reads)
replica = sentinel.slave_for(
    'mymaster',
    socket_timeout=5,
    db=0
)

# Usage
master.set('session:user123', '{"logged_in": true}')
result = replica.get('session:user123')
print(result)
// Go — go-redis with Sentinel support
package main

import (
    "context"
    "fmt"
    "time"

    "github.com/redis/go-redis/v9"
)

func main() {
    ctx := context.Background()

    rdb := redis.NewFailoverClient(&redis.FailoverOptions{
        MasterName:       "mymaster",
        SentinelAddrs:    []string{"10.0.1.20:26379", "10.0.1.21:26379", "10.0.1.22:26379"},
        Password:         "strong_master_password",
        SentinelPassword: "sentinel_password",
        DB:               0,
        DialTimeout:      10 * time.Second,
        ReadTimeout:      5 * time.Second,
        WriteTimeout:     5 * time.Second,
        PoolSize:         50,
        MinIdleConns:     10,
        MaxRetries:       3,
        MinRetryBackoff:  200 * time.Millisecond,
        MaxRetryBackoff:  5 * time.Second,
    })
    defer rdb.Close()

    err := rdb.Set(ctx, "key", "value", 5*time.Minute).Err()
    if err != nil {
        fmt.Printf("Error: %v
", err)
        return
    }

    val, err := rdb.Get(ctx, "key").Result()
    if err != nil {
        fmt.Printf("Error: %v
", err)
        return
    }
    fmt.Printf("key = %s
", val)
}
Cluster

Redis: escalonamento horizontal com slots de hash

Embora o Sentinel forneça alta disponibilidade para um único conjunto de dados, o Redis Cluster oferece HA e escalabilidade horizontal. O cluster Redis particiona dados em vários nós mestres usando um mecanismo de slot de hash — o keyspace é dividido em 16.384 slots de hash, e cada mestre é responsável por um subconjunto desses slots. Cada mestre possui uma ou mais réplicas para failover. O cluster fornece coletivamente fragmentação automática, failover integrado e a capacidade de dimensionar o armazenamento e a taxa de transferência linearmente adicionando nós.

Arquitetura de clusterRedis – Slots de hash e Roteamento de clienteSlots0-5460Slots5461-10922Slots10923-1638316.384 slots de hash totais distribuídos em 3 mestres (CRC16 mod 16384)Cliente inteligente(com reconhecimento de cluster)O clientearmazena em cache o mapeamento de slot e nó; lida com redirecionamentos MOVED/ASKMestre A10.0.1.10:7000Slots: 0-5460~ 5461 slots (33,3%)Mestre B10.0.1.11:7000Slots: 5461-10922~ 5462 slots (33,3%)Mestre C10.0.1.12:7000Slots: 10923-16383~ 5461 slots (33,3%)Réplica A110.0.1.13:7000replica slots Master ARéplica B110.0.1.14:7000replica slots Master BRéplica C110.0.1.15:7000replica slots Master CBarramento de cluster(porta + 10000) — Protocolo de fofoca, detecção de falhas, propagação de configuraçãoCada nó troca PING/PONG com todos os outros nós via protocolo binário TCPMOVIDO 12345 10.0.1.12:7000 — redirecionamento permanente | ASK 12345 10.0.1.12:7000 — redirecionamento único durante a reestilhaçamento

Configurando um cluster Redis

# Create a 6-node Redis Cluster (3 masters + 3 replicas)
# Each node needs a redis.conf with cluster-enabled

# redis.conf for each cluster node (adjust port per node)
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
requirepass cluster_password
masterauth cluster_password
bind 0.0.0.0
protected-mode no
repl-backlog-size 256mb

# Start all 6 Redis instances
redis-server /etc/redis/7000.conf
redis-server /etc/redis/7001.conf
# ... repeat for all 6 nodes

# Create the cluster
redis-cli --cluster create \
  10.0.1.10:7000 10.0.1.11:7000 10.0.1.12:7000 \
  10.0.1.13:7000 10.0.1.14:7000 10.0.1.15:7000 \
  --cluster-replicas 1 \
  -a cluster_password

# Verify cluster status
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster info
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster nodes

Refragmentação e operações multichave

A refragmentação

move slots de hash entre mestres para reequilibrar os dados após adicionar ou remover nós. Durante a refragmentação, as chaves nos slots de migração podem receber redirecionamentos ASK, que o cliente trata de forma transparente.

# Add a new node to the cluster
redis-cli --cluster add-node 10.0.1.16:7000 10.0.1.10:7000 -a cluster_password

# Reshard slots to the new node
redis-cli --cluster reshard 10.0.1.10:7000 \
  --cluster-from all \
  --cluster-to NEW_NODE_ID \
  --cluster-slots 4096 \
  --cluster-yes \
  -a cluster_password

# Rebalance the cluster automatically
redis-cli --cluster rebalance 10.0.1.10:7000 -a cluster_password

# Check cluster slot distribution
redis-cli -c -h 10.0.1.10 -p 7000 -a cluster_password cluster slots
As operações multichave

no cluster Redis funcionam apenas quando todas as chaves envolvidas residem no mesmo slot de hash. Use tags hash para garantir que as chaves relacionadas sejam mapeadas para o mesmo slot:{user:123}.profilee{user:123}.sessionsambos hash emuser:123, garantindo que cheguem ao mesmo nó. Isso habilita scripts MGET, MSET, transações e Lua em chaves relacionadas.

# Hash tags ensure these keys are in the same slot
SET {order:5000}.details '{"item":"widget","qty":3}'
SET {order:5000}.payment '{"method":"card","status":"paid"}'
SET {order:5000}.shipping '{"carrier":"fedex","tracking":"FX123"}'

# Multi-key operations work because all keys share the {order:5000} hash tag
MGET {order:5000}.details {order:5000}.payment {order:5000}.shipping

# Transaction across same-slot keys
MULTI
SET {order:5000}.details '{"item":"widget","qty":3,"status":"confirmed"}'
SET {order:5000}.payment '{"method":"card","status":"captured"}'
EXEC
Operador

Redis para Kubernetes

A execução do Redis no Kubernetes requer tratamento cuidadoso de armazenamento persistente, identidade de rede, failover elegante e gerenciamento de configuração. Os operadores Kubernetes codificam esse conhecimento operacional em controladores personalizados que gerenciam clusters Redis declarativamente por meio de definições de recursos personalizados (CRDs).

Operador Spotahome Redis

O operador Spotahome (também conhecido como redis-operator) é um operador maduro e amplamente utilizado para implantação de HA baseado em Redis Sentinel em Kubernetes. Ele gerencia conjuntos de réplicas mestre Redis com failover baseado em Sentinel.

# Install the Spotahome Redis Operator
helm repo add spotahome https://spotahome.github.io/redis-operator
helm install redis-operator spotahome/redis-operator \
  --namespace redis-system --create-namespace

# RedisFailover CRD — 3 Redis instances + 3 Sentinels
apiVersion: databases.spotahome.com/v1
kind: RedisFailover
metadata:
  name: redis-ha
  namespace: production
spec:
  sentinel:
    replicas: 3
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
    customConfig:
      down-after-milliseconds: "5000"
      failover-timeout: "60000"
  redis:
    replicas: 3
    resources:
      requests:
        cpu: "2"
        memory: 8Gi
      limits:
        cpu: "4"
        memory: 16Gi
    storage:
      persistentVolumeClaim:
        metadata:
          name: redis-data
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
          storageClassName: longhorn
    customConfig:
      maxmemory: "6gb"
      maxmemory-policy: "allkeys-lru"
      save: "900 1 300 10 60 10000"
      appendonly: "yes"
      appendfsync: "everysec"
      aof-use-rdb-preamble: "yes"
      repl-backlog-size: "256mb"
    exporter:
      enabled: true
      image: oliver006/redis_exporter:latest
      args:
        - --include-system-metrics
Operador OpsTree Redis

O operador OpsTree oferece suporte às topologias Redis Sentinel (HA independente) e Redis Cluster (HA fragmentado), tornando-o mais versátil para diferentes casos de uso.

# Install the OpsTree Redis Operator
helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
helm install redis-operator ot-helm/redis-operator \
  --namespace redis-system --create-namespace

# Redis Cluster CRD — 3 masters + 3 replicas
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: RedisCluster
metadata:
  name: redis-cluster
  namespace: production
spec:
  clusterSize: 3
  clusterVersion: v7
  persistenceEnabled: true
  kubernetesConfig:
    image: redis:7.2-alpine
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "2"
        memory: 8Gi
      limits:
        cpu: "4"
        memory: 16Gi
  redisLeader:
    replicas: 3
    redisConfig:
      additionalRedisConfig: |
        maxmemory 6gb
        maxmemory-policy allkeys-lru
        appendonly yes
        appendfsync everysec
  redisFollower:
    replicas: 3
    redisConfig:
      additionalRedisConfig: |
        maxmemory 6gb
        replica-read-only yes
  storage:
    volumeClaimTemplate:
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
        storageClassName: longhorn
  redisExporter:
    enabled: true
    image: quay.io/opstree/redis-exporter:v1.44.0
Operador Empresarial

Redis

Redis Enterprise fornece a uma operadora comercial Kubernetes recursos avançados, incluindo replicação geográfica ativa-ativa (CRDTs), suporte a módulos Redis, hierarquização automática (RAM + flash) e gerenciamento automatizado de cluster. É a opção recomendada para organizações que precisam de SLAs e suporte de nível empresarial.

# Redis Enterprise Operator CRD
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
  name: redis-enterprise
  namespace: redis-enterprise
spec:
  nodes: 3
  persistentSpec:
    enabled: true
    storageClassName: longhorn
    volumeSize: 100Gi
  redisEnterpriseNodeResources:
    limits:
      cpu: "8"
      memory: 32Gi
    requests:
      cpu: "4"
      memory: 16Gi
  uiServiceType: ClusterIP
  servicesRiggerSpec:
    databaseServiceType: ClusterIP
---
apiVersion: app.redislabs.com/v1alpha1
kind: RedisEnterpriseDatabase
metadata:
  name: redis-ha-db
  namespace: redis-enterprise
spec:
  memorySize: 10GB
  replication: true
  shardCount: 3
  persistence: aofEverySecond
  tlsMode: enabled
  modulesList:
    - name: search
      version: latest
    - name: json
      version: latest
Estratégias de persistência

: RDB, AOF e

híbrido

Redis oferece três mecanismos de persistência. A escolha da estratégia certa depende do objetivo do ponto de recuperação (RPO), dos requisitos de desempenho e das restrições de armazenamento.

Instantâneos RDB Ocria instantâneos pontuais de todo o conjunto de dados em intervalos configurados. Eles são compactos, rápidos para carregar na reinicialização e ideais para backups. No entanto, os dados gravados entre os instantâneos são perdidos em caso de falha. O RDB usa um processo filho bifurcado, portanto, a criação de snapshots não bloqueia o thread principal do Redis — mas a bifurcação em si pode causar um pico de latência em grandes conjuntos de dados devido à alocação de memória de cópia na gravação.

AOF (arquivo somente anexado)registra cada operação de gravação no disco. Ele oferece durabilidade muito melhor que o RDB – comappendfsync everysec, você perde no máximo um segundo de dados em caso de falha. Com oappendfsync always, você não perde nada, mas com um custo significativo de desempenho. Os arquivos AOF são maiores que RDB e mais lentos para carregar na reinicialização.

Persistência híbrida(a abordagem recomendada) combina ambos:aof-use-rdb-preamble yesgrava um instantâneo RDB no início do arquivo AOF, seguido por entradas AOF para gravações subsequentes. Isto proporciona tempos de inicialização rápidos (seção RDB) com forte durabilidade (seção AOF).

# redis.conf — Hybrid persistence (recommended for production)

# RDB snapshots
save 900 1          # Snapshot if at least 1 write in 900 seconds
save 300 10         # Snapshot if at least 10 writes in 300 seconds
save 60 10000       # Snapshot if at least 10000 writes in 60 seconds
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis

# AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec           # Best balance of durability and performance
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes       # Hybrid: RDB preamble + AOF tail
aof-timestamp-enabled yes      # Enable timestamps for PITR (Redis 7+)

# Recovery options
rdb-del-sync-files no
aof-load-truncated yes
Implantações Redis gerenciadas em nuvem

AWS ElastiCache para Redis

AWS ElastiCache oferece Redis totalmente gerenciado com dois modos HA:Cluster Mode Disabled(fragmento único, até 5 réplicas, failover semelhante ao Sentinel) eCluster Mode Enabled(até 500 shards, cada um com até 5 réplicas, distribuição de slot de hash). O Global Datastore fornece replicação entre regiões para recuperação de desastres.

# AWS CLI — Create ElastiCache Redis Cluster Mode Enabled
aws elasticache create-replication-group \
  --replication-group-id redis-ha-prod \
  --replication-group-description "Production Redis HA Cluster" \
  --engine redis \
  --engine-version 7.1 \
  --cache-node-type cache.r7g.2xlarge \
  --num-node-groups 3 \
  --replicas-per-node-group 2 \
  --automatic-failover-enabled \
  --multi-az-enabled \
  --at-rest-encryption-enabled \
  --transit-encryption-enabled \
  --auth-token strong_auth_token \
  --cache-subnet-group-name redis-subnet-group \
  --security-group-ids sg-0123456789abcdef0 \
  --snapshot-retention-limit 7 \
  --snapshot-window "03:00-05:00" \
  --preferred-maintenance-window "sun:05:00-sun:07:00" \
  --cache-parameter-group-name redis-ha-params \
  --log-delivery-configurations '[
    {"LogType":"slow-log","DestinationType":"cloudwatch-logs","DestinationDetails":{"CloudWatchLogsDetails":{"LogGroup":"/aws/elasticache/redis-ha-prod"}}},
    {"LogType":"engine-log","DestinationType":"cloudwatch-logs","DestinationDetails":{"CloudWatchLogsDetails":{"LogGroup":"/aws/elasticache/redis-ha-prod"}}}
  ]'

# Create Global Datastore for cross-region DR
aws elasticache create-global-replication-group \
  --global-replication-group-id-suffix redis-global \
  --primary-replication-group-id redis-ha-prod

# Add secondary region
aws elasticache create-replication-group \
  --replication-group-id redis-ha-dr \
  --replication-group-description "DR Redis in eu-west-2" \
  --global-replication-group-id ldgnf-redis-global \
  --cache-node-type cache.r7g.2xlarge \
  --num-node-groups 3 \
  --replicas-per-node-group 1 \
  --region eu-west-2

# Custom parameter group for HA tuning
aws elasticache create-cache-parameter-group \
  --cache-parameter-group-name redis-ha-params \
  --cache-parameter-group-family redis7 \
  --description "HA-optimised Redis 7 parameters"

aws elasticache modify-cache-parameter-group \
  --cache-parameter-group-name redis-ha-params \
  --parameter-name-values \
    "ParameterName=maxmemory-policy,ParameterValue=allkeys-lru" \
    "ParameterName=timeout,ParameterValue=300" \
    "ParameterName=tcp-keepalive,ParameterValue=60" \
    "ParameterName=activedefrag,ParameterValue=yes"
Cache

Azure para Redis

O cache

Azure para Redis oferece três níveis: Básico (sem replicação), Padrão (replicado) e Premium/Enterprise. A camada Premium oferece suporte a clustering, replicação geográfica, redundância de zona, injeção de VNet e persistência de dados. A camada Enterprise adiciona módulos Redis e distribuição geográfica Ativo-Ativo.

# Azure CLI — Create Premium Azure Cache for Redis with clustering
az redis create \
  --resource-group redis-ha-rg \
  --name redis-ha-prod \
  --location westeurope \
  --sku Premium \
  --vm-size P3 \
  --shard-count 3 \
  --replicas-per-master 1 \
  --zones 1 2 3 \
  --minimum-tls-version 1.2 \
  --redis-version 7

# Enable geo-replication (link primary to secondary)
az redis server-link create \
  --name redis-ha-prod \
  --resource-group redis-ha-rg \
  --server-to-link /subscriptions/.../redis-ha-dr \
  --replication-role Secondary

# Configure data persistence
az redis update \
  --name redis-ha-prod \
  --resource-group redis-ha-rg \
  --set redisConfiguration.rdb-backup-enabled=true \
  --set redisConfiguration.rdb-backup-frequency=60 \
  --set redisConfiguration.rdb-storage-connection-string="DefaultEndpointsProtocol=https;..."

# Enable diagnostics
az monitor diagnostic-settings create \
  --name redis-diagnostics \
  --resource /subscriptions/.../redis-ha-prod \
  --workspace /subscriptions/.../log-analytics-workspace \
  --metrics '[{"category":"AllMetrics","enabled":true}]'
Armazenamento de memória GCP

para Redis

O

GCP oferece dois níveis de Memorystore:Standard(instância única com réplica de failover automático) eRedis Cluster(cluster fragmentado e totalmente gerenciado com escalonamento automático). A camada Standard é adequada para a maioria dos casos de uso de alta disponibilidade, enquanto o cluster Redis lida com grandes conjuntos de dados que exigem escalabilidade horizontal.

# GCP — Create Standard tier Memorystore (HA with auto-failover)
gcloud redis instances create redis-ha-prod \
  --size=26 \
  --region=europe-west1 \
  --zone=europe-west1-b \
  --alternative-zone=europe-west1-c \
  --tier=standard \
  --redis-version=redis_7_2 \
  --redis-config="maxmemory-policy=allkeys-lru,activedefrag=yes" \
  --network=projects/my-project/global/networks/vpc-main \
  --transit-encryption-mode=SERVER_AUTHENTICATION \
  --enable-auth \
  --persistence-mode=RDB \
  --rdb-snapshot-period=12h \
  --rdb-snapshot-start-time="2026-04-12T03:00:00Z" \
  --maintenance-window-day=SUNDAY \
  --maintenance-window-hour=4

# GCP — Create Memorystore Redis Cluster
gcloud redis clusters create redis-cluster-prod \
  --region=europe-west1 \
  --shard-count=3 \
  --replica-count=1 \
  --network=projects/my-project/global/networks/vpc-main \
  --transit-encryption-mode=SERVER_AUTHENTICATION
Implantação Redis multirregional

A implantação do Redis multirregional é essencial para recuperação de desastres e redução da latência global. A abordagem varia de acordo com a arquitetura: o Redis Enterprise usa ativo-ativo com CRDTs (tipos de dados replicados livres de conflitos) para gravações multimestre verdadeiras, enquanto o Redis de código aberto e os serviços gerenciados em nuvem usam replicação ativa-passiva com réplicas de leitura em regiões secundárias.

Implantação Redis multirregional– Ativo-Ativo e Ativo Replicação entre regiõesRegião 1 — AWS us-east-1ElastiCache primário3 fragmentos – Modo cluster habilitado2 réplicas de leitura por fragmentoFailover automático Multi-AZEndpoint do leitor(leituras round-robin)Armazenamento de dados global— região primáriaRegião 2 — Azure Europa OcidentalAzure Cache Premium3 fragmentos – Zona redundante1 réplica por fragmentoZonas 1, 2, 3Replicação geográficavinculada aoprimárioRéplica geográfica passiva - sincronização assíncronaRegião 3 — GCP ásia-leste1Padrão de armazenamento de memóriaFragmento único — failover automáticoRéplicaHA (zona cruzada)Persistência RDBhabilitadaReplicação em nível de aplicativoda Região 1Modo de espera quente somente leiturageo-repl assíncronaReplicação assíncrona entre regiõesRedis Enterprise Active-Active (Multi-Master baseado em CRDT)CRDB Instância AUS — R/W (velocidade local total)CRDB Instância BEU — R/W (velocidade local total)CRDB Instância CAPAC — R/W (velocidade local total)SincronizaçãoCRDT – contadores, conjuntos e strings se fundem sem conflitos entre regiõesGlobal DNS / Roteamento de tráfego (baseado em latência)Legenda:Mestre/PrimárioRéplicaAssíncrono entre regiõesAtivo-Ativo CRDBRPO: Ativo-passivo ≈ segundos de atraso | Ativo-Ativo CRDT ≈ perda zero de dados (consistência eventual)

Bare Metal k3s/Rancher com Longhorn

Para organizações que executam seu próprio hardware, a implantação do Redis HA em bare metal k3s fornece controle total sobre a infraestrutura, elimina a dependência do fornecedor de nuvem e pode ser significativamente mais econômica para implantações em grande escala. k3s é uma distribuição Kubernetes leve e certificada, ideal para ambientes de borda e bare metal, enquanto o Rancher fornece um plano de gerenciamento para operações de vários clusters.

Bare Metal k3s + Rancher — Redis HA com Operador SentinelUI de gerenciamento de fazendeiroCiclo de vida do cluster+ monitoramentoBalanceador de carga MetalLBVIP: 10.0.0.50 (redis-master) & 10.0.0.51 (redis-leitura)Clusterk3s — 3 nós de servidor (bare metal)OperadorRedis (Spotahome/OpsTree)Nó 1— bare-metal-srv1Pod mestreRedisStatefulSet redis-ha-0:6379Pod Sentinela:26379Longhorn PVC (AOF + RDB)50Gi — 3x replicado entre nósSidecar redis-exportador: 9121MétricasPrometheusSSDNVMe — disco local de 2 TBNó 2— bare-metal-srv2Pod de réplicaRedisStatefulSet redis-ha-1:6379Pod Sentinela:26379Longhorn PVC (AOF + RDB)50Gi — 3x replicado entre nósSidecar redis-exportador: 9121MétricasPrometheusSSDNVMe — disco local de 2 TBNó 3— bare-metal-srv3Pod de réplicaRedisStatefulSet redis-ha-2:6379Pod Sentinela:26379Longhorn PVC (AOF + RDB)50Gi — replicado 3x entre nósSidecar redis-exportador: 9121MétricasPrometheusSSDNVMe — disco local de 2 TBLegenda:MestreRéplicaSentinelaLonghorn PVCExportadorMetalLBOperadorFazendeirok3s fornece Kubernetes leve. Longhorn fornece armazenamento em bloco distribuído com replicação 3x em SSDs NVMe.OMetalLB atribui IPs LoadBalancer estáveis para serviços mestre (gravação) Redis e leitura (réplicas) Redis. Rancher gerencia o ciclo de vida do cluster.

Instalação k3s e implantação do operador Redis

# Install k3s on the first server node
curl -sfL https://get.k3s.io | K3S_TOKEN=redis-cluster-token \
  INSTALL_K3S_EXEC="server --cluster-init --disable traefik --disable servicelb" sh -

# Join additional server nodes
curl -sfL https://get.k3s.io | K3S_TOKEN=redis-cluster-token \
  K3S_URL=https://10.0.0.1:6443 \
  INSTALL_K3S_EXEC="server" sh -

# Install Longhorn for distributed block storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system --create-namespace \
  --set defaultSettings.defaultDataPath=/mnt/longhorn \
  --set defaultSettings.replicaCount=3 \
  --set defaultSettings.storageMinimalAvailablePercentage=15

# Install MetalLB for bare-metal LoadBalancer services
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb --namespace metallb-system --create-namespace

# Configure MetalLB IP address pool
kubectl apply -f - <

Redis HA Valores Helm para k3s

# values-redis-ha.yaml — Helm values for Redis HA on k3s/Longhorn
redis:
  replicas: 3
  resources:
    requests:
      cpu: "2"
      memory: 8Gi
    limits:
      cpu: "4"
      memory: 16Gi
  storage:
    persistentVolumeClaim:
      metadata:
        name: redis-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
        storageClassName: longhorn
  customConfig:
    maxmemory: "6gb"
    maxmemory-policy: "allkeys-lru"
    save: "900 1 300 10 60 10000"
    appendonly: "yes"
    appendfsync: "everysec"
    aof-use-rdb-preamble: "yes"
    repl-backlog-size: "256mb"
    tcp-keepalive: "60"
    timeout: "300"
    hz: "10"
    activedefrag: "yes"
  exporter:
    enabled: true
    image: oliver006/redis_exporter:latest

sentinel:
  replicas: 3
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 200m
      memory: 256Mi
  customConfig:
    down-after-milliseconds: "5000"
    failover-timeout: "60000"
    parallel-syncs: "1"

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app.kubernetes.io/component
              operator: In
              values:
                - redis
        topologyKey: kubernetes.io/hostname
Políticas de gerenciamento e despejo de memória

Redis armazena todos os dados na memória, tornando o gerenciamento de memória a preocupação operacional mais crítica. Quando a Redis atinge o limite configurado domaxmemory, ela deve decidir o que fazer com os comandos de gravação recebidos. A política de despejo controla esse comportamento.

# redis.conf — Memory management
maxmemory 6gb
maxmemory-policy allkeys-lru

# Available eviction policies:
# noeviction        — Return errors on writes when memory limit reached
# allkeys-lru       — Evict least recently used keys (general-purpose cache)
# allkeys-lfu       — Evict least frequently used keys (better for skewed access patterns)
# volatile-lru      — Evict LRU keys with TTL set
# volatile-lfu      — Evict LFU keys with TTL set
# volatile-ttl      — Evict keys with shortest TTL first
# allkeys-random    — Evict random keys
# volatile-random   — Evict random keys with TTL set

# Active defragmentation (Redis 4.0+)
activedefrag yes
active-defrag-enabled yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
active-defrag-cycle-min 1
active-defrag-cycle-max 25
active-defrag-max-scan-fields 1000

# Memory usage monitoring
# redis-cli INFO memory
# Key metrics:
#   used_memory           — Total bytes allocated by Redis
#   used_memory_rss       — Resident set size (OS-level memory)
#   mem_fragmentation_ratio — RSS / used_memory (should be close to 1.0)
#   maxmemory             — Configured memory limit
#   evicted_keys          — Total keys evicted due to maxmemory

Para implantações de HA, configuremaxmemorypara aproximadamente 75% da RAM disponível do nó. Os 25% restantes acomodam o buffer de saída de replicação, o buffer de reescrita AOF, a memória de cópia na gravação durante instantâneos RDB e a sobrecarga do sistema operacional. Para um pod de 16 GB, defina maxmemory como 12 GB. Para um servidor bare metal de 64 GB, configure-o para 48 GB.

Criptografia e ACLs

TLS

As implantações de produção do

Redis devem criptografar dados em trânsito com o TLS e impor controle de acesso refinado com ACLs (listas de controle de acesso), introduzidas no Redis 6.0.

# redis.conf — TLS configuration
tls-port 6380
port 0                            # Disable non-TLS port entirely
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients optional         # Require client certificates (mutual TLS)
tls-replication yes               # Encrypt replication traffic
tls-cluster yes                   # Encrypt cluster bus traffic
tls-protocols "TLSv1.3"           # Only allow TLS 1.3

# ACL configuration (Redis 6.0+)
# user  on|off [>password] [~pattern] [+command|-command] [&channel]
user default off                  # Disable the default user
user admin on >strong_admin_pass ~* +@all
user appuser on >app_pass ~app:* ~session:* ~cache:* +@read +@write +@connection -@admin -@dangerous
user readonly on >readonly_pass ~* +@read +@connection -@write -@admin
user replicator on >repl_pass +psync +replconf +ping

# Load ACL from external file
aclfile /etc/redis/users.acl

Pub/Sub e streams em configurações de alta disponibilidade

Redis Pub/Sub e Streams se comportam de maneira diferente em configurações de alta disponibilidade. Compreender essas diferenças é essencial para construir sistemas confiáveis ​​orientados a eventos.

Pub/Sub As mensagenssão disparadas e esquecidas — elas não são persistentes, não são replicadas e não são armazenadas em buffer. Em uma configuração de alta disponibilidade baseada no Sentinel, os assinantes conectados ao mestre recebem mensagens normalmente, mas durante um failover, o novo mestre não tem conhecimento das assinaturas anteriores. Os clientes devem se inscrever novamente após se reconectarem. Com o cluster Redis, as mensagens do Pub/Sub são transmitidas para todos os nós do cluster, de modo que os assinantes conectados a qualquer nó recebam mensagens publicadas (embora isso gere tráfego entre nós).

Redis Streamssão uma estrutura de dados replicada e persistente que fornece entrega confiável de mensagens em ambientes HA. As entradas de fluxo são replicadas em réplicas por meio do mecanismo de replicação normal, sobrevivem a failovers e oferecem suporte a grupos de consumidores com semântica de entrega pelo menos uma vez. Para mensagens de alta disponibilidade, o Streams deve sempre ser preferido ao Pub/Sub.

# Redis Streams with consumer groups — HA-safe message processing

# Create a stream and consumer group
XGROUP CREATE events:orders orders-processors $ MKSTREAM

# Produce events
XADD events:orders * action "order_placed" order_id "12345" amount "599.99"
XADD events:orders * action "order_placed" order_id "12346" amount "149.99"

# Consume events (in consumer group — at-least-once delivery)
XREADGROUP GROUP orders-processors worker-1 COUNT 10 BLOCK 5000 STREAMS events:orders >

# Acknowledge processed events
XACK events:orders orders-processors 1681234567890-0

# Check pending messages (unacknowledged)
XPENDING events:orders orders-processors - + 10

# Claim abandoned messages (from a dead consumer)
XAUTOCLAIM events:orders orders-processors worker-2 60000 0-0 COUNT 10

# Trim stream to prevent unbounded growth
XTRIM events:orders MAXLEN ~ 100000
Módulos

Redis em HA

Os módulos

Redis estendem o Redis com estruturas de dados e funcionalidades especializadas. Os três mais populares — RedisJSON, RediSearch e RedisTimeSeries — funcionam com replicação e Sentinel, mas têm considerações específicas em implantações de HA.

# redis.conf — Loading modules
loadmodule /opt/redis-stack/lib/rejson.so
loadmodule /opt/redis-stack/lib/redisearch.so
loadmodule /opt/redis-stack/lib/redistimeseries.so

# Modules are replicated to replicas via the command stream
# Ensure the same modules are installed on all nodes (master + replicas)

# RedisJSON — store and query JSON documents
JSON.SET user:1001 $ '{"name":"Alice","email":"alice@example.com","orders":42}'
JSON.GET user:1001 $.name

# RediSearch — full-text search with indexing
FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.email AS email TAG $.orders AS orders NUMERIC
FT.SEARCH idx:users "@name:Alice"

# RedisTimeSeries — time-series data
TS.CREATE metrics:cpu:node1 RETENTION 86400000 LABELS host node1 metric cpu
TS.ADD metrics:cpu:node1 * 73.5
TS.RANGE metrics:cpu:node1 - + AGGREGATION avg 60000

Ao executar o Redis Stack (o pacote de módulos) em HA, certifique-se de que todos os nós — mestres e réplicas — tenham versões de módulo idênticas instaladas. Os comandos do módulo são replicados por meio do fluxo de replicação padrão, portanto, as réplicas devem ser capazes de executá-los. Após um failover, os índices RediSearch existem na réplica promovida e atendem consultas imediatamente.

Pool de conexões

e configuração de cliente para HA

O pool de conexões adequado é essencial para o desempenho e a resiliência do Redis HA. Os pools de conexões reduzem a sobrecarga de estabelecimento de conexões TCP, fornecem lógica de nova tentativa automática e permitem o tratamento de failover elegante.

# Node.js — ioredis connection pool with cluster mode
const Redis = require('ioredis');

// Cluster mode connection
const cluster = new Redis.Cluster(
  [
    { host: '10.0.1.10', port: 7000 },
    { host: '10.0.1.11', port: 7000 },
    { host: '10.0.1.12', port: 7000 }
  ],
  {
    redisOptions: {
      password: 'cluster_password',
      connectTimeout: 10000,
      maxRetriesPerRequest: 3
    },
    scaleReads: 'slave',           // Route reads to replicas
    clusterRetryStrategy(times) {
      return Math.min(times * 200, 5000);
    },
    slotsRefreshTimeout: 2000,
    slotsRefreshInterval: 5000,
    enableOfflineQueue: true,
    enableReadyCheck: true,
    natMap: {}                     // For NAT/port-forwarded environments
  }
);

cluster.on('error', (err) => console.error('Cluster error:', err));
cluster.on('node error', (err, address) => {
  console.error(`Node ${address} error:`, err);
});
# Python — redis-py connection pool with cluster mode
from redis.cluster import RedisCluster
from redis.backoff import ExponentialBackoff
from redis.retry import Retry

retry = Retry(ExponentialBackoff(cap=5, base=0.1), retries=5)

rc = RedisCluster(
    startup_nodes=[
        {"host": "10.0.1.10", "port": 7000},
        {"host": "10.0.1.11", "port": 7000},
        {"host": "10.0.1.12", "port": 7000}
    ],
    password="cluster_password",
    decode_responses=True,
    read_from_replicas=True,
    retry=retry,
    retry_on_timeout=True,
    socket_timeout=5,
    socket_connect_timeout=5,
    max_connections=50,
    health_check_interval=30
)

rc.set("key", "value")
print(rc.get("key"))
// Go — go-redis cluster client with connection pooling
package main

import (
    "context"
    "time"

    "github.com/redis/go-redis/v9"
)

func NewRedisCluster() *redis.ClusterClient {
    return redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{
            "10.0.1.10:7000",
            "10.0.1.11:7000",
            "10.0.1.12:7000",
        },
        Password:         "cluster_password",
        ReadOnly:         true,
        RouteRandomly:    true,
        RouteByLatency:   false,
        PoolSize:         50,
        MinIdleConns:     10,
        DialTimeout:      10 * time.Second,
        ReadTimeout:      5 * time.Second,
        WriteTimeout:     5 * time.Second,
        PoolTimeout:      10 * time.Second,
        MaxRetries:       5,
        MinRetryBackoff:  200 * time.Millisecond,
        MaxRetryBackoff:  5 * time.Second,
    })
}
Estratégias de backup e restauração

Mesmo com replicação HA, backups regulares são essenciais para recuperação de desastres, conformidade e proteção contra erros lógicos (FLUSHALL acidental, gravações incorretas de aplicativos). Os backups do Redis são baseados em snapshots RDB e arquivos AOF.

#!/bin/bash
# redis-backup.sh — Automated Redis backup script

REDIS_HOST="10.0.1.10"
REDIS_PORT="6379"
REDIS_PASS="strong_master_password"
BACKUP_DIR="/backups/redis"
S3_BUCKET="s3://redis-backups-prod"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Trigger RDB snapshot on the master
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" BGSAVE

# Wait for background save to complete
while [ "$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS LASTSAVE)" = "$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS LASTSAVE)" ]; do
  sleep 1
done
sleep 2

# Copy the RDB file
RDB_FILE=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" CONFIG GET dir | tail -1)
cp "${RDB_FILE}/dump.rdb" "${BACKUP_DIR}/dump_${DATE}.rdb"

# Compress and upload to S3
gzip "${BACKUP_DIR}/dump_${DATE}.rdb"
aws s3 cp "${BACKUP_DIR}/dump_${DATE}.rdb.gz" "${S3_BUCKET}/daily/dump_${DATE}.rdb.gz" \
  --storage-class STANDARD_IA

# Cleanup old local backups
find "$BACKUP_DIR" -name "dump_*.rdb.gz" -mtime +$RETENTION_DAYS -delete

# Verify backup integrity
redis-check-rdb "${BACKUP_DIR}/dump_${DATE}.rdb.gz" && \
  echo "Backup verified: dump_${DATE}.rdb.gz" || \
  echo "ERROR: Backup verification failed!"

echo "Backup complete: ${BACKUP_DIR}/dump_${DATE}.rdb.gz"
# Restore from RDB backup
# 1. Stop Redis
systemctl stop redis

# 2. Replace the RDB file
gunzip /backups/redis/dump_20260412_030000.rdb.gz
cp /backups/redis/dump_20260412_030000.rdb /data/redis/dump.rdb
chown redis:redis /data/redis/dump.rdb

# 3. Disable AOF temporarily (if enabled) to prevent AOF overriding RDB on startup
redis-cli -a password CONFIG SET appendonly no

# 4. Start Redis (loads RDB)
systemctl start redis

# 5. Re-enable AOF and rewrite it from the loaded data
redis-cli -a password CONFIG SET appendonly yes
redis-cli -a password BGREWRITEAOF
Monitoramento

com Redis INFO, Prometheus e Grafana

O monitoramento abrangente é a base da excelência operacional do Redis HA. O Redis expõe métricas internas avançadas por meio do comandoINFO, que o exportador Prometheus Redis traduz em métricas de série temporal para painéis e alertas do Grafana.

# Key Redis INFO sections for HA monitoring
redis-cli -a password INFO replication
# role:master
# connected_slaves:2
# slave0:ip=10.0.1.11,port=6379,state=online,offset=1234567,lag=0
# slave1:ip=10.0.1.12,port=6379,state=online,offset=1234560,lag=1
# master_replid:abc123...
# master_repl_offset:1234567
# repl_backlog_size:268435456
# repl_backlog_first_byte_offset:1000000

redis-cli -a password INFO memory
# used_memory:6442450944
# used_memory_human:6.00G
# used_memory_rss:6879707136
# mem_fragmentation_ratio:1.07
# maxmemory:6442450944
# maxmemory_policy:allkeys-lru
# evicted_keys:12345

redis-cli -a password INFO stats
# total_connections_received:50000
# total_commands_processed:12345678
# instantaneous_ops_per_sec:85432
# keyspace_hits:11000000
# keyspace_misses:1345678
# expired_keys:500000
# evicted_keys:12345

redis-cli -a password INFO clients
# connected_clients:150
# blocked_clients:0
# maxclients:10000
# Prometheus Redis Exporter deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-exporter
  template:
    metadata:
      labels:
        app: redis-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9121"
    spec:
      containers:
        - name: redis-exporter
          image: oliver006/redis_exporter:latest
          args:
            - --redis.addr=redis://redis-ha-master:6379
            - --redis.password=$(REDIS_PASSWORD)
            - --include-system-metrics
            - --is-cluster
          env:
            - name: REDIS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: redis-secret
                  key: password
          ports:
            - containerPort: 9121
              name: metrics
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 200m
              memory: 256Mi
# PrometheusRule for Redis HA alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: redis-ha-alerts
  namespace: monitoring
spec:
  groups:
    - name: redis-availability
      rules:
        - alert: RedisDown
          expr: redis_up == 0
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Redis instance {{ $labels.instance }} is down"

        - alert: RedisReplicaDisconnected
          expr: redis_connected_slaves < 2
          for: 2m
          labels:
            severity: warning
          annotations:
            summary: "Redis master has fewer than 2 connected replicas"

        - alert: RedisReplicationLagHigh
          expr: redis_replication_lag > 5
          for: 3m
          labels:
            severity: warning
          annotations:
            summary: "Redis replication lag exceeds 5 seconds on {{ $labels.instance }}"

        - alert: RedisMemoryUsageHigh
          expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis memory usage above 90% on {{ $labels.instance }}"

        - alert: RedisEvictionsHigh
          expr: rate(redis_evicted_keys_total[5m]) > 100
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis evicting keys at >100/s on {{ $labels.instance }}"

        - alert: RedisKeyspaceHitRateLow
          expr: redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) < 0.8
          for: 10m
          labels:
            severity: info
          annotations:
            summary: "Redis cache hit rate below 80% on {{ $labels.instance }}"

        - alert: RedisSentinelDown
          expr: redis_sentinel_master_status != 1
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Redis Sentinel reports master unhealthy"

    - name: redis-performance
      rules:
        - alert: RedisSlowlogGrowing
          expr: increase(redis_slowlog_length[5m]) > 10
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis slow log growing rapidly on {{ $labels.instance }}"

        - alert: RedisConnectionsNearLimit
          expr: redis_connected_clients / redis_config_maxclients > 0.8
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Redis connected clients above 80% of maxclients"

Dragonfly e KeyDB: alternativas compatíveis com Redis

Embora o Redis seja o armazenamento de dados na memória dominante, duas alternativas compatíveis com o Redis ganharam força para casos de uso específicos.

Libélula

Dragonfly é um substituto Redis moderno e multithread que pretende ser um substituto imediato enquanto aproveita todos os núcleos CPU disponíveis. A Redis tradicional é de thread único para processamento de comandos – o Dragonfly usa uma arquitetura sem compartilhamento com vários threads para atingir um rendimento significativamente maior em máquinas com vários núcleos. Ele suporta o protocolo Redis, a maioria dos comandos Redis e pode substituir o Redis sem alterações no aplicativo.

# Run Dragonfly as a Redis replacement
docker run -d --name dragonfly \
  -p 6379:6379 \
  -v /data/dragonfly:/data \
  docker.dragonflydb.io/dragonflydb/dragonfly \
  --maxmemory 12gb \
  --proactor_threads 8 \
  --dbfilename dump.rdb \
  --requirepass strong_password

# Dragonfly in Kubernetes
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dragonfly
  namespace: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dragonfly
  template:
    metadata:
      labels:
        app: dragonfly
    spec:
      containers:
        - name: dragonfly
          image: docker.dragonflydb.io/dragonflydb/dragonfly:latest
          args:
            - --maxmemory=12gb
            - --proactor_threads=8
            - --requirepass=strong_password
            - --snapshot_cron=*/30 * * * *
          ports:
            - containerPort: 6379
          resources:
            requests:
              cpu: "4"
              memory: 16Gi
            limits:
              cpu: "8"
              memory: 16Gi
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: longhorn
        resources:
          requests:
            storage: 100Gi
As principais vantagens do

Dragonfly: multithread (taxa de transferência de 25x em 8 núcleos versus Redis de thread único), melhor eficiência de memória (usa tabelas hash Dash em vez de dict Redis), snapshot integrado sem sobrecarga fork() e suporte nativo para grandes conjuntos de dados. No entanto, a partir de 2026, o suporte à replicação do Dragonfly ainda está amadurecendo — ele oferece suporte à replicação de réplica primária, mas ainda não possui um sistema de failover automático equivalente ao Sentinel. Para HA, use verificações de integridade Kubernetes e políticas de reinicialização StatefulSet ou implante atrás de um balanceador de carga com failover em nível de aplicativo.

Chave DB

KeyDB é um fork multithread do Redis mantido pela Snap (a empresa por trás do Snapchat). É totalmente compatível com Redis e adiciona replicação multithreading, ativo-ativo (multimestre), camadas de armazenamento FLASH e expiração de subchave. A replicação ativo-ativo do KeyDB é particularmente interessante para HA — duas instâncias do KeyDB podem aceitar gravações simultaneamente e replicar entre si, proporcionando failover com tempo de inatividade zero.

# keydb.conf — Multi-threaded configuration with active replication
server-threads 4                  # Use 4 threads for command processing
bind 0.0.0.0
port 6379
requirepass strong_password
masterauth strong_password

# Active-active replication (multi-master)
active-replica yes
replicaof peer-host 6379          # Bidirectional replication

# On the peer node, configure the reverse:
# replicaof this-host 6379

# FLASH storage tiering (for datasets larger than RAM)
# storage-provider flash /mnt/flash-storage 100
# maxmemory 16gb
# Will keep hot data in RAM and spill cold data to SSD

# SubKey expiration (unique to KeyDB)
# Allows setting TTL on hash fields, not just top-level keys
# EXPIREMEMBER myhash field1 3600
O

KeyDB é uma escolha forte quando você precisa de replicação multimestre para distribuição geográfica ou manutenção com tempo de inatividade zero, ou quando você precisa de uma taxa de transferência maior do que a Redis de thread único pode fornecer, mas deseja ficar mais próximo da base de código Redis do que o Dragonfly.

Ajuste de desempenho

Encanamento

O

Pipelining agrupa vários comandos em um único ciclo de rede, reduzindo drasticamente a latência para operações em massa. Em vez de esperar por cada resposta antes de enviar o próximo comando, o cliente envia todos os comandos de uma vez e lê todas as respostas juntas.

# Python — Pipelining with redis-py
import redis
import time

r = redis.Redis(host='10.0.1.10', port=6379, password='password', decode_responses=True)

# Without pipelining: 1000 round-trips
start = time.time()
for i in range(1000):
    r.set(f'key:{i}', f'value:{i}')
print(f'Without pipeline: {time.time() - start:.3f}s')

# With pipelining: 1 round-trip for 1000 commands
start = time.time()
pipe = r.pipeline(transaction=False)
for i in range(1000):
    pipe.set(f'key:{i}', f'value:{i}')
pipe.execute()
print(f'With pipeline: {time.time() - start:.3f}s')
# Typically 5-10x faster

Lua Script

Os scripts Lua

são executados atomicamente no servidor Redis, eliminando idas e vindas para operações complexas e garantindo que nenhum outro comando seja executado entre as operações do script. No cluster Redis, certifique-se de que todas as chaves acessadas por um script Lua residam no mesmo slot de hash usando tags hash.

# Lua script for atomic rate limiting
# KEYS[1] = rate limit key
# ARGV[1] = max requests
# ARGV[2] = window in seconds
local current = redis.call('INCR', KEYS[1])
if current == 1 then
    redis.call('EXPIRE', KEYS[1], ARGV[2])
end
if current > tonumber(ARGV[1]) then
    return 0  -- Rate limited
end
return 1  -- Allowed

# Load and execute
redis-cli -a password EVAL "\
  local current = redis.call('INCR', KEYS[1]) \
  if current == 1 then redis.call('EXPIRE', KEYS[1], ARGV[2]) end \
  if current > tonumber(ARGV[1]) then return 0 end \
  return 1" 1 ratelimit:user:123 100 60
Otimização de memória

# redis.conf — Memory optimisation settings

# Use ziplist encoding for small hashes, lists, sorted sets
hash-max-listpack-entries 128
hash-max-listpack-value 64
list-max-listpack-size -2          # 8KB per node
zset-max-listpack-entries 128
zset-max-listpack-value 64
set-max-intset-entries 512

# Lazy freeing (avoid blocking on large key deletion)
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
lazyfree-lazy-user-del yes
lazyfree-lazy-user-flush yes

# jemalloc tuning
# MALLOC_CONF="background_thread:true,dirty_decay_ms:5000,muzzy_decay_ms:5000"

# Analyse memory usage
redis-cli -a password MEMORY DOCTOR
redis-cli -a password MEMORY STATS
redis-cli -a password --bigkeys
redis-cli -a password --memkeys
Cenários de falha comuns e solução de problemas do

Cenário 1 do

: Master falha, Sentinel promove réplica

# Diagnosis
redis-cli -p 26379 SENTINEL master mymaster
# Check: flags should show 's_down' or 'o_down' if master is unreachable

redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# Returns the current master address (should be the promoted replica)

# Check Sentinel logs for failover events
tail -f /var/log/redis/sentinel.log
# Look for: +sdown, +odown, +try-failover, +elected-leader,
#           +failover-state-select-slave, +selected-slave,
#           +failover-state-send-slaveof-noone, +failover-end
Cenário 2 do

: Cérebro dividido com dois mestres

# Diagnosis: check if min-replicas-to-write is configured
redis-cli -a password CONFIG GET min-replicas-to-write
redis-cli -a password CONFIG GET min-replicas-max-lag

# Prevention: configure min-replicas on all masters
redis-cli -a password CONFIG SET min-replicas-to-write 1
redis-cli -a password CONFIG SET min-replicas-max-lag 10

# If split-brain occurred: identify the stale master
# Compare replication offsets — the master with the higher offset has more data
redis-cli -h master1-ip -a password INFO replication | grep master_repl_offset
redis-cli -h master2-ip -a password INFO replication | grep master_repl_offset

# Force the stale master to become a replica
redis-cli -h stale-master-ip -a password REPLICAOF correct-master-ip 6379
Cenário 3 do

: Tempestade de ressincronização completa após partição de rede

# Diagnosis: check replication backlog
redis-cli -a password INFO replication | grep repl_backlog
# If repl_backlog_first_byte_offset is ahead of replica's offset, full sync triggers

# Prevention: increase backlog size
redis-cli -a password CONFIG SET repl-backlog-size 512mb

# Monitor for full syncs
redis-cli -a password INFO stats | grep sync_full
redis-cli -a password INFO stats | grep sync_partial_ok
redis-cli -a password INFO stats | grep sync_partial_err

Cenário 4: Esgotamento de memória e OOM Kill

# Diagnosis
redis-cli -a password INFO memory
# Check: used_memory vs maxmemory, mem_fragmentation_ratio

redis-cli -a password MEMORY DOCTOR
# Returns advice on memory issues

# Prevention: set proper maxmemory and eviction
redis-cli -a password CONFIG SET maxmemory 12gb
redis-cli -a password CONFIG SET maxmemory-policy allkeys-lru

# Find large keys consuming memory
redis-cli -a password --bigkeys
redis-cli -a password --memkeys --memkeys-samples 100

# Emergency: manually evict keys
redis-cli -a password SCAN 0 COUNT 1000 TYPE string
# Identify and DEL unnecessary large keys
Cenário 5 do

: Comandos lentos bloqueando a replicação

# Diagnosis: check slowlog
redis-cli -a password SLOWLOG GET 20
redis-cli -a password SLOWLOG LEN

# Check for blocking commands
redis-cli -a password CLIENT LIST | grep -E 'cmd=(keys|sort|smembers)'

# Prevention: configure slowlog threshold
redis-cli -a password CONFIG SET slowlog-log-slower-than 10000   # 10ms
redis-cli -a password CONFIG SET slowlog-max-len 256

# Rename dangerous commands
rename-command KEYS ""              # Disable KEYS entirely
rename-command FLUSHALL ""          # Disable FLUSHALL
rename-command FLUSHDB ""           # Disable FLUSHDB
rename-command DEBUG ""             # Disable DEBUG
Estratégias de planejamento e escalonamento de capacidade

O planejamento de capacidade do

para Redis HA envolve estimar os requisitos de memória, largura de banda da rede e utilização do CPU em nós mestres e de réplica. As principais métricas a serem planejadas são tamanho do conjunto de dados, operações por segundo, tamanho médio de chave/valor e sobrecarga de replicação.

# Capacity estimation formulas

# Memory per node:
#   Base dataset size (use redis-cli DBSIZE and MEMORY USAGE on a sample)
#   + Replication output buffer: ~64MB per replica
#   + AOF rewrite buffer: ~64MB during rewrites
#   + Copy-on-write overhead during BGSAVE: up to 2x during heavy writes
#   + Client output buffers: ~1KB per client
#   + OS overhead: ~1-2GB
#   Rule of thumb: maxmemory = 75% of available RAM

# Network bandwidth:
#   Replication: write_throughput_bytes * num_replicas
#   Client traffic: ops_per_sec * avg_response_size
#   Full sync: dataset_size (one-time during replica bootstrap or failover)

# Example sizing for 20GB dataset, 100K ops/sec:
#   RAM per node: 20GB data + 4GB buffers + 2GB OS = 26GB -> 32GB node (75% = 24GB maxmemory)
#   CPU: 1 core handles ~100K ops/sec for simple commands (GET/SET)
#   Network: 100K ops * 1KB avg = 100MB/s client + 50MB/s replication = 150MB/s per master

# Scaling decision tree:
#   Need more read throughput? -> Add replicas (up to 5 per master)
#   Need more write throughput? -> Redis Cluster (add shards)
#   Need more memory? -> Redis Cluster (distribute dataset across shards)
#   Need lower latency? -> Reduce network hops (co-locate, use unix sockets)
#   Need global distribution? -> Multi-region replication or Redis Enterprise Active-Active
Dimensionamento horizontal

com cluster Redis

# Add shards to an existing Redis Cluster

# 1. Start new Redis nodes
redis-server /etc/redis/new-master.conf
redis-server /etc/redis/new-replica.conf

# 2. Add the new master to the cluster
redis-cli --cluster add-node new-master:7000 existing-node:7000 -a password

# 3. Add the new replica to follow the new master
redis-cli --cluster add-node new-replica:7000 existing-node:7000 \
  --cluster-slave --cluster-master-id NEW_MASTER_ID -a password

# 4. Reshard slots to the new master
redis-cli --cluster reshard existing-node:7000 \
  --cluster-from all --cluster-to NEW_MASTER_ID \
  --cluster-slots 4096 --cluster-yes -a password

# 5. Verify the new slot distribution
redis-cli -c -h existing-node -p 7000 -a password CLUSTER SLOTS

# Remove a shard (scale down)
# 1. Reshard all slots away from the node
redis-cli --cluster reshard existing-node:7000 \
  --cluster-from REMOVING_NODE_ID --cluster-to TARGET_NODE_ID \
  --cluster-slots 5461 --cluster-yes -a password

# 2. Remove the empty node
redis-cli --cluster del-node existing-node:7000 REMOVING_NODE_ID -a password
Considerações sobre escala vertical do

# When to scale vertically vs horizontally:

# Scale UP (bigger instances) when:
#   - Dataset fits in single-node memory
#   - Workload uses multi-key operations (MGET, SUNION, Lua across keys)
#   - Operational simplicity is more important than cost efficiency
#   - Using Redis modules that don't support Cluster mode well

# Scale OUT (more shards) when:
#   - Dataset exceeds single-node memory
#   - Write throughput exceeds single-thread capacity (~200K ops/sec)
#   - You need per-shard isolation for multi-tenant workloads
#   - Cost per GB of RAM is a concern (many smaller nodes vs few large ones)

# Cloud instance recommendations:
# AWS:   cache.r7g.xlarge (4 vCPU, 26GB) to cache.r7g.16xlarge (64 vCPU, 419GB)
# Azure: P1 (6GB) to P5 (120GB) per shard
# GCP:   5GB to 300GB per instance (Memorystore Standard)

# Bare metal:
#   CPU: 2-4 cores dedicated to Redis (single-threaded, but background tasks use extra cores)
#   RAM: 32-128GB per node (NVMe for swap-as-last-resort)
#   Network: 10Gbps minimum, 25Gbps for large datasets
#   Storage: NVMe SSD for AOF/RDB persistence (IOPS matters for fsync)
Conclusão

A alta disponibilidade do

Redis não é uma única opção de configuração — é um design de sistema abrangente que abrange topologia de replicação, detecção de falhas, failover automático, configuração do cliente, estratégia de persistência, gerenciamento de memória, segurança, monitoramento e procedimentos operacionais. A arquitetura de alta disponibilidade correta depende dos seus requisitos específicos.

Para a maioria das aplicações, oRedis Sentinelcom três instâncias do Sentinel monitorando um mestre e duas réplicas fornece uma solução de HA comprovada e testada em batalha com failover automático em menos de 30 segundos. Quando você precisa de escalonamento horizontal além da taxa de transferência ou capacidade de memória de um único mestre, oRedis Clusterdistribui o conjunto de dados em vários fragmentos, mantendo o failover integrado por fragmento. Para ambientes Kubernetes, operadoras comoSpotahomeeOpsTreecodificam as melhores práticas operacionais em CRDs declarativos, enquantoRedis Enterprisefornece a opção mais rica em recursos com replicação geográfica Active-Active e suporte de módulo.

Os serviços gerenciados em nuvem

—AWS ElastiCache,Azure Cache para RediseGCP Memorystore— eliminam a carga operacional de execução da infraestrutura Redis, mas oferecem flexibilidade reduzida e custos mais elevados em escala. Para organizações com infraestrutura bare metal, ok3s com Rancher e Longhornoferece uma alternativa totalmente de código aberto e independente da nuvem que oferece HA de nível empresarial sem dependência de fornecedor.

Vale a pena avaliar alternativas comoDragonflyeKeyDBpara casos de uso específicos – Dragonfly para taxa de transferência multithread bruta em máquinas grandes e KeyDB para replicação multimestre ativa-ativa. Ambos são compatíveis com Redis e podem servir como substitutos imediatos em muitos cenários.

Independentemente da arquitetura escolhida, os fundamentos operacionais permanecem constantes: configurar a persistência adequada (RDB híbrido + AOF), aplicarmin-replicas-to-writepara evitar perda de dados split-brain, dimensionar seu backlog de replicação para seu volume de gravação, criptografar todo o tráfego com TLS, impor acesso com privilégios mínimos com ACLs, monitorar o atraso de replicação e o uso de memória com Prometheus e Grafana, fazer backup de snapshots RDB em locais externos duráveis armazenamento e, o mais importante, teste seu failover regularmente. Um sistema de failover que nunca foi testado é um sistema que não funciona. Execute simulações mensais de failover, injete falhas com ferramentas de engenharia do caos e meça o tempo real de recuperação. A confiança que você ganha com testes sistemáticos é o que separa uma implantação Redis que sobrevive a incidentes de produção daquela que transforma uma falha de servidor em uma interrupção em toda a empresa.