Introduction
Mettre à niveau ou migrer Redis doit améliorer sécurité, stabilité et performance sans perturber vos applications. Le risque ne vient pas tant de la nouvelle version que d'un changement non planifié. Ce guide décrit comment planifier et exécuter une mise à niveau Redis à faible risque, valider chaque étape, et revenir en arrière (rollback) en toute sécurité si besoin. Vous allez inventorier votre environnement, choisir un chemin sûr, suivre des exemples concrets pour Standalone, Sentinel et Cluster, puis conclure avec diagnostics, modes de panne et une checklist réutilisable.
Inventaire des versions et de l'environnement
Des mises à niveau solides commencent avec des faits clairs. Capturez ces éléments avant tout changement en production.
Prérequis et accès
- Accès shell aux hôtes Redis.
- Capacité à mettre à jour la configuration et à redémarrer Redis pendant un créneau de maintenance si nécessaire.
- Accès au DNS ou au service de découverte pour le basculement des clients.
- Espace disque suffisant pour un instantané complet supplémentaire (prévoyez au moins dataset_size × 1,5 d'espace libre).
Commandes d'inventaire (à exécuter sur chaque nœud)
- Version binaire :
redis-server -v- Détails serveur (build, chemin du fichier de conf) :
redis-cli INFO server- Mode de persistance et planification des snapshots :
redis-cli CONFIG GET appendonlyredis-cli CONFIG GET save- Taille de dataset et keyspace :
redis-cli INFO memoryredis-cli INFO keyspace- Réplication et rôle :
redis-cli INFO replicationredis-cli ROLE- Mix de commandes et débit :
redis-cli INFO commandstatsredis-cli INFO stats
Classification de la topologie
- Standalone : un primaire, éventuellement des réplicas.
- Sentinel : haute disponibilité avec primaires et réplicas gérés par Sentinel.
- Cluster : déploiement shardé avec masters et replicas.
Considérations côté application
- Bibliothèques clientes et chaînes de connexion (auth, TLS, timeouts, stratégies de retry).
- Politique d'éviction et limites mémoire (
CONFIG GET maxmemory,maxmemory-policy). - Temps d'arrêt acceptable et stratégie de basculement (DNS, réutilisation de connexions, failover orchestré).
Sauvegardes et contrôles d'intégrité
- Créez un snapshot RDB propre :
redis-cli BGSAVE- Vérifiez l'existence et l'horodatage dans le répertoire de
CONFIG GET dir - Si AOF est activé, validez-le hors ligne sur une copie :
redis-check-aof --fix appendonly.aof(sur une copie, jamais en place)- Validez le RDB hors ligne sur une copie :
redis-check-rdb dump.rdb
Interrupteurs de sécurité à noter
stop-writes-on-bgsave-errordoit êtreyespour la sécurité (CONFIG GET stop-writes-on-bgsave-error).appendfsyncpar défauteverysecoffre un bon compromis durabilité/performance.
Chemin de configuration sûr
Choisissez une approche adaptée à votre topologie et à votre tolérance au risque. Les modèles suivants couvrent la majorité des cas réels.
Tableau comparatif (valeurs construites, mesurez chez vous) :
| Modèle | Indisponibilité (exemple) | Profil de risque | Quand l'utiliser |
|---|---|---|---|
| Redémarrage in-place | 30-120 s par nœud | Élevé (rollback unique) | Petites instances Standalone avec fenêtre complète |
| Promotion de réplica (shadow replica) | 1-10 s de cutover | Faible | Standalone ou Sentinel avec faible downtime |
| Double run (blue/green) + cutover | 1-30 s de cutover | Faible-Moyen | Apps complexes nécessitant une validation en parallèle |
| Rolling upgrade Cluster (failover par shard) | 0,5-3 s par shard | Faible | Redis Cluster avec réplicas par master |
Notes
- Les valeurs sont des exemples construits. Mesurez dans votre environnement.
- Préférez les méthodes basées sur des réplicas pour un risque réduit et un rollback simple.
Considérations de configuration communes
- Conservez une authentification et des ACL identiques entre anciens et nouveaux hôtes avant le cutover (
ACL LIST,ACL GETUSER,ACL SETUSER). - Faites correspondre le mode de persistance (RDB/AOF) durant la réplication pour éviter les surprises au démarrage.
- Assurez un
repl-backlog-sizesuffisant pour la fenêtre de réplication et éviter les resync complets. - Utilisez un TTL DNS bas (ex. 30 s) pour un basculement clients plus souple.
Parcours pratiques
Ajustez hôtes, ports et chemins à votre environnement.
Parcours A : Standalone via réplica (faible downtime)
Scénario (exemple) : Mettre à niveau Redis 6.2 sur old-redis:6379 vers Redis 7.x sur new-redis:6379 avec 5 secondes de cutover.
- Préparer la cible avec une config cohérente
- Copiez
redis.confde l'ancien vers le nouveau et n'ajustez que les chemins et adresses bind nécessaires. - Assurez l'alignement de l'authentification et des ACL avant la réplication.
- Démarrer le nouveau Redis comme réplica de l'ancien
- Sur
new-redis, définissezreplicaofet démarrez Redis 7.x : - Dans
redis.confdenew-redis:replicaof old-redis 6379 - Démarrez le service (via votre gestionnaire de services OS)
- Vérifier la synchronisation complète et l'état stable
- Sur
new-redis: redis-cli INFO replication- Attendu :
role: slave,master_link_status: up,master_sync_in_progress:0 - Vérifiez l'alignement des offsets de réplication :
- Sur les deux nœuds :
redis-cli INFO replication | grep -E "offset|slave_repl_offset"
- Échantillonnage en lecture seule (optionnel)
- Exécutez des vérifications en lecture pour valider la présence des données et la latence de base :
redis-cli -h new-redis DBSIZEredis-cli -h new-redis --latency-history --csv --raw
- Cutover avec courte pause d'écriture
- Objectif : éviter une divergence pendant le switch.
- Sur
old-redis, mettez en pause les nouvelles écritures : redis-cli CLIENT PAUSE 3000 WRITE- Promouvez le réplica en master :
redis-cli -h new-redis REPLICAOF NO ONE- Reconfigurez l'ancien master pour suivre le nouveau (rollback simplifié) :
redis-cli -h old-redis REPLICAOF new-redis 6379- Mettez à jour les clients (idéalement via DNS, TTL faible préparé en amont).
- Débloquez les écritures et validez
- Sur
old-redis:redis-cli CLIENT UNPAUSE - Confirmez les rôles :
redis-cli -h new-redis ROLE(doit êtremaster)redis-cli -h old-redis ROLE(doit êtreslave)- Validez les écritures côté
new-redis: redis-cli -h new-redis SET upgrade: smoke 1redis-cli -h new-redis GET upgrade: smoke
Parcours B : Rolling upgrade Redis Cluster (failover par shard)
Scénario (exemple) : Cluster avec 3 masters, chacun avec 1 réplica ; mise à niveau de 6.x vers 7.x sans arrêt total du cluster.
- Sélectionnez une paire de shard (master M1, réplica R1)
- Mettez à niveau le réplica vers 7.x (arrêt, upgrade binaire, redémarrage).
- Vérifiez qu'il rejoint et se synchronise :
redis-cli -p <R1-port> INFO replication
- Promouvez le réplica mis à niveau
- Sur R1 :
redis-cli -p <R1-port> CLUSTER FAILOVER - Attendez que R1 devienne master et M1 réplica. Vérifiez avec
ROLEsur les deux.
- Mettez à niveau l'ancien master (désormais réplica)
- Arrêtez M1, mettez à niveau en 7.x, redémarrez-le et laissez-le se resynchroniser en tant que réplica.
- Répétez par shard
- Passez au shard 2 (M2/R2), puis shard 3, en répétant le même schéma.
- Contrôles post-upgrade
redis-cli --cluster check <any-node-host: port>- Confirmez le nombre de masters, réplicas et la couverture des slots.
Parcours C : Migration inter-environnements (même version ou + version)
Scénario (exemple) : Déplacer Redis de DC-A vers DC-B avec une montée de version et un downtime minimal.
- Amorcer un réplica entre environnements
- Dans DC-B, démarrez Redis avec
replicaofpointant vers le primaire de DC-A. - Assurez règles firewall et latence/bande passante acceptables.
- Observer une réplication stable sur un cycle métier
- Validez l'usage mémoire, les offsets de réplication et la stabilité de latence.
- Planifier le cutover
- Abaissez le TTL DNS bien avant le cutover.
- Pause d'écritures côté DC-A :
CLIENT PAUSE 3000 WRITE - Promotion côté DC-B :
REPLICAOF NO ONE - Reconfigurez DC-A pour suivre DC-B :
REPLICAOF <DC-B> 6379 - Mettez à jour le DNS vers DC-B.
- Surveiller et débloquer
- Vérifiez la reconnexion applicative et le succès des commandes.
- Débloquez les écritures sur DC-A et conservez-le en hot standby temporairement pour un rollback rapide.
Vérification et diagnostics
La vérification prouve que la mise à niveau est correcte, pas seulement terminée.
Contrôles de base et résultats attendus
| Contrôle | Commande | Résultat attendu |
|---|---|---|
| Version serveur | redis-cli INFO server | redis_version = version cible |
| Rôle et réplication | redis-cli INFO replication | role: master sur la cible ; réplicas connectés |
| Snapshot présent | ls $(redis-cli CONFIG GET dir | tail -1)/dump.rdb | Horodatage récent, taille non nulle | | AOF activé (si utilisé) | redis-cli CONFIG GET appendonly | appendonly yes ou no selon souhait | | Parité dataset | redis-cli DBSIZE | Compte de clés identique ou supérieur après cutover | | Mix de commandes stable | redis-cli INFO commandstats | Pas de commandes manquantes inattendues | | Latence de base | redis-cli --latency -h <host> -p <port> | Similaire ou meilleure qu'avant |
Diagnostics opérationnels
INFO latency,memory,clients: conservez des plages de référence.SLOWLOG GET 128: s'assurer qu'aucune commande lente nouvelle n'apparaît.LATENCY DOCTOR: triage rapide en cas de pics.MONITORest puissant mais coûteux ; évitez en pic de prod.
Sonde synthétique (avec parcimonie)
- Sur une fenêtre non critique, une petite sonde peut révéler des régressions :
redis-benchmark -h <host> -p <port> -n 5000 -c 10 -t get, set- Gardez des tests courts et à faible concurrence en production.
Vérification côté application
- Validez connexion, commandes de base et gestion d'erreurs depuis une instance applicative avant un déploiement global.
- Exemple Node.js (ioredis) de test de fumée :
// Exemple Node.js avec ioredis (extrait construit)
const Redis = require('ioredis');
const r = new Redis({ host: 'new-redis', port: 6379, retryStrategy: null });
(async () => {
await r.set('upgrade: node: smoke', 'ok', 'EX', 60);
const v = await r.get('upgrade: node: smoke');
console.log('Smoke value:', v);
await r.quit();
})();
Capacité et marge mémoire
- Après cutover, assurez
used_memory < maxmemory * 0.7(guideline construite) pour garder de la marge pour réplicas et pics. - Surveillez l'éviction :
INFO stats -> evicted_keysne doit pas augmenter de façon inattendue.
Pannes et récupération
Anticipez ces échecs et préparez vos réponses.
- Le réplica ne rattrape jamais (bande passante ou backlog insuffisant)
- Symptôme :
master_link_statusfluctue ;master_sync_in_progressrelance des synchronisations complètes. - Action : augmentez
repl-backlog-size, stabilisez le réseau. Option : amorcer avec une copie RDB pour réduire le coût de sync initiale (arrêter la cible, copierdump.rdb, redémarrer comme réplica).
- Divergence de données pendant le cutover
- Symptôme : clés manquantes/écrasées sur le nouveau master après cutover.
- Action : utilisez
CLIENT PAUSE WRITEpour drainer les écritures. Si divergence détectée rapidement, rollback : re-promouvez l'ancien master et repointez les clients.
- Corruption AOF/RDB au démarrage (cible)
- Symptôme : Redis refuse de démarrer ou plante en lisant la persistance.
- Action : ne réparez pas en place. Sur une copie, lancez
redis-check-rdbouredis-check-aof. Remplacez par un snapshot sain. Gardez l'ancien master en service pendant la récupération.
- Décalage d'ACL ou d'auth
- Symptôme : clients reçoivent
NOAUTHouNOPERMaprès cutover. - Action : exportez les ACL depuis la source et appliquez-les sur la cible :
- Source :
redis-cli ACL LIST > acls.txt - Cible : appliquez
ACL SETUSERéquivalents.
- Régression de performance (pics de latence)
- Symptôme : p50/p99 en hausse, connexions perdues.
- Action : comparez la CONFIG, notamment
maxmemory-policy, E/S et persistance. Testezappendonly(on/off) si modifié. Faites un rollback si la latence est inacceptable sans cause racine claire.
- Problèmes de couverture de slots après rolling upgrade (Cluster)
- Symptôme :
redis-cli --cluster checksignale des slots non assignés ou des nœuds en échec. - Action : réajoutez des réplicas si nécessaire, exécutez
redis-cli --cluster fix <node>. Garantissez au moins un réplica sain par master avant de continuer.
- Comportements de commande inattendus
- Symptôme : évolution/dépréciation affectant la logique applicative.
- Action : validez le mix via
INFO commandstats; ajoutez des tests d'intégration ciblés pour les commandes critiques. Si besoin, utilisez une option de compatibilité appropriée ou faites un rollback pendant l'adaptation.
Playbook de rollback (Standalone ou Sentinel)
- Conservez l'ancien master en réplica après cutover pour un rollback rapide.
- Pour revenir en quelques minutes :
- Pause d'écritures sur le nouveau master :
CLIENT PAUSE 3000 WRITE - Re-promouvez l'ancien nœud :
REPLICAOF NO ONE(sur l'ancien) - Pointez le nouveau vers l'ancien :
REPLICAOF <old> 6379 - Restaurez le DNS vers l'ancien master
- Débloquez les écritures sur l'ancien master
Playbook de rollback (Cluster)
- Inversez le dernier failover de shard :
- Sur l'ancien master (devenu réplica), vérifiez qu'il est sain
CLUSTER FAILOVERsur le réplica à re-promouvoir- Vérifiez la couverture de slots et la connectivité clients
Critères de succès du rétablissement
- Les clients se reconnectent dans le TTL attendu.
- Le taux d'erreurs et les latences reviennent aux niveaux de référence.
- La réplication se rétablit proprement dans la nouvelle topologie.
Checklist d'exploitation
Utilisez cette checklist comme runbook réutilisable.
Planification
- Définissez la version cible et les points de changelog pertinents.
- Choisissez un modèle de migration (promotion de réplica par défaut pour faible risque).
- Définissez un succès mesurable (ex. p95 dans ±10 % du baseline, zéro perte de données).
- Abaissez le TTL DNS avant le cutover si vous utilisez le DNS.
Préflight
- Capturez les sorties INFO et configs actuelles pour diff et rollback.
- Créez et validez un snapshot RDB (et AOF si activé).
- Vérifiez un espace libre ≥ 1,5× dataset sur source et cible.
- Alignez ACL et authentification sur la cible avec la source.
- Vérifiez les chemins réseau et règles firewall pour la réplication.
Exécution
- Démarrez la cible comme réplica de la source ; vérifiez la fin de la sync complète.
- Observez les offsets de réplication et la stabilité en charge normale.
- Optionnel : requêtes de validation en lecture sur le réplica.
- Annoncez une courte fenêtre de cutover.
- Pause d'écritures, promotion du réplica, re-pointage de l'ancien master vers le nouveau.
- Mettez à jour DNS ou endpoints de connexion.
Vérification
- Confirmez le rôle master côté cible. Confirmez la reconnexion des clients.
- Vérifiez la parité
DBSIZEet échantillonnez des lectures de clés. - Surveillez la latence (
redis-cli --latency) quelques minutes. - Passez en revue
SLOWLOGetINFO commandstatspour anomalies.
Stabilisation
- Conservez l'ancien master en réplica jusqu'à stabilisation confirmée.
- Prenez un nouveau snapshot côté nouveau master.
- Restaurez des TTL DNS normaux.
Post-mortem et durcissement
- Documentez timing, downtime et incidents.
- Ajustez
repl-backlog-sizeet la cadence de snapshots si nécessaire. - Mettez à jour le runbook selon les leçons apprises.
Conclusion
La mise à niveau ou la migration Redis peut être prévisible, rapide et sûre si vous inventorie z votre environnement, choisissez un chemin centré sur le réplica, validez avec des contrôles concrets et gardez un rollback Redis testé. Commencez par un pilote limité et observable pour confirmer votre approche, puis étendez avec confiance en réutilisant les mêmes étapes. Avec ces parcours, diagnostics et checklists, vous réduisez le risque tout en capturant les bénéfices des nouvelles versions de Redis.