Workstation Logo
Productos
Labs de IAAgentes OpenAIAgentes ClaudeGrok BotWorkstation CRM (WSL CRM)MarketingTodos los Productos
Soluciones IA
Estaciones de Trabajo IAAI SME PackagesIA PrivadaClústeres GPUIA en el BordeLaboratorio IA EmpresarialIA por Industria
Servicios
Modernización de plataformaIngeniería digitalFundamentos de datos e IAOperaciones autónomasConsultoría de IAAutomatización DevOpsCiberseguridadDesarrollo de softwareCreación de agentesConfiguración MLOps
Sobre Nosotros
SociosHistorias de Clientes
Artículos
Documentación
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
Blog
ContáctenosLogin
Workstation

Estaciones de trabajo de IA, software multiagente de IA, infraestructura de GPU y soluciones de agentes inteligentes para empresas modernas.

Contáctenos

Soluciones de IA

Estaciones de Trabajo IAAI SME PackagesIA PrivadaClústeres GPUIA en el BordeLaboratorio IA EmpresarialIA por Industria

Productos

Todos los ProductosWSL CRM y ERPMarketingAgentes OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

Empresa

Sobre NosotrosPor qué WorkstationSociosHistorias de ClientesPreciosContacto

Recursos

ArtículosDocumentaciónBlogBuscarMapa del Sitio
Oficina Reino Unido
77-79 Marlowes, Hemel Hempstead HP1 1LFCómo llegar: tome la salida 20 de la M25, Outer LondonN.º de empresa: 11641870Lun - Vie: 9:00 - 18:00 GMT
+44 7515 356 146
Oficina Bélgica
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683Lun - Vie: 9:00 - 18:00 CET
+32 492 45 67 46
Oficina India
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI. Todos los derechos reservados.

PrivacidadCookiesTérminos de ServicioMapa del sitio web

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

Alta disponibilidad de Redis en producción: operadores Sentinel, Cluster y Kubernetes

Redis HA con operadores Sentinel, modo clúster y Kubernetes

Balinder Walia12 de abril de 202645 min read

Redis es la columna vertebral de la infraestructura de aplicaciones moderna. Sirve como caché, almacén de sesiones, intermediario de mensajes, limitador de velocidad, motor de clasificación y canal de análisis en tiempo real para millones de aplicaciones en todo el mundo. Una sola instancia de Redis puede manejar cientos de miles de operaciones por segundo con una latencia inferior a un milisegundo, pero una sola instancia también es un único punto de falla. Cuando Redis deja de funcionar, las aplicaciones experimentan fallas en cascada: las estampidas de caché abruman las bases de datos backend, las sesiones se pierden, los limitadores de velocidad dejan de funcionar y las funciones en tiempo real se desactivan. La creación de una implementación Redis de alta disponibilidad no es opcional para los sistemas de producción: es un requisito de ingeniería.

Esta guía es una inmersión profunda, integral y centrada en la producción en la alta disponibilidad de Redis. Cubriremos los fundamentos de la replicación de Redis (replicación asíncrona, el comando WAIT y resincronización parcial), Redis Sentinel para conmutación por error automática y descubrimiento de servicios, Redis Cluster para escalamiento horizontal con distribución de ranuras hash, operadores Kubernetes (Spotahome, OpsTree y Redis Enterprise), estrategias de persistencia (instantáneas RDB, AOF y persistencia híbrida), implementaciones administradas en la nube en AWS ElastiCache, Azure Cache para Redis y GCP Memorystore, implementaciones bare metal de k3s con Rancher y Longhorn, administración de memoria y políticas de desalojo, cifrado TLS y control de acceso basado en ACL, comportamiento de Pub/Sub y Streams en configuraciones HA, módulos Redis (RedisJSON, RediSearch, RedisTimeSeries) en HA, agrupación de conexiones y configuración de cliente para resistencia a fallas, respaldo y restauración. estrategias, monitoreo con Redis INFO, exportador Prometheus y paneles de control Grafana, Dragonfly y KeyDB como alternativas compatibles con Redis, ajuste del rendimiento con canalización, secuencias de comandos Lua y optimización de memoria, escenarios de fallas comunes y procedimientos de solución de problemas, y planificación de capacidad y estrategias de escalamiento.

Redis Fundamentos de replicación

La replicación

Redis es la base sobre la que se construyen todas las arquitecturas de alta disponibilidad. Una instancia maestra de Redis acepta escrituras y las propaga de forma asincrónica a una o más instancias de réplica. Las réplicas mantienen una copia casi en tiempo real del conjunto de datos del maestro y atienden consultas de lectura, proporcionando redundancia de datos y escalabilidad de lectura.

A diferencia de la replicación de transmisión basada en WAL de PostgreSQL, Redis utiliza un protocolo de replicación basado en comandos. Cada comando de escritura ejecutado en el maestro se serializa en el flujo de replicación y se envía a las réplicas conectadas, que ejecutan los mismos comandos en sus conjuntos de datos locales. Este enfoque es simple y eficiente, pero tiene implicaciones importantes para la coherencia: dado que la replicación es asincrónica de forma predeterminada, siempre hay una ventana en la que las escrituras reconocidas en el maestro aún no han llegado a las réplicas.

Replicación asíncrona y el comando WAIT

De forma predeterminada, la replicación Redis es completamente asíncrona. El maestro reconoce una escritura al cliente inmediatamente después de aplicarla localmente, sin esperar a que ninguna réplica confirme la recepción. Esto proporciona un rendimiento de escritura máximo, pero introduce una ventana potencial de pérdida de datos: si el maestro falla antes de que una escritura llegue a cualquier réplica, esa escritura se pierde.

El comandoWAITproporciona una primitiva de replicación síncrona. Después de emitir una escritura, el cliente puede llamar aWAIT numreplicas timeoutpara bloquear hasta que el número especificado de réplicas haya reconocido la escritura o expire el tiempo de espera. Esto no hace que Redis sea completamente sincrónico:WAITsolo garantiza que las réplicas hayan recibido los datos, no que hayan persistido en el disco de las réplicas. Sin embargo, reduce significativamente la ventana de pérdida de datos.

# 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)

UtiliceWAITde forma selectiva para escrituras críticas (transacciones financieras, confirmaciones de pedidos) y al mismo tiempo permita que las escrituras no críticas (actualizaciones de caché, actualizaciones de sesión) se realicen de forma asincrónica. La flexibilidad por comando evita la penalización de latencia de la replicación sincrónica completa.

Resincronización parcial (PSYNC)

Cuando una réplica se desconecta brevemente (interrupción de la red, reinicio), no necesita una transferencia completa del conjunto de datos para volver a unirse. Redis mantiene un trabajo pendiente de replicación (un búfer circular de comandos de escritura recientes) en el maestro. Cuando la réplica se vuelve a conectar, envía su compensación de replicación al maestro. Si el desplazamiento todavía está dentro del trabajo pendiente, el maestro envía solo los comandos que faltan (resincronización parcial). Si el desplazamiento ha quedado fuera del trabajo pendiente, se activa una resincronización completa, lo que implica generar y transferir una instantánea 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 correctamente el trabajo pendiente de replicación es fundamental. Debe ser lo suficientemente grande como para contener todos los comandos de escritura generados durante la desconexión de réplica más larga esperada. Para una instancia Redis que procesa 50 MB/s de tráfico de escritura, un trabajo pendiente de 256 MB cubre aproximadamente 5 segundos de escritura; increméntelo si sus réplicas pueden estar fuera de línea durante períodos más prolongados.

Configuración de la replicación maestro-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

Las configuracionesmin-replicas-to-writeymin-replicas-max-lagimpiden que el maestro acepte escrituras cuando no puede garantizar la durabilidad de los datos en las réplicas. Esta es una red de seguridad crítica: sin ella, un maestro particionado en la red continúa aceptando escrituras que se perderán cuando Sentinel promueva una réplica.

Redis Sentinel: Conmutación automática por error y descubrimiento de servicios

Redis Sentinel es un sistema distribuido que monitorea instancias maestras y réplicas de Redis, detecta fallas en las maestras, realiza conmutación por error automática al promover una réplica a maestra y proporciona descubrimiento de servicios para que los clientes siempre puedan encontrar la maestra actual. Sentinel se ejecuta como un proceso separado junto con Redis y opera a través de un protocolo de consenso: un quórum de instancias de Sentinel debe acordar que un maestro es inalcanzable antes de iniciar la conmutación por error.

Arquitectura SentinelRedis: conmutación por error y control automáticos Servicio de descubrimientoClientes de aplicacionesClúster centinela(quórum = 2)Centinela 1 :26379Centinela 2 :26379Centinela 3: 26379SENTINEL obtener-dirección-maestra-por-nombreRedis Maestronodo1 — 10.0.1.10:6379Lectura/Escritura:principalMonitoreo de PINGescribir tráficoRéplica 1nodo2 — 10.0.1.11:6379Sólo lectura: prioridad 100Réplica 2nodo3 — 10.0.1.12:6379Sólo lectura: prioridad 100replicación asíncronareplicación asíncronaConmutación por error: el maestro falla → Sentinel eligeRéplicapromocionada → Los clientes se vuelven a conectar a través de SentinelODOWN detectadoLeyendaMaestro (RW)Réplica (RO)CentinelaRuta de conmutación por errorConfiguración del centinela

Sentinel requiere un mínimo de tres instancias para tolerar un error de Sentinel y seguir manteniendo el quórum. Cada Sentinel monitorea el mismo maestro Redis y se comunica con otros Sentinels a través de un protocolo de chismes para acordar el estado de salud del maestro.

# /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
La detección de fallas de

Sentinel funciona en dos fases. Primero, un Sentinel individual marca un maestro comoSubjetivamente Inactivo (SDOWN)cuando no recibe una respuesta válida a PING dentro dedown-after-milliseconds. Luego, cuando un quórum de Sentinels acuerda que el maestro es inalcanzable, se marca comoObjetivamente Inactivo (ODOWN)y comienza el proceso de conmutación por error. Se elige un Sentinel como líder de conmutación por error, que selecciona la mejor réplica (según la prioridad, el desplazamiento de replicación y el runid), la promueve a maestra, reconfigura las réplicas restantes para que sigan al nuevo maestro y actualiza el estado de Sentinel.

Descubrimiento del servicio Sentinel y configuración del cliente

La ventaja clave de Sentinel sobre las configuraciones estáticas de réplica maestra es el descubrimiento de servicios. Los clientes no se conectan a una dirección Redis fija: solicitan a Sentinel la dirección maestra actual y se suscriben a notificaciones de conmutación por error. Todas las principales bibliotecas cliente Redis son compatibles con Sentinel de forma nativa.

# 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)
}
Clúster

Redis: escalamiento horizontal con ranuras Hash

Mientras que Sentinel proporciona alta disponibilidad para un único conjunto de datos, Redis Cluster proporciona HA y escalamiento horizontal. El clúster Redis divide los datos en varios nodos maestros mediante un mecanismo de ranura hash: el espacio de claves se divide en 16,384 ranuras hash y cada maestro es responsable de un subconjunto de esas ranuras. Cada maestro tiene una o más réplicas para conmutación por error. En conjunto, el clúster proporciona fragmentación automática, conmutación por error integrada y la capacidad de escalar linealmente tanto el almacenamiento como el rendimiento mediante la adición de nodos.

Arquitectura de clústerRedis: ranuras hash y configuración Enrutamiento de clienteRanuras0-5460Ranuras5461-10922Ranuras10923-1638316,384 ranuras hash en total distribuidas en 3 maestros (CRC16 mod 16384)Cliente inteligente(compatible con clústeres)El cliente almacena en caché la ranura y el mapeo de nodos; maneja redirecciones MOVED/ASKMaestro A10.0.1.10:7000Ranuras: 0-5460~5461 ranuras (33,3%)Maestro B10.0.1.11:7000Ranuras: 5461-10922~5462 ranuras (33,3%)Maestro C10.0.1.12:7000Ranuras: 10923-16383~5461 ranuras (33,3%)Réplica A110.0.1.13:7000Replica las ranuras Master ARéplica B110.0.1.14:7000Replica las ranuras Master BRéplica C110.0.1.15:7000Replica las ranuras Master CBus de clúster(puerto+10000): protocolo de chismes, detección de fallos, propagación de configuraciónCada nodo intercambia PING/PONG con todos los demás nodos a través del protocolo binario TCPMOVIDO 12345 10.0.1.12:7000 — redirección permanente | PREGUNTE 12345 10.0.1.12:7000 — redirección única durante la fragmentación

Configuración de un clúster 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

Resharding y operaciones de múltiples claves

Resharding mueve ranuras hash entre maestros para reequilibrar los datos después de agregar o eliminar nodos. Durante la fragmentación, las claves en las ranuras migratorias pueden recibir redirecciones ASK, que el cliente maneja 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

Las operaciones de múltiples claves en el clúster Redis solo funcionan cuando todas las claves involucradas residen en la misma ranura hash. Utilice etiquetas hash para garantizar que las claves relacionadas se asignen a la misma ranura:{user:123}.profiley{user:123}.sessionshacen hash enuser:123, lo que garantiza que lleguen al mismo nodo. Esto habilita MGET, MSET, transacciones y scripts Lua en claves 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

Redis Operador para Kubernetes

La ejecución de Redis en Kubernetes requiere un manejo cuidadoso del almacenamiento persistente, la identidad de la red, la conmutación por error elegante y la gestión de la configuración. Los operadores Kubernetes codifican este conocimiento operativo en controladores personalizados que administran clústeres Redis de forma declarativa a través de definiciones de recursos personalizados (CRD).

Spotahome Redis Operador

El operador Spotahome (también conocido como redis-operator) es un operador maduro y ampliamente utilizado para implementar HA basado en Redis Sentinel en Kubernetes. Gestiona conjuntos de réplicas maestras Redis con conmutación por error basada en 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

OpsTree Redis Operador

El operador OpsTree admite topologías Redis Sentinel (HA independiente) y Redis Cluster (HA fragmentada), lo que lo hace más 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

Redis Operador empresarial

Redis Enterprise proporciona un operador Kubernetes comercial con funciones avanzadas que incluyen replicación geográfica activa-activa (CRDT), compatibilidad con módulos Redis, organización por niveles automática (RAM + flash) y administración automatizada de clústeres. Es la opción recomendada para organizaciones que necesitan soporte y SLA de nivel 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
Estrategias de persistencia de

: RDB, AOF y

híbrido

Redis ofrece tres mecanismos de persistencia. La elección de la estrategia adecuada depende de su objetivo de punto de recuperación (RPO), los requisitos de rendimiento y las limitaciones de almacenamiento.

Instantáneas RDBcrea instantáneas de un momento dado de todo el conjunto de datos a intervalos configurados. Son compactos, se cargan rápidamente al reiniciar e ideales para realizar copias de seguridad. Sin embargo, los datos escritos entre instantáneas se pierden en caso de falla. RDB utiliza un proceso secundario bifurcado, por lo que la creación de instantáneas no bloquea el hilo principal Redis, pero la bifurcación en sí puede causar un pico de latencia en grandes conjuntos de datos debido a la asignación de memoria de copia en escritura.

AOF (Agregar solo archivo)registra cada operación de escritura en el disco. Proporciona una durabilidad mucho mejor que RDB: conappendfsync everysec, se pierde como máximo un segundo de datos en caso de falla. Conappendfsync always, no pierde nada, pero a un costo de rendimiento significativo. Los archivos AOF son más grandes que los RDB y se cargan más lentamente al reiniciar.

Persistencia híbrida(el enfoque recomendado) combina ambos:aof-use-rdb-preamble yesescribe una instantánea RDB al principio del archivo AOF, seguida de entradas AOF para escrituras posteriores. Esto proporciona tiempos de arranque rápidos (sección RDB) con gran durabilidad (sección 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

Implementaciones Redis administradas en la nube

AWS ElastiCache para Redis

AWS ElastiCache ofrece Redis completamente administrado con dos modos HA:Modo de clúster deshabilitado(fragmento único, hasta 5 réplicas, conmutación por error tipo Sentinel) yModo de clúster habilitado(hasta 500 fragmentos, cada uno con hasta 5 réplicas, distribución de ranuras hash). Global Datastore proporciona replicación entre regiones para la recuperación ante 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"

Azure Caché para Redis

La caché

Azure para Redis proporciona tres niveles: Básico (sin replicación), Estándar (replicado) y Premium/Enterprise. El nivel Premium admite agrupación en clústeres, replicación geográfica, redundancia de zonas, inyección de VNet y persistencia de datos. El nivel Enterprise agrega módulos Redis y distribución geográfica Activo-Activo.

# 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}]'
Almacén de memoria GCP

para Redis

GCP ofrece dos niveles de Memorystore:Standard(instancia única con réplica de conmutación por error automática) yRedis Cluster(clúster fragmentado y totalmente administrado con escalado automático). El nivel Estándar es adecuado para la mayoría de los casos de uso de HA, mientras que Redis Cluster maneja grandes conjuntos de datos que requieren escalamiento 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

Implementación de Redis en varias regiones

La implementación de Redis en varias regiones es esencial para la recuperación ante desastres y la reducción de la latencia global. El enfoque varía según la arquitectura: Redis Enterprise utiliza Active-Active con CRDT (tipos de datos replicados sin conflictos) para verdaderas escrituras multimaestro, mientras que Redis de código abierto y los servicios administrados en la nube utilizan replicación activa-pasiva con réplicas de lectura en regiones secundarias.

Implementación Redis multirregión: activo-activo y activo Replicación entre regionesRegión 1 — AWS us-east-1ElastiCache primario3 fragmentos: modo de clúster habilitado2 réplicas de lectura por fragmentoConmutación por error automática Multi-AZPunto final del lector(lecturas por turnos)Almacén de datos global: región principalRegión 2 — Azure Europa occidentalAzure Caché Premium3 fragmentos — Zona redundante1 réplica por fragmentoZonas 1, 2, 3Replicación geográfica vinculada alprincipalRéplica geográfica pasiva: sincronización asíncronaRegión 3 — GCP Asia-Este1Almacén de memoriaEstándarFragmento único: conmutación por error automáticaRéplica HA (entre zonas)Persistencia RDB habilitadaReplicación a nivel de aplicación desde la Región 1Espera cálida de sólo lecturarespuesta geográfica asíncronareplicación asíncrona entre regionesRedis Enterprise Activo-Activo (Multi-Master basado en CRDT)CRDB Instancia AEE.UU. — R/W (velocidad local máxima)CRDB Instancia BEU — R/W (velocidad local máxima)CRDB Instancia CAPAC — R/W (velocidad local máxima)SincronizaciónCRDT: contadores, conjuntos y cadenas se fusionan sin conflictos entre regionesGlobal DNS / Enrutamiento de tráfico (basado en latencia)Leyenda:Maestro/PrimarioRéplicaAsíncrono entre regionesActivo-Activo CRDBRPO: activo-pasivo ≈ segundos de retraso | Activo-Activo CRDT ≈ pérdida de datos cero (consistencia eventual)

Metal desnudo k3s/Rancher con Longhorn

Para las organizaciones que ejecutan su propio hardware, la implementación de Redis HA en k3s sin sistema operativo proporciona control total sobre la infraestructura, elimina la dependencia del proveedor de la nube y puede ser significativamente más rentable para implementaciones a gran escala. k3s es una distribución Kubernetes certificada y liviana, ideal para entornos periféricos y bare metal, mientras que Rancher proporciona un plano de administración para operaciones de múltiples clústeres.

Bare Metal k3s + Rancher — Redis HA con operador SentinelInterfaz de usuario de gestión de ganaderosCiclo de vida del cluster + monitoreoEquilibrador de cargaMetalLBVIP: 10.0.0.50 (redis-master) & 10.0.0.51 (redis-lectura)Clústerk3s: 3 nodos de servidor (bare metal)Operador Redis (Spotahome/OpsTree)Nodo 1: bare-metal-srv1Redis Módulo maestroStatefulSet redis-ha-0: 6379Cápsula centinela: 26379Bocina larga PVC (AOF + RDB)50Gi: 3 veces replicado en nodosSidecar exportador de redis: 9121Prometheus métricasSSD NVMe: disco local de 2 TBNodo 2 - bare-metal-srv2Redis Réplica de cápsulaStatefulSet redis-ha-1: 6379Cápsula centinela: 26379Bocina larga PVC (AOF + RDB)50Gi: 3 veces replicado en nodossidecar redis-exportador: 9121Prometheus métricasSSD NVMe: disco local de 2 TBNodo 3: bare-metal-srv3Redis Réplica de cápsulaStatefulSet redis-ha-2: 6379Cápsula centinela: 26379Bocina larga PVC (AOF + RDB)50Gi: 3 veces replicado en nodosSidecar exportador de redis: 9121Prometheus métricasSSD NVMe: disco local de 2 TBLeyenda:MaestroRéplicaCentinelaBocina larga PVCExportadorMetalLBOperadorRancherok3s proporciona Kubernetes liviano. Longhorn proporciona almacenamiento en bloques distribuido con replicación 3x en SSD NVMe.MetalLB asigna IP estables de LoadBalancer para los servicios maestro Redis (escritura) y lectura Redis (réplicas). Rancher gestiona el ciclo de vida del clúster.

Instalación de k3s e implementación del 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 Helm Valores 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 desalojo y gestión de memoria

Redis almacena todos los datos en la memoria, lo que hace que la gestión de la memoria sea la preocupación operativa más crítica. Cuando Redis alcanza el límite configurado demaxmemory, debe decidir qué hacer con los comandos de escritura entrantes. La política de desalojos controla este comportamiento.

# 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 implementaciones de alta disponibilidad, configuremaxmemoryen aproximadamente el 75 % de la RAM disponible del nodo. El 25% restante alberga el búfer de salida de replicación, el búfer de reescritura AOF, la memoria de copia en escritura durante las instantáneas RDB y la sobrecarga del sistema operativo. Para un módulo de 16 GB, configure la memoria máxima en 12 GB. Para un servidor básico de 64 GB, configúrelo en 48 GB.

TLS Cifrado y ACL

Las implementaciones de producción Redis deben cifrar los datos en tránsito con TLS y aplicar un control de acceso detallado con ACL (listas de control de acceso), introducidas en 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 y transmisiones en configuraciones HA

Redis Pub/Sub y Streams se comportan de manera diferente en configuraciones HA. Comprender estas diferencias es esencial para construir sistemas confiables basados ​​en eventos.

Pub/SubLos mensajes se activan y olvidan: no persisten, no se replican ni se almacenan en buffer. En una configuración de HA basada en Sentinel, los suscriptores conectados al maestro reciben mensajes normalmente, pero durante una conmutación por error, el nuevo maestro no tiene conocimiento de las suscripciones anteriores. Los clientes deben volver a suscribirse después de volver a conectarse. Con Redis Cluster, los mensajes Pub/Sub se transmiten a todos los nodos del clúster, por lo que los suscriptores conectados a cualquier nodo reciben mensajes publicados (aunque esto genera tráfico entre nodos).

Redis Streamsson una estructura de datos persistente y replicada que proporciona una entrega de mensajes confiable en entornos HA. Las entradas de flujo se replican en réplicas a través del mecanismo de replicación normal, sobreviven a las conmutaciones por error y admiten grupos de consumidores con una semántica de entrega de al menos una vez. Para la mensajería HA, siempre se debe preferir Streams a 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 en HA

Los módulos

Redis amplían Redis con estructuras de datos y funcionalidades especializadas. Los tres más populares (RedisJSON, RediSearch y RedisTimeSeries) funcionan con replicación y Sentinel, pero tienen consideraciones específicas en implementaciones de alta disponibilidad.

# 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

Al ejecutar Redis Stack (el paquete de módulos) en HA, asegúrese de que todos los nodos (maestros y réplicas) tengan instaladas versiones de módulos idénticas. Los comandos del módulo se replican a través del flujo de replicación estándar, por lo que las réplicas deben poder ejecutarlos. Después de una conmutación por error, los índices de RediSearch existen en la réplica promocionada y atienden consultas de inmediato.

Agrupación de conexiones

y configuración de cliente para HA

La agrupación de conexiones adecuada es esencial para el rendimiento y la resiliencia de Redis HA. Los grupos de conexiones reducen la sobrecarga de establecer conexiones TCP, proporcionan una lógica de reintento automático y permiten un manejo elegante de la conmutación por error.

# 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,
    })
}

Estrategias de copia de seguridad y restauración

Incluso con replicación HA, las copias de seguridad periódicas son esenciales para la recuperación ante desastres, el cumplimiento y la protección contra errores lógicos (FLUSHALL accidental, malas escrituras de aplicaciones). Las copias de seguridad de Redis se basan en instantáneas RDB y archivos 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
Monitoreo

con Redis INFO, Prometheus y Grafana

El monitoreo integral es la base de la excelencia operativa de Redis HA. Redis expone métricas internas enriquecidas a través del comandoINFO, que el exportador Prometheus Redis traduce en métricas de series temporales para paneles de control y alertas de 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 y KeyDB: alternativas compatibles con Redis

Si bien Redis es el almacén de datos en memoria dominante, dos alternativas compatibles con Redis han ganado terreno para casos de uso específicos.

Libélula

Dragonfly es un reemplazo Redis moderno y multiproceso que pretende ser un reemplazo directo y aprovechar todos los núcleos CPU disponibles. El Redis tradicional tiene un solo subproceso para el procesamiento de comandos: Dragonfly utiliza una arquitectura sin compartir con múltiples subprocesos para lograr un rendimiento significativamente mayor en máquinas de múltiples núcleos. Es compatible con el protocolo Redis, la mayoría de los comandos Redis y puede reemplazar Redis sin cambios en la aplicación.

# 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
Ventajas clave de

Dragonfly: subprocesos múltiples (rendimiento 25 veces mayor en 8 núcleos frente a Redis de un solo subproceso), mejor eficiencia de la memoria (utiliza tablas hash Dash en lugar de Redis dict), instantáneas integradas sin sobrecarga de fork() y soporte nativo para grandes conjuntos de datos. Sin embargo, a partir de 2026, el soporte de replicación de Dragonfly aún está madurando: admite la replicación de réplica primaria pero aún no tiene un sistema de conmutación por error automático equivalente a Sentinel. Para HA, utilice comprobaciones de estado Kubernetes y políticas de reinicio StatefulSet, o implemente detrás de un equilibrador de carga con conmutación por error a nivel de aplicación.

Base de datos de claves

KeyDB es una bifurcación multiproceso de Redis mantenida por Snap (la compañía detrás de Snapchat). Es totalmente compatible con Redis y agrega subprocesos múltiples, replicación activo-activo (multimaestro), almacenamiento FLASH en niveles y caducidad de subclaves. La replicación activo-activo de KeyDB es particularmente interesante para HA: dos instancias de KeyDB pueden aceptar escrituras simultáneamente y replicarse entre sí, lo que proporciona una conmutación por error sin tiempo de inactividad.

# 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

KeyDB es una buena opción cuando necesita replicación multimaestro para distribución geográfica o mantenimiento sin tiempo de inactividad, o cuando necesita un rendimiento mayor que el que Redis de un solo subproceso puede proporcionar pero desea permanecer más cerca del código base de Redis que Dragonfly.

Ajuste de rendimiento

Tubería

Pipelining agrupa múltiples comandos en un único recorrido de ida y vuelta de red, lo que reduce drásticamente la latencia para operaciones masivas. En lugar de esperar cada respuesta antes de enviar el siguiente comando, el cliente envía todos los comandos a la vez y lee todas las respuestas 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

Secuencias de comandos Lua

Los scripts

Lua se ejecutan de forma atómica en el servidor Redis, lo que elimina los viajes de ida y vuelta para operaciones complejas y garantiza que no se ejecute ningún otro comando entre las operaciones del script. En Redis Cluster, asegúrese de que todas las claves a las que accede un script Lua residan en la misma ranura hash mediante etiquetas 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

Optimización de memoria

# 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

Escenarios de fallas comunes y solución de problemas

Escenario 1: Master falla, Sentinel promueve la 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

Escenario 2: Cerebro dividido con dos maestros

# 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

Escenario 3: Tormenta de resincronización completa después de la partición de red

# 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

Escenario 4: Agotamiento de la memoria y 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

Escenario 5: Comandos lentos que bloquean la replicación

# 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

Estrategias de escalamiento y planificación de capacidad

La planificación de capacidad para Redis HA implica estimar los requisitos de memoria, el ancho de banda de la red y la utilización de CPU entre los nodos maestros y de réplica. Las métricas clave para planificar son el tamaño del conjunto de datos, las operaciones por segundo, el tamaño promedio de clave/valor y la sobrecarga de replicación.

# 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
Escalado horizontal

con clúster 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
Consideraciones de escalado vertical de

# 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)

Conclusión

La alta disponibilidad de

Redis no es una única opción de configuración: es un diseño de sistema integral que abarca topología de replicación, detección de fallas, conmutación por error automática, configuración del cliente, estrategia de persistencia, administración de memoria, seguridad, monitoreo y procedimientos operativos. La arquitectura HA adecuada depende de sus requisitos específicos.

Para la mayoría de las aplicaciones,Redis Sentinelcon tres instancias Sentinel que monitorean un maestro y dos réplicas proporciona una solución HA probada y probada en batalla con conmutación por error automática en menos de 30 segundos. Cuando necesita un escalamiento horizontal más allá del rendimiento o la capacidad de memoria de un solo maestro,Redis Clusterdistribuye el conjunto de datos entre múltiples fragmentos mientras mantiene la conmutación por error integrada por fragmento. Para entornos Kubernetes, operadores comoSpotahomeyOpsTreecodifican las mejores prácticas operativas en CRD declarativos, mientras queRedis Enterpriseproporciona la opción más rica en funciones con replicación geográfica activo-activo y compatibilidad con módulos.

Servicios administrados en la nube:AWS ElastiCache,Azure Cache para RedisyGCP Memorystore: eliminan la carga operativa de ejecutar la infraestructura Redis, pero ofrecen una flexibilidad reducida y mayores costos a escala. Para organizaciones con infraestructura básica,k3s con Rancher y Longhornproporciona una alternativa totalmente de código abierto e independiente de la nube que ofrece HA de nivel empresarial sin dependencia de un proveedor.

Vale la pena evaluar alternativas comoDragonflyyKeyDBpara casos de uso específicos: Dragonfly para rendimiento multiproceso sin procesar en máquinas grandes y KeyDB para replicación multimaestro activo-activo. Ambos son compatibles con Redis y pueden servir como reemplazos directos en muchos escenarios.

Independientemente de la arquitectura que elija, los fundamentos operativos permanecen constantes: configure la persistencia adecuada (RDB híbrido + AOF), apliquemin-replicas-to-writepara evitar la pérdida de datos de cerebro dividido, dimensione su trabajo pendiente de replicación para su volumen de escritura, cifre todo el tráfico con TLS, aplique acceso con privilegios mínimos con ACL, supervise el retraso de replicación y el uso de memoria con Prometheus y Grafana, realice copias de seguridad de instantáneas de RDB en archivos duraderos. almacenamiento externo y, lo que es más importante, pruebe su conmutación por error con regularidad. Un sistema de conmutación por error que nunca ha sido probado es un sistema que no funciona. Realice simulacros de conmutación por error mensuales, inyecte fallas con herramientas de ingeniería del caos y mida su tiempo de recuperación real. La confianza que se obtiene con las pruebas sistemáticas es lo que separa una implementación de Redis que sobrevive a incidentes de producción de una que convierte una falla del servidor en una interrupción en toda la empresa.