Introduction
Redis est souvent considéré comme un simple magasin clé-valeur, mais sa configuration comporte suffisamment de pièges pour causer des pertes de données, des chutes de performance et des failles de sécurité. Les erreurs courantes incluent l'exposition réseau non protégée, la mémoire illimitée, la persistance désactivée et des politiques d'éviction dangereuses. L'objectif de cet article est d'aider les développeurs et les opérateurs à passer d'un problème constaté à une correction vérifiée, en utilisant des commandes concrètes et des sorties attendues.
Nous couvrirons l'inventaire des versions et de l'environnement, les flux de configuration sécurisés, la vérification et le diagnostic, les modes de défaillance et une liste de contrôle opérationnelle. Chaque exemple inclut une observation en lecture seule, le plus petit changement justifié et un chemin de récupération. Nous utiliserons des paramètres fictifs comme <votre-hôte> et <votre-mot-de-passe> au lieu de valeurs réelles.
Cet article suppose que vous avez accès à un serveur Redis (version 6.0 ou ultérieure), à l'outil redis-cli et à des compétences de base en shell. Si vous utilisez Docker, les commandes doivent être exécutées dans le shell du conteneur.
Inventaire des versions et de l'environnement
Avant de modifier un paramètre, confirmez exactement ce que vous exécutez. Le comportement de Redis change entre les versions ; une configuration qui fonctionne sur 5.x peut être renommée ou dépréciée sur 7.x. Par exemple, CONFIG SET save a été supprimé dans Redis 7.0 et remplacé par une syntaxe différente ; l'utilisation de l'ancienne commande échoue immédiatement.
Exemple 1.1 : Identifier la version de Redis installée
Commande :
redis-server --version
Sortie attendue :
Redis server v=7.2.4 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=...
Prérequis : le binaire redis-server est dans votre PATH.
Rayon d'impact : lecture seule, aucun impact.
Vérification : les deux premiers chiffres de la version (par exemple, 7.2) correspondent à ce que votre application attend.
Récupération : non nécessaire.
Exemple 1.2 : Vérifier la configuration actuelle avec CLI
Commande :
redis-cli -h <votre-hôte> -p <votre-port> INFO server
Sortie attendue (extrait) :
# Server
redis_version:7.2.4
redis_mode:standalone
os:Linux 5.15.0-91-generic x86_64
arch_bits:64
process_id:1234
tcp_port:6379
uptime_in_seconds:86400
Prérequis : vous connaissez l'hôte et le port, et le serveur est joignable.
Rayon d'impact : lecture seule.
Vérification : redis_version et redis_mode correspondent à vos attentes (autonome, sentinelle ou cluster).
Récupération : non nécessaire.
Pourquoi c'est important : si vous appliquez un paramètre qui n'existe que dans Redis 7 à un serveur Redis 6, le serveur peut échouer à démarrer. Épinglez toujours votre version dans la documentation et dans votre code d'infrastructure.
Chemin de configuration sécurisé
Un changement de configuration sûr suit une séquence prévisible : observer, sauvegarder, modifier un paramètre, vérifier et savoir comment revenir en arrière. Le fichier de configuration principal est généralement /etc/redis/redis.conf ou /usr/local/etc/redis.conf, mais Redis prend également en charge les changements à l'exécution via CONFIG SET. Les changements à l'exécution sont perdus au redémarrage, sauf si vous les persistez avec CONFIG REWRITE.
Exemple 2.1 : Modifier maxmemory à l'exécution
Observation :
redis-cli CONFIG GET maxmemory
Sortie :
1) "maxmemory"
2) "0"
(0 signifie pas de limite de mémoire, ce qui peut entraîner le swapping du système d'exploitation ou l'arrêt de Redis par le tueur OOM.)
Intervention : définir une limite de 2 Go :
redis-cli CONFIG SET maxmemory 2gb
Sortie attendue :
OK
Vérifier :
redis-cli CONFIG GET maxmemory
Sortie :
1) "maxmemory"
2) "2147483648"
Rayon d'impact : affecte l'utilisation de la mémoire mais pas les données. Si la limite est trop basse, les écritures peuvent échouer.
Récupération : réinitialiser à la valeur précédente :
redis-cli CONFIG SET maxmemory 0
Pour rendre le changement permanent, modifiez le fichier de configuration et redémarrez, ou exécutez :
redis-cli CONFIG REWRITE
Exemple 2.2 : Définir appendonly dans le fichier de configuration
Ouvrez le fichier de configuration avec un éditeur :
# /etc/redis/redis.conf
appendonly no
Modifiez en appendonly yes et ajoutez appendfsync everysec pour une durabilité raisonnable.
Redémarrez Redis :
sudo systemctl restart redis
Vérifiez que la persistance est active :
redis-cli CONFIG GET appendonly
Sortie :
1) "appendonly"
2) "yes"
Rayon d'impact : l'activation de l'AOF augmente les E/S disque. Si le disque est lent, la latence peut augmenter.
Récupération : annulez le changement et redémarrez.
Lorsque vous modifiez plusieurs paramètres, faites un changement à la fois. Si quelque chose se casse, vous saurez quel paramètre en est la cause.
Vérification et diagnostic
La vérification signifie vérifier que le comportement configuré se produit réellement, pas seulement que la commande a renvoyé OK. Redis fournit plusieurs commandes de diagnostic intégrées.
Exemple 3.1 : Vérifier l'utilisation de la mémoire et la politique d'éviction
Commande :
redis-cli INFO memory
Sortie attendue (extrait) :
# Memory
used_memory:1048576
used_memory_human:1.00M
used_memory_rss:2097152
maxmemory:2147483648
maxmemory_human:2.00G
maxmemory_policy:noeviction
Si maxmemory_policy est noeviction et que used_memory atteint maxmemory, les commandes d'écriture échoueront avec OOM command not allowed when used memory > 'maxmemory'. Pour autoriser l'éviction, définissez une politique appropriée, par exemple :
redis-cli CONFIG SET maxmemory-policy allkeys-lru
Vérifier :
redis-cli CONFIG GET maxmemory-policy
Sortie :
1) "maxmemory-policy"
2) "allkeys-lru"
Exemple 3.2 : Diagnostiquer les opérations lentes avec SLOWLOG
Si les requêtes sont lentes, vérifiez le journal lent :
redis-cli SLOWLOG GET 10
Sortie (extrait) :
1) 1) (integer) 1
2) (integer) 1700000000
3) (integer) 5000
4) 1) "KEYS"
2) "*"
5) "127.0.0.1:45678"
6) ""
Une commande KEYS * prenant 5000 microsecondes (5 ms) est un signal d'alarme. Remplacez-la par SCAN dans le code de production. La commande SLOWLOG RESET efface le journal pour un état propre.
Exemple 3.3 : Vérifier les connexions clients et identifier les bloqueurs
redis-cli CLIENT LIST
Sortie (extrait) :
id=3 addr=127.0.0.1:56789 fd=8 name= age=123 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
Cherchez les clients avec un omem élevé (mémoire de tampon de sortie) ou un age élevé sans activité. Ils peuvent être bloqués.
Erreurs courantes et comment les éviter
Voici les erreurs de configuration fréquentes, pourquoi elles se produisent et comment les éviter ou s'en remettre.
Erreur 1 : Liaison à toutes les interfaces sans mot de passe
La configuration Redis par défaut a souvent bind 0.0.0.0 et pas de requirepass. Cela expose Redis à l'internet public. Les attaquants peuvent lire toutes les données ou utiliser Redis pour écrire des fichiers (comme des clés SSH).
Pourquoi cela arrive : les développeurs supposent que bind 127.0.0.1 est la valeur par défaut ou qu'un pare-feu protège le port.
Comment éviter : définissez explicitement bind sur une IP privée ou localhost, et définissez un requirepass fort. Exemple :
bind 127.0.0.1
requirepass <votre-mot-de-passe-fort>
protected-mode yes
Redémarrez puis testez :
redis-cli -h <votre-hôte> -p <votre-port> -a <votre-mot-de-passe> PING
Attendu : PONG.
Récupération : si vous ne pouvez pas redémarrer, utilisez immédiatement CONFIG SET requirepass <mot-de-passe>, mais notez que les clients doivent se ré-authentifier.
Erreur 2 : Laisser maxmemory non défini et maxmemory-policy sur noeviction
En production, une croissance mémoire infinie conduit au swapping du système ou à l'arrêt par le tueur OOM. Si l'éviction est désactivée, Redis renvoie des erreurs lorsque la mémoire est pleine, provoquant des pannes applicatives.
Pourquoi cela arrive : les développeurs se concentrent sur la fonctionnalité et oublient la planification de capacité.
Comment éviter : définissez maxmemory à environ 70-80 % de la RAM disponible, et choisissez une politique d'éviction en fonction de l'utilisation des données. Pour un cache, utilisez allkeys-lru. Pour un magasin de sessions, volatile-lru peut être plus sûr. Vérifiez avec INFO memory.
Erreur 3 : Désactivation de la persistance
Sans RDB ou AOF, un redémarrage entraîne une perte totale de données. Beaucoup supposent que Redis n'est qu'un cache, mais souvent il détient des données importantes.
Pourquoi cela arrive : la configuration par défaut peut avoir la persistance désactivée, ou les développeurs la désactivent pour la vitesse sans comprendre l'impact.
Comment éviter : activez au moins une méthode de persistance. Pour la plupart des cas d'utilisation, l'AOF avec appendfsync everysec est recommandé. Vérifiez en contrôlant CONFIG GET appendonly et CONFIG GET save.
Erreur 4 : Utiliser KEYS pattern en production
KEYS * bloque le serveur pendant le balayage de tout l'espace de clés, provoquant des pics de latence pour tous les clients.
Pourquoi cela arrive : c'est le moyen le plus simple de lister les clés et cela fonctionne bien sur de petits ensembles de données.
Comment éviter : utilisez SCAN avec un curseur, qui itère de manière incrémentale. Mettez à jour le code de l'application avant que les données ne grossissent.
Erreur 5 : Ignorer les limites de tampon de sortie des clients
Si un client est lent à lire, Redis met en mémoire tampon la sortie vers ce client. Des tampons illimités peuvent consommer toute la mémoire, amenant le serveur à tuer les connexions ou à planter.
Pourquoi cela arrive : les valeurs par défaut peuvent être trop élevées pour les scénarios à haut débit, ou un client s'abonne à un canal occupé et arrête de lire.
Comment éviter : définissez client-output-buffer-limit pour les clients normaux et pubsub. Exemple :
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit pubsub 32mb 8mb 60
Cela limite les clients pubsub à 32 Mo de limite dure, 8 Mo de limite douce pendant 60 secondes. Surveillez avec CLIENT LIST et INFO clients.
Modes de défaillance et récupération
Les changements de configuration peuvent échouer de manière visible ou cachée. Voici les modes de défaillance courants et comment s'en remettre.
Défaillance 1 : Le serveur ne démarre pas après modification du fichier de configuration
Symptôme : systemctl status redis indique un échec et les journaux montrent une erreur d'analyse.
Cause : faute de frappe ou directive non prise en charge.
Récupération : vérifiez les journaux avec sudo journalctl -u redis, corrigez la ligne et redémarrez. Si nécessaire, restaurez à partir d'un fichier de configuration de sauvegarde. Gardez toujours une sauvegarde de configuration connue comme bonne, par exemple /etc/redis/redis.conf.bak.
Défaillance 2 : CONFIG SET a réussi mais le paramètre est perdu au redémarrage
Symptôme : après redémarrage, le paramètre revient à l'ancienne valeur.
Cause : CONFIG SET n'affecte que l'exécution ; vous avez oublié CONFIG REWRITE ou de modifier le fichier de configuration.
Récupération : appliquez à nouveau le paramètre et persistez-le avec CONFIG REWRITE, ou modifiez manuellement le fichier de configuration et redémarrez.
Défaillance 3 : Échec d'authentification après avoir défini requirepass
Symptôme : les clients reçoivent NOAUTH Authentication required.
Cause : les clients ne sont pas mis à jour avec le nouveau mot de passe.
Récupération : mettez à jour les chaînes de connexion des clients. Pour redis-cli, utilisez -a <mot-de-passe> ou la commande AUTH <mot-de-passe>.
Défaillance 4 : L'éviction mémoire provoque une perte de données
Symptôme : INFO stats montre une augmentation de evicted_keys et certaines clés disparaissent.
Cause : politique d'éviction trop agressive ou maxmemory trop bas.
Récupération : augmentez maxmemory ou changez temporairement la politique en noeviction pour arrêter les évictions, mais sachez que les écritures peuvent échouer. Enquêtez sur les modèles d'accès aux données et ajustez.
Défaillance 5 : Corruption du fichier AOF
Symptôme : Redis refuse de démarrer ou de charger les données, le journal montre Bad file format reading the append only file.
Cause : disque plein, coupure de courant ou bug.
Récupération : utilisez redis-check-aof --fix <fichier-aof> pour tenter une réparation, ou restaurez à partir d'un instantané RDB récent. Ayez toujours une stratégie de sauvegarde.
Liste de contrôle opérationnelle
Utilisez cette liste à chaque fois que vous modifiez la configuration Redis. Elle suppose un seul responsable pour chaque décision (par exemple, l'ingénieur DevOps de garde pour les changements d'infrastructure, ou le responsable technique pour les paramètres liés à l'application). Revisitez ces décisions mensuellement ou après tout changement de trafic significatif.
- Identifier la version et la topologie
- Responsable : ingénieur DevOps (par exemple, Priya Shah)
- Commande :
redis-server --versionetINFO server - Attendu : la version correspond à la base documentée, la topologie est correcte.
- Revisiter : à chaque déploiement ou audit mensuel.
- Sauvegarder la configuration actuelle
- Responsable : idem ci-dessus
- Commande :
redis-cli CONFIG GET '*' > redis-config-backup-$(date +%F).txt - Copiez également le fichier de configuration :
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak - Attendu : le fichier de sauvegarde existe et n'est pas vide.
- Faire un seul changement avec un rollback documenté
- Responsable : idem
- Exemple :
CONFIG SET maxmemory 2gbavec rollbackCONFIG SET maxmemory 0 - Attendu :
OK
- Vérifier que le changement a pris effet
- Responsable : idem
- Commande :
CONFIG GET maxmemoryet sectionsINFOpertinentes. - Attendu : la valeur correspond au paramètre prévu.
- Persister le changement si nécessaire
- Responsable : idem
- Commande :
CONFIG REWRITEou modifier le fichier de configuration. - Attendu : après redémarrage, le paramètre reste.
- Surveiller les effets secondaires
- Responsable : SRE ou équipe de surveillance (par exemple, Marcus Chen)
- Commande :
redis-cli INFO statsetSLOWLOG GET - Attendu : pas d'erreurs inhabituelles, latence stable.
- Revisiter : en continu via des alertes de surveillance.
- Documenter le changement
- Responsable : personne qui fait le changement
- Enregistrer dans le journal des modifications : quoi, pourquoi, quand, procédure de rollback.
- Examiner les impacts sur les dépendances
- Responsable : responsable technique (par exemple, Elena Rodriguez)
- Considérez les clients, les pools de connexions Node.js, les contrôles de santé Docker, les scrapers de surveillance.
- Attendu : tous les systèmes dépendants fonctionnent toujours.
- Revisiter : après chaque changement.
Conclusion
Les erreurs de configuration Redis sont courantes mais évitables. En inventorant votre environnement, en apportant des changements incrémentaux, en vérifiant avec des commandes concrètes et en ayant des plans de récupération, vous pouvez prévenir les pannes et les pertes de données. La clé est de traiter la configuration Redis avec la même rigueur que le code applicatif : versionnée, testée et revue.
Commencez par un changement à faible risque : vérifiez votre maxmemory et votre politique d'éviction actuels, définissez une limite raisonnable et vérifiez avec INFO memory. Enregistrez l'avant et l'après, et documentez comment revenir. À mesure que vous gagnez en confiance, abordez d'autres domaines comme la persistance, la sécurité et les tampons des clients.
Une exploitation Redis fiable rend les défaillances visibles, protège les données sensibles, limite le rayon d'impact des changements et définit la récupération avant qu'un incident ne l'exige.