Workstation Logo
Produits
Labs IAAgents OpenAIAgents ClaudeGrok BotWorkstation CRM (WSL CRM)MarketingTous les Produits
Solutions IA
Stations de Travail IAAI SME PackagesIA PrivéeClusters GPUIA EdgeLaboratoire IA EntrepriseIA par Industrie
Services
Modernisation de plateformeIngénierie numériqueDonnées et activation IAOpérations autonomesConseil IAAutomatisation DevOpsCybersécuritéDéveloppement logicielCréation d'agentsMise en place MLOps
À Propos
PartenairesTémoignages Clients
Articles
Documentation
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
Blog
Nous ContacterLogin
Workstation

Stations de travail IA, logiciels multi-agents IA, infrastructure GPU et solutions d'agents intelligents pour les entreprises modernes.

Nous Contacter

Solutions IA

Stations de Travail IAAI SME PackagesIA PrivéeClusters GPUIA EdgeLaboratoire IA EntrepriseIA par Industrie

Produits

Tous les ProduitsWSL CRM & ERPMarketingAgents OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

Entreprise

À ProposPourquoi WorkstationPartenairesTémoignages ClientsTarificationContact

Ressources

ArticlesDocumentationBlogRechercherPlan du Site
Bureau Royaume-Uni
77-79 Marlowes, Hemel Hempstead HP1 1LFItinéraire : prenez la sortie 20 de la M25, Outer LondonN° d'entreprise: 11641870Lun - Ven : 9h00 - 18h00 GMT
+44 7515 356 146
Bureau Belgique
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683Lun - Ven : 9h00 - 18h00 CET
+32 492 45 67 46
Bureau Inde
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI. Tous droits réservés.

ConfidentialitéCookiesConditions d'UtilisationPlan du site web

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

Haute disponibilité Redis en production : opérateurs Sentinel, Cluster et Kubernetes

Redis HA avec opérateurs Sentinel, Cluster Mode et Kubernetes

Balinder Walia12 avril 202645 min read

Redis est l'épine dorsale de l'infrastructure d'applications moderne. Il sert de cache, de magasin de sessions, de courtier de messages, de limiteur de débit, de moteur de classement et de pipeline d'analyse en temps réel pour des millions d'applications dans le monde. Une seule instance Redis peut gérer des centaines de milliers d'opérations par seconde avec une latence inférieure à la milliseconde, mais une seule instance constitue également un point de défaillance unique. Lorsque Redis tombe en panne, les applications subissent des pannes en cascade : les bousculades de cache submergent les bases de données back-end, les sessions sont perdues, les limiteurs de débit cessent de fonctionner et les fonctionnalités en temps réel deviennent sombres. La création d'un déploiement Redis hautement disponible n'est pas facultative pour les systèmes de production : c'est une exigence d'ingénierie.

Ce guide est une analyse approfondie, complète et axée sur la production, de la haute disponibilité du Redis. Nous aborderons les principes fondamentaux de la réplication Redis (réplication asynchrone, commande WAIT et resynchronisation partielle), Redis Sentinel pour le basculement automatique et la découverte de services, le cluster Redis pour la mise à l'échelle horizontale avec distribution d'emplacements de hachage, les opérateurs Kubernetes (Spotahome, OpsTree et Redis Enterprise), les stratégies de persistance (instantanés RDB, AOF et persistance hybride), les déploiements gérés dans le cloud sur AWS. ElastiCache, cache Azure pour Redis et GCP Memorystore, déploiements k3s sans système d'exploitation avec Rancher et Longhorn, politiques de gestion de la mémoire et d'expulsion, chiffrement TLS et contrôle d'accès basé sur ACL, comportement Pub/Sub et Streams dans les configurations haute disponibilité, modules Redis (RedisJSON, RediSearch, RedisTimeSeries) dans haute disponibilité, regroupement de connexions et configuration client pour la résilience en cas de basculement, la sauvegarde et la restauration stratégies, surveillance avec Redis INFO, exportateur Prometheus et tableaux de bord Grafana, Dragonfly et KeyDB comme alternatives compatibles Redis, réglage des performances avec pipeline, script Lua et optimisation de la mémoire, scénarios de défaillance courants et procédures de dépannage, et stratégies de planification et de mise à l'échelle des capacités.

Redis Principes fondamentaux de la réplication

La réplication

Redis constitue la base sur laquelle reposent toutes les architectures haute disponibilité. Une instance maître Redis accepte les écritures et les propage de manière asynchrone vers une ou plusieurs instances de réplica. Les réplicas conservent une copie en temps quasi réel de l'ensemble de données maître et servent des requêtes de lecture, offrant à la fois la redondance des données et l'évolutivité de la lecture.

Contrairement à la réplication en streaming basée sur WAL de PostgreSQL, Redis utilise un protocole de réplication basé sur des commandes. Chaque commande d'écriture exécutée sur le maître est sérialisée dans le flux de réplication et envoyée aux réplicas connectés, qui exécutent les mêmes commandes sur leurs ensembles de données locaux. Cette approche est simple et efficace mais a des implications importantes en termes de cohérence : puisque la réplication est asynchrone par défaut, il existe toujours une fenêtre où les écritures confirmées sur le maître n'ont pas encore atteint les réplicas.

Réplication asynchrone

et commande WAIT

Par défaut, la réplication Redis est entièrement asynchrone. Le maître accuse réception d'une écriture au client immédiatement après l'avoir appliquée localement, sans attendre qu'une réplique confirme la réception. Cela donne un débit d'écriture maximal mais introduit une fenêtre potentielle de perte de données : si le maître plante avant qu'une écriture n'atteigne une réplique, cette écriture est perdue.

La commandeWAITfournit une primitive de réplication synchrone. Après avoir émis une écriture, le client peut appelerWAIT numreplicas timeoutpour bloquer jusqu'à ce que le nombre spécifié de répliques ait accusé réception de l'écriture ou que le délai d'attente expire. Cela ne rend pas Redis entièrement synchrone :WAITgarantit uniquement que les répliques ont reçu les données, et non qu'elles ont été conservées sur le disque des répliques. Cependant, cela réduit considérablement la fenêtre de perte de données.

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

UtilisezWAITde manière sélective pour les écritures critiques (transactions financières, confirmations de commande) tout en permettant aux écritures non critiques (mises à jour du cache, actualisations de session) de se dérouler de manière asynchrone. La flexibilité par commande évite la pénalité de latence liée à la réplication synchrone complète.

Resynchronisation partielle (PSYNC)

Lorsqu'une réplique se déconnecte brièvement (incident de réseau, redémarrage), elle n'a pas besoin d'un transfert complet de l'ensemble de données pour se rejoindre. Redis maintient un backlog de réplication (un tampon circulaire de commandes d'écriture récentes) sur le maître. Lorsque le réplica se reconnecte, il envoie son décalage de réplication au maître. Si le décalage est toujours dans le retard, le maître envoie uniquement les commandes manquantes (resynchronisation partielle). Si le décalage est en dehors du backlog, une resynchronisation complète est déclenchée, ce qui implique la génération et le transfert d'un instantané 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

Il est essentiel de dimensionner correctement le retard de réplication. Il doit être suffisamment grand pour contenir toutes les commandes d'écriture générées lors de la déconnexion de réplica la plus longue attendue. Pour une instance Redis traitant 50 Mo/s de trafic d'écriture, un retard de 256 Mo couvre environ 5 secondes d'écritures : augmentez-le si vos réplicas peuvent être hors ligne pendant de longues périodes.

Configuration de la réplication maître-réplique

# 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

Les paramètresmin-replicas-to-writeetmin-replicas-max-lagempêchent le maître d'accepter les écritures lorsqu'il ne peut pas garantir la durabilité des données sur les répliques. Il s'agit d'un filet de sécurité essentiel : sans lui, un maître partitionné en réseau continue d'accepter des écritures qui seront perdues lorsque Sentinel fera la promotion d'une réplique.

Redis Sentinel : basculement automatique et découverte de services

Redis Sentinel est un système distribué qui surveille les instances de maître et de réplique Redis, détecte les pannes de maître, effectue un basculement automatique en promouvant une réplique en maître et fournit une découverte de services afin que les clients puissent toujours trouver le maître actuel. Sentinel fonctionne comme un processus distinct aux côtés de Redis et fonctionne via un protocole de consensus : un quorum d'instances Sentinel doit convenir qu'un maître est inaccessible avant de lancer le basculement.

Architecture SentinelRedis — Basculement et basculement automatiques Découverte de servicesClients d'applicationCluster Sentinelle(quorum = 2)Sentinelle 1 :26379Sentinelle 2 :26379Sentinelle 3 :26379SENTINEL obtenir-adresse-maître-par-nomRedis Maîtrenœud1 — 10.0.1.10:6379Lecture/écriture—primaireSurveillance PINGtrafic d'écritureRéplique 1nœud2 — 10.0.1.11:6379Lecture seule — priorité 100Réplique 2nœud3 — 10.0.1.12:6379Lecture seule — priorité 100Réplication asynchroneRéplication asynchroneBasculement: échec du maître → ; Sentinel choisitRépliquepromue → Les clients se reconnectent via SentinelODOWN détectéLégendeMaître (RW)Réplique (RO)SentinelleChemin de basculementConfiguration Sentinelle

Sentinel nécessite un minimum de trois instances pour tolérer un échec Sentinel tout en maintenant le quorum. Chaque Sentinelle surveille le même maître Redis et communique avec les autres Sentinelles via un protocole de potins pour se mettre d'accord sur l'état de santé du maître.

# /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 détection des pannes du

Sentinel fonctionne en deux phases. Tout d'abord, un Sentinel individuel marque un maître commeSubjectively Down (SDOWN)lorsqu'il ne reçoit aucune réponse valide au PING dansdown-after-milliseconds. Ensuite, lorsqu'un quorum de Sentinels convient que le maître est inaccessible, il est marqué commeObjectivement Down (ODOWN)et le processus de basculement commence. Un Sentinel est élu comme leader du basculement, qui sélectionne la meilleure réplique (en fonction de la priorité, du décalage de réplication et de l'ID d'exécution), la promeut au rang de maître, reconfigure les répliques restantes pour suivre le nouveau maître et met à jour l'état de Sentinel.

Découverte du service Sentinel et configuration client

Le principal avantage de Sentinel par rapport aux configurations maître-réplica statiques est la découverte de services. Les clients ne se connectent pas à une adresse Redis fixe : ils demandent à Sentinel l'adresse principale actuelle et s'abonnent aux notifications de basculement. Chaque bibliothèque client Redis majeure prend en charge Sentinel de manière native.

# 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 : mise à l'échelle horizontale avec emplacements de hachage

Alors que Sentinel offre une haute disponibilité pour un seul ensemble de données, Redis Cluster fournit à la fois une haute disponibilité et une mise à l'échelle horizontale. Le cluster Redis partitionne les données sur plusieurs nœuds maîtres à l'aide d'un mécanisme d'emplacement de hachage : l'espace de clés est divisé en 16 384 emplacements de hachage et chaque maître est responsable d'un sous-ensemble de ces emplacements. Chaque maître possède une ou plusieurs répliques pour le basculement. Le cluster fournit collectivement un partitionnement automatique, un basculement intégré et la possibilité d'adapter le stockage et le débit de manière linéaire en ajoutant des nœuds.

Architecture de clusterRedis — Emplacements de hachage et amp; Routage clientEmplacements0-5460Emplacements5461-10922Emplacements10923-1638316 384 emplacements de hachage au total répartis sur 3 maîtres (CRC16 mod 16384)Smart Client (compatible cluster)Le clientmet en cache le mappage des emplacements et des nœuds ; gère les redirections MOVED/ASKMaître A10.0.1.10:7000Emplacements: 0-5460~ 5 461 emplacements (33,3 %)Maître B10.0.1.11:7000Emplacements: 5461-10922~ 5 462 emplacements (33,3 %)Maître C10.0.1.12:7000Emplacements: 10923-16383~ 5 461 emplacements (33,3 %)Réplique A110.0.1.13:7000réplique les emplacements Master ARéplique B110.0.1.14:7000réplique les emplacements Master BRéplique C110.0.1.15:7000réplique les emplacements Master CBus de cluster(port + 10 000) — Protocole Gossip, détection de panne, propagation de configurationChaque nœud échange PING/PONG avec tous les autres nœuds via le protocole binaire TCPDÉPLACÉ 12345 10.0.1.12:7000 — redirection permanente | DEMANDER 12345 10.0.1.12:7000 — redirection unique lors du reharding

Configuration d'un 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

Repartitionnement et opérations multi-clés

Le reharding

déplace les emplacements de hachage entre les maîtres pour rééquilibrer les données après l'ajout ou la suppression de nœuds. Lors du repartitionnement, les clés des emplacements en migration peuvent recevoir des redirections ASK, que le client gère de manière 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
Les opérations multi-clés

dans le cluster Redis ne fonctionnent que lorsque toutes les clés impliquées résident dans le même emplacement de hachage. Utilisez des balises de hachage pour garantir que les clés associées correspondent au même emplacement :{user:123}.profileet{user:123}.sessionshachent tous deux suruser:123, garantissant qu'elles atterrissent sur le même nœud. Cela active les scripts MGET, MSET, transactions et Lua sur les clés associées.

# 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 Opérateur pour Kubernetes

L'exécution de Redis dans Kubernetes nécessite une gestion minutieuse du stockage persistant, de l'identité réseau, du basculement progressif et de la gestion de la configuration. Les opérateurs Kubernetes codent ces connaissances opérationnelles dans des contrôleurs personnalisés qui gèrent les clusters Redis de manière déclarative via des définitions de ressources personnalisées (CRD).

Spotahome Redis Opérateur

L'opérateur Spotahome (également connu sous le nom d'opérateur redis) est un opérateur mature et largement utilisé pour le déploiement de haute disponibilité basée sur Redis Sentinel dans Kubernetes. Il gère les ensembles maître-réplica Redis avec basculement basé sur 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 Opérateur

L'opérateur OpsTree prend en charge les topologies Redis Sentinel (HA autonome) et Redis Cluster (HA fragmentée), ce qui le rend plus polyvalent pour différents cas d'utilisation.

# 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

Opérateur d'entreprise Redis

Redis Enterprise fournit à un opérateur Kubernetes commercial des fonctionnalités avancées, notamment la géoréplication active-active (CRDT), la prise en charge des modules Redis, la hiérarchisation automatique (RAM + flash) et la gestion automatisée des clusters. Il s’agit de l’option recommandée pour les organisations qui ont besoin de SLA et d’une assistance de niveau entreprise.

# 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
Stratégies de persistance

: RDB, AOF et

hybride

Redis propose trois mécanismes de persistance. Le choix de la bonne stratégie dépend de votre objectif de point de récupération (RPO), de vos exigences de performances et de vos contraintes de stockage.

Instantanés RDBcrée des instantanés ponctuels de l'intégralité de l'ensemble de données à des intervalles configurés. Ils sont compacts, rapides à charger au redémarrage et idéaux pour les sauvegardes. Cependant, les données écrites entre les instantanés sont perdues en cas de crash. RDB utilise un processus enfant forké, de sorte que la création d'instantanés ne bloque pas le thread principal Redis - mais le fork lui-même peut provoquer un pic de latence sur de grands ensembles de données en raison de l'allocation de mémoire de copie sur écriture.

AOF (Ajouter uniquement un fichier)enregistre chaque opération d'écriture sur le disque. Il offre une bien meilleure durabilité que RDB : avec leappendfsync everysec, vous perdez au maximum une seconde de données en cas de crash. Avec leappendfsync always, vous ne perdez rien, mais avec un coût en performances important. Les fichiers AOF sont plus volumineux que RDB et plus lents à charger au redémarrage.

Persistance hybride(l'approche recommandée) combine les deux :aof-use-rdb-preamble yesécrit un instantané RDB au début du fichier AOF, suivi d'entrées AOF pour les écritures ultérieures. Cela donne des temps de démarrage rapides (section RDB) avec une forte durabilité (section 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

Déploiements Redis gérés dans le cloud

AWS ElastiCache pour Redis

AWS ElastiCache offre Redis entièrement géré avec deux modes HA :Mode cluster désactivé(partition unique, jusqu'à 5 répliques, basculement de type Sentinel) etMode cluster activé(jusqu'à 500 partitions, chacune avec jusqu'à 5 répliques, répartition des emplacements de hachage). Global Datastore fournit une réplication interrégionale pour la reprise après sinistre.

# 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 pour Redis

Azure Cache pour Redis propose trois niveaux : Basic (pas de réplication), Standard (répliqué) et Premium/Enterprise. Le niveau Premium prend en charge le clustering, la géoréplication, la redondance de zone, l'injection de réseau virtuel et la persistance des données. Le niveau Entreprise ajoute des modules Redis et une géodistribution Active-Active.

# 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}]'
Mémoire GCP

pour Redis

GCP propose deux niveaux Memorystore :Standard(instance unique avec réplica de basculement automatique) etRedis Cluster(cluster partitionné et entièrement géré avec mise à l'échelle automatique). Le niveau Standard convient à la plupart des cas d'utilisation HA, tandis que le cluster Redis gère de grands ensembles de données nécessitant une mise à l'échelle horizontale.

# 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

Déploiement Redis multirégion

Le déploiement Redis multirégional

est essentiel pour la reprise après sinistre et la réduction de la latence globale. L'approche varie selon l'architecture : Redis Enterprise utilise Active-Active avec les CRDT (Conflict-free Replicated Data Types) pour de véritables écritures multi-maîtres, tandis que Redis open source et les services gérés dans le cloud utilisent la réplication active-passive avec des réplicas en lecture dans les régions secondaires.

Déploiement Redis multirégion— Actif-actif et amp; Réplication inter-régionsRégion 1 — AWS us-east-1ElastiCache principal3 fragments — Mode cluster activé2 répliques en lecture par partitionBasculement automatique multi-AZPoint de terminaison du lecteur(lectures circulaires)Banque de données globale— région principaleRégion 2 — Azure ouesteuropeAzure Cache Premium3 fragments — Zone redondante1 réplique par fragmentZones 1, 2, 3Géoréplicationliée auprincipalGéo-réplique passive — synchronisation asynchroneRégion 3 — GCP Asie-Est1Mémoire standardShard unique — basculement automatiqueRéplique HA (zone croisée)Persistance RDB activéeRéplication au niveau de l'application depuis la région 1Lecture seule veille chaudegéo-répétition asynchroneRéplication interrégionale asynchroneRedis Enterprise Active-Active (multi-maître basé sur CRDT)CRDB Instance AUS — R/W (vitesse locale complète)CRDB Instance BEU — R/W (vitesse locale complète)CRDB Instance CAPAC — R/W (pleine vitesse locale)Synchronisation CRDT — les compteurs, ensembles et chaînes fusionnent sans conflit entre les régionsGlobal DNS/routage du trafic (basé sur la latence)Légende :Maître/PrimaireRépliqueInter-région asynchroneActif-Actif CRDBRPO : Actif-passif ≈ secondes de décalage | Actif-Actif CRDT ≈ zéro perte de données (cohérence éventuelle)

k3s/Rancher en métal nu avec Longhorn

Pour les organisations exécutant leur propre matériel, le déploiement de Redis HA sur du matériel nu k3s offre un contrôle total sur l'infrastructure, élimine la dépendance au fournisseur de cloud et peut être beaucoup plus rentable pour les déploiements à grande échelle. k3s est une distribution Kubernetes légère et certifiée, idéale pour les environnements Edge et Bare Metal, tandis que Rancher fournit un plan de gestion pour les opérations multiclusters.

Bare Metal k3s + Rancher — Redis HA avec opérateur SentinelInterface utilisateur de gestion des éleveursCycle de vie du cluster + surveillanceÉquilibreur de charge MetalLBVIP : 10.0.0.50 (redis-master) et 10.0.0.51 (relecture)Cluster k3s — 3 nœuds de serveur (bare metal)Opérateur Redis (Spotahome/OpsTree)Nœud 1 — bare-metal-srv1Redis Pod maîtreStatefulSet redis-ha-0 :6379Pod Sentinelle :26379Longhorn PVC (AOF + RDB)50Gi — 3x répliqué sur les nœudsSide-car redis-exportateur:9121Métriques PrometheusSSD NVMe— Disque local de 2 ToNœud 2 – bare-metal-srv2Pod de réplique RedisStatefulSet redis-ha-1 :6379Pod Sentinelle:26379Longhorn PVC (AOF + RDB)50Gi — 3x répliqué sur les nœudsSide-car redis-exportateur:9121Métriques PrometheusSSD NVMe— Disque local de 2 ToNœud 3 — bare-metal-srv3Pod de réplique RedisStatefulSet redis-ha-2 :6379Pod Sentinelle:26379Longhorn PVC (AOF + RDB)50Gi — 3x répliqué sur les nœudsSide-car redis-exportateur:9121Métriques PrometheusSSD NVMe— Disque local de 2 ToLégende :MaîtreRépliqueSentinelleLonghorn PVCExportateurMétalLBOpérateurÉleveurk3s fournit un Kubernetes léger. Longhorn fournit un stockage en bloc distribué avec une réplication 3x sur les SSD NVMe.MetalLB attribue des adresses IP LoadBalancer stables pour les services maître Redis (écriture) et lecture Redis (répliques). Rancher gère le cycle de vie du cluster.

Installation du k3s et déploiement de l'opérateur 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 Valeurs pour 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
Politiques de gestion de la mémoire et d'expulsion

Redis stocke toutes les données en mémoire, ce qui fait de la gestion de la mémoire la préoccupation opérationnelle la plus critique. Lorsque Redis atteint la limitemaxmemoryconfigurée, il doit décider quoi faire des commandes d'écriture entrantes. La politique d’expulsion contrôle ce comportement.

# 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

Pour les déploiements HA, définissezmaxmemorysur environ 75 % de la RAM disponible du nœud. Les 25 % restants contiennent le tampon de sortie de réplication, le tampon de réécriture AOF, la mémoire de copie sur écriture pendant les instantanés RDB et la surcharge du système d'exploitation. Pour un pod de 16 Go, définissez maxmemory sur 12 Go. Pour un serveur nu de 64 Go, définissez-le sur 48 Go.

TLS Chiffrement et ACL

Production Les déploiements Redis doivent chiffrer les données en transit avec TLS et appliquer un contrôle d'accès précis avec les ACL (Access Control Lists), introduites dans 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 et flux dans les configurations HA

Redis Pub/Sub et Streams se comportent différemment dans les configurations HA. Comprendre ces différences est essentiel pour créer des systèmes fiables pilotés par les événements.

Les messages

Pub/Subsont déclenchés et oubliés : ils ne sont ni conservés, ni répliqués, ni mis en mémoire tampon. Dans une configuration HA basée sur Sentinel, les abonnés connectés au maître reçoivent normalement les messages, mais lors d'un basculement, le nouveau maître n'a aucune connaissance des abonnements précédents. Les clients doivent se réinscrire après s'être reconnectés. Avec Redis Cluster, les messages Pub/Sub sont diffusés à tous les nœuds du cluster, de sorte que les abonnés connectés à n'importe quel nœud reçoivent les messages publiés (bien que cela génère du trafic entre nœuds).

Flux Redisest une structure de données persistante et répliquée qui assure une transmission fiable des messages dans les environnements haute disponibilité. Les entrées de flux sont répliquées sur les réplicas via le mécanisme de réplication normal, survivent aux basculements et prennent en charge les groupes de consommateurs avec une sémantique de livraison au moins une fois. Pour la messagerie haute disponibilité, Streams doit toujours être préféré à 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

Modules Redis en haute disponibilité

Les modules

Redis étendent Redis avec des structures de données et des fonctionnalités spécialisées. Les trois plus populaires (RedisJSON, RediSearch et RedisTimeSeries) fonctionnent avec la réplication et Sentinel, mais ont des considérations spécifiques dans les déploiements haute disponibilité.

# 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

Lors de l'exécution de Redis Stack (le bundle de modules) dans HA, assurez-vous que tous les nœuds (maître et réplicas) disposent de versions de module identiques installées. Les commandes du module sont répliquées via le flux de réplication standard, les réplicas doivent donc pouvoir les exécuter. Après un basculement, les index RediSearch existent sur le réplica promu et répondent immédiatement aux requêtes.

Regroupement de connexions

et configuration client pour HA

Un regroupement de connexions approprié est essentiel pour les performances et la résilience du Redis HA. Les pools de connexions réduisent la surcharge liée à l'établissement de connexions TCP, fournissent une logique de nouvelle tentative automatique et permettent une gestion gracieuse du basculement.

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

Stratégies de sauvegarde et de restauration

Même avec la réplication HA, des sauvegardes régulières sont essentielles pour la reprise après sinistre, la conformité et la protection contre les erreurs logiques (FLUSHALL accidentel, mauvaises écritures d'application). Les sauvegardes Redis sont basées sur des instantanés RDB et des fichiers 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
Surveillance

avec Redis INFO, Prometheus et Grafana

La surveillance complète constitue le fondement de l'excellence opérationnelle du Redis HA. Redis expose de riches métriques internes via la commandeINFO, que l'exportateur Prometheus Redis traduit en métriques de séries chronologiques pour les tableaux de bord et les alertes 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 et KeyDB : alternatives compatibles Redis

Bien que Redis soit le principal magasin de données en mémoire, deux alternatives compatibles Redis ont gagné du terrain pour des cas d'utilisation spécifiques.

Libellule

Dragonfly est un remplacement moderne et multithread du Redis qui vise à être un remplacement immédiat tout en exploitant tous les cœurs CPU disponibles. Le Redis traditionnel est monothread pour le traitement des commandes : Dragonfly utilise une architecture sans partage avec plusieurs threads pour obtenir un débit nettement plus élevé sur les machines multicœurs. Il prend en charge le protocole Redis, la plupart des commandes Redis et peut remplacer Redis sans modification de l'application.

# 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
Principaux avantages du

Dragonfly : multithread (débit 25x sur 8 cœurs par rapport au Redis monothread), meilleure efficacité de la mémoire (utilise les tables de hachage Dash au lieu du dict Redis), capture d'écran intégrée sans surcharge fork() et prise en charge native des grands ensembles de données. Cependant, en 2026, la prise en charge de la réplication de Dragonfly est encore en train d'évoluer : elle prend en charge la réplication de la réplique principale mais ne dispose pas encore d'un système de basculement automatique équivalent à Sentinel. Pour la haute disponibilité, utilisez les vérifications de l'état Kubernetes et les politiques de redémarrage StatefulSet, ou déployez derrière un équilibreur de charge avec basculement au niveau de l'application.

CléDB

KeyDB est un fork multithread de Redis maintenu par Snap (la société derrière Snapchat). Il est entièrement compatible avec Redis et ajoute le multithreading, la réplication active-active (multi-maître), la hiérarchisation du stockage FLASH et l'expiration des sous-clés. La réplication active-active de KeyDB est particulièrement intéressante pour la haute disponibilité : deux instances KeyDB peuvent accepter des écritures simultanément et se répliquer l'une sur l'autre, offrant ainsi un basculement sans temps d'arrêt.

# 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 est un choix judicieux lorsque vous avez besoin d'une réplication multi-maître pour une distribution géographique ou une maintenance sans temps d'arrêt, ou lorsque vous avez besoin d'un débit plus élevé que celui que Redis monothread peut fournir, mais que vous souhaitez rester plus proche de la base de code Redis que Dragonfly.

Réglage des performances

Pipeline

Le pipeline

regroupe plusieurs commandes en un seul aller-retour réseau, réduisant ainsi considérablement la latence des opérations en masse. Au lieu d'attendre chaque réponse avant d'envoyer la commande suivante, le client envoie toutes les commandes en même temps et lit toutes les réponses ensemble.

# 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

Script Lua

Les scripts Lua

s'exécutent de manière atomique sur le serveur Redis, éliminant les allers-retours pour les opérations complexes et garantissant qu'aucune autre commande ne s'exécute entre les opérations du script. Dans le cluster Redis, assurez-vous que toutes les clés accessibles par un script Lua résident dans le même emplacement de hachage à l'aide de balises de hachage.

# 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

Optimisation de la mémoire

# 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
Scénarios de défaillance courants et dépannage du

Scénario 1 : échec du maître, Sentinel promeut la réplique

# 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

Scénario 2 : Split-Brain avec deux maîtres

# 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

Scénario 3 : Tempête de resynchronisation complète après une partition réseau

# 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

Scénario 4 : épuisement de la mémoire et destruction du MOO

# 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

Scénario 5 : commandes lentes bloquant la réplication

# 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

Stratégies de planification et de mise à l'échelle des capacités

La planification de la capacité

pour Redis HA implique l'estimation des besoins en mémoire, de la bande passante réseau et de l'utilisation du CPU sur les nœuds maîtres et réplicas. Les indicateurs clés à prendre en compte sont la taille de l'ensemble de données, les opérations par seconde, la taille moyenne de la clé/valeur et la surcharge de réplication.

# 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

Mise à l'échelle horizontale avec le 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
Considérations relatives à la mise à l'échelle verticale du

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

Conclusion

La haute disponibilité du

Redis n'est pas un choix de configuration unique : il s'agit d'une conception de système complète qui couvre la topologie de réplication, la détection des pannes, le basculement automatique, la configuration client, la stratégie de persistance, la gestion de la mémoire, la sécurité, la surveillance et les procédures opérationnelles. La bonne architecture HA dépend de vos besoins spécifiques.

Pour la plupart des applications,Redis Sentinelavec trois instances Sentinel surveillant un maître et deux réplicas fournit une solution HA éprouvée et testée avec basculement automatique en moins de 30 secondes. Lorsque vous avez besoin d'une mise à l'échelle horizontale au-delà du débit ou de la capacité de mémoire d'un seul maître, leRedis Clusterdistribue l'ensemble de données sur plusieurs partitions tout en conservant le basculement intégré par partition. Pour les environnements Kubernetes, des opérateurs tels queSpotahomeetOpsTreecodent les meilleures pratiques opérationnelles dans des CRD déclaratifs, tandis queRedis Enterpriseoffre l'option la plus riche en fonctionnalités avec la géoréplication active-active et la prise en charge des modules.

Les services gérés dans le cloud

—AWS ElastiCache,Azure Cache for RedisetGCP Memorystore— éliminent la charge opérationnelle liée à l'exécution de l'infrastructure Redis, mais s'accompagnent d'une flexibilité réduite et de coûts plus élevés à grande échelle. Pour les organisations disposant d'une infrastructure nue,k3s avec Rancher et Longhornoffre une alternative entièrement open source et indépendante du cloud qui offre une haute disponibilité de niveau entreprise sans dépendance vis-à-vis d'un fournisseur.

Les alternatives

telles queDragonflyetKeyDBméritent d'être évaluées pour des cas d'utilisation spécifiques : Dragonfly pour le débit multithread brut sur les grandes machines et KeyDB pour la réplication multi-maître active-active. Les deux sont compatibles Redis et peuvent servir de remplacement immédiat dans de nombreux scénarios.

Quelle que soit l'architecture que vous choisissez, les principes opérationnels fondamentaux restent constants : configurez une persistance appropriée (RDB + AOF hybride), appliquezmin-replicas-to-writepour éviter la perte de données split-brain, dimensionnez votre retard de réplication pour votre volume d'écriture, chiffrez tout le trafic avec TLS, appliquez l'accès de moindre privilège avec les ACL, surveillez le délai de réplication et l'utilisation de la mémoire avec Prometheus et Grafana, sauvegardez les instantanés RDB sur un stockage durable hors site, et - Le plus important est de tester régulièrement votre basculement. Un système de basculement qui n’a jamais été testé est un système qui ne fonctionne pas. Exécutez des exercices de basculement mensuels, injectez des pannes avec des outils d'ingénierie du chaos et mesurez votre temps de récupération réel. La confiance que vous obtenez grâce aux tests systématiques est ce qui différencie un déploiement Redis qui survit aux incidents de production d'un déploiement qui transforme une panne de serveur en une panne à l'échelle de l'entreprise.