Configuration et gestion de Redis
Ce guide détaille les étapes pour installer, configurer et gérer Redis, y compris la mise en place d'un cluster, la configuration de la persistance des données et l'établissement de la réplication maître-essclave.
I. Installation et Configuration de Base
1. Téléchargement et compilation
Téléchargez l'archive Redis et compilez-la.
cd /data/soft
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2. Décompression et installation
Décompressez Redis et installez-le.
tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-5.0.7 /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
3. Configuration du fichier de démarrage
Créez et configurez le fichier de configuration pour le port 6379.
# Fichier : /opt/redis_cluster/redis_6379/conf/6379.conf
bind 127.0.0.1 192.168.2.1 # Adresse IP de liaison
port 6379
daemonize yes
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis.rdb
dir /opt/redis_cluster/redis_6379/
4. Démarrage du service Redis
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
5. Arrêt du service Redis
redis-cli shutdown
6. Connexion à Redis
redis-cli -h 127.0.0.1 -p 6379
II. Commandes Redis Essentielles
1. Clés (Keys)
| Commande | Description |
|---|---|
set [clé] [valeur] |
Crée une clé avec sa valeur. |
get [clé] |
Récupère la valeur associée à une clé. |
del [clé] |
Supprime une clé. |
exists [clé] |
Vérifie si une clé existe. |
expire [clé] secondes |
Définit un délai d'expiration en secondes pour une clé. |
keys [motif] |
Recherche toutes les clés correspondant à un motif. |
move [clé] [db] |
Déplace une clé vers une autre base de données. |
persist [clé] |
Supprime le délai d'expiration d'une clé. |
pttl [clé] |
Retourne le temps de vie restant d'une clé en millisecondes. |
ttl [clé] |
Retourne le temps de vie restant d'une clé en secondes. |
randomkey |
Retourne une clé aléatoire de la base de données. |
rename [clé] [nouvelle_clé] |
Renomme une clé. |
renamenx [clé] [nouvelle_clé] |
Renomme une clé uniquement si la nouvelle clé n'existe pas. |
type [clé] |
Retourne le type de la valeur associée à une clé. |
2. Chaînes de caractères (Strings)
| Commande | Description |
|---|---|
set [clé] [valeur] |
Définit la valeur d'une clé. |
get [clé] |
Récupère la valeur d'une clé. |
getrange [clé] [début] [fin] |
Récupère une sous-chaîne d'une clé. |
getset [clé] [valeur] |
Définit une nouvelle valeur et retourne l'ancienne. |
mget [clé1] ... |
Récupère les valeurs de plusieurs clés. |
setex [clé] [secondes] [valeur] |
Définit une valeur avec un délai d'expiration. |
setnx [clé] [valeur] |
Définit une valeur uniquement si la clé n'existe pas. |
strlen [clé] |
Retourne la longueur d'une chaîne. |
mset [clé1] [valeur1] ... |
Définit plusieurs clés avec leurs valeurs. |
msetnx [clé1] [valeur1] ... |
Définit plusieurs clés uniquement si toutes les clés n'existent pas. |
incr [clé] |
Incrémente la valeur d'une clé numérique de 1. |
incrby [clé] [incrément] |
Incrémente la valeur d'une clé numérique par une valeur donnée. |
decr [clé] |
Décrémente la valeur d'une clé numérique de 1. |
append [clé] [valeur] |
Ajoute une chaîne à la fin de la valeur existante d'une clé. |
3. Hashes
Les Hashes sont idéaux pour stocker des objets, offrant une structure clé-champ-valeur.
| Commande | Description |
|---|---|
hdel [clé] [champ] |
Supprime un ou plusieurs champs d'un hash. |
hexists [clé] [champ] |
Vérifie si un champ existe dans un hash. |
hget [clé] [champ] |
Récupère la valeur d'un champ spécifique dans un hash. |
hgetall [clé] |
Récupère tous les champs et valeurs d'un hash. |
hincrby [clé] [champ] [incrément] |
Incrémente la valeur d'un champ entier dans un hash. |
hkeys [clé] |
Récupère tous les champs d'un hash. |
hlen [clé] |
Retourne le nombre de champs dans un hash. |
hmget [clé] [champ1] ... |
Récupère les valeurs de plusieurs champs spécifiés. |
hmset [clé] [champ1] [valeur1] ... |
Définit plusieurs champs et valeurs dans un hash. |
hsetnx [clé] [champ] [valeur] |
Définit la valeur d'un champ uniquement si le champ n'existe pas. |
hset [clé] [champ] [valeur] |
Définit la valeur d'un champ dans un hash. |
hvals [clé] |
Récupère toutes les valeurs d'un hash. |
4. Listes (Lists)
| Commande | Description |
|---|---|
blpop [clé1] [timeout] |
Supprime et retourne le premier élément d'une liste, en bloquant si nécessaire. |
brpop [clé] [timeout] |
Supprime et retourne le dernier élément d'une liste, en bloquant si nécessaire. |
lindex [clé] [index] |
Récupère un élément d'une liste par son index. |
llen [clé] |
Retourne la longueur d'une liste. |
lpop [clé] |
Supprime et retourne le premier élément d'une liste. |
lpush [clé] [valeur1] ... |
Insère un ou plusieurs éléments en tête d'une liste. |
lrange [clé] [début] [fin] |
Récupère une plage d'éléments d'une liste. |
lrem [clé] [compte] [valeur] |
Supprime des occurrences d'un élément dans une liste. |
lset [clé] [index] [valeur] |
Définit la valeur d'un élément à un index donné dans une liste. |
ltrim [clé] [début] [fin] |
Tronque une liste pour ne conserver que les éléments dans une plage spécifiée. |
rpop [clé] |
Supprimee et retourne le dernier élément d'une liste. |
rpush [clé] [valeur1] ... |
Insère un ou plusieurs éléments en fin de liste. |
rpushx [clé] [valeur] |
Insère un élément en fin de liste uniquement si la liste existe. |
5. Ensembles (Sets)
| Commande | Description |
|---|---|
sadd [clé] [membre1] ... |
Ajoute un ou plusieurs membres à un ensemble. |
scard [clé] |
Retourne le nombre de membres dans un ensemble. |
sdiff [clé1] [clé2] ... |
Retourne la différence entre plusieurs ensembles. |
sinter [clé1] [clé2] ... |
Retourne l'intersection entre plusieurs ensembles. |
sismember [clé] [membre] |
Vérifie si un membre appartient à un ensemble. |
smove [source] [destination] [membre] |
Déplace un membre d'un ensemble source vers un ensemble destination. |
spop [clé] |
Supprime et retourne un membre aléatoire d'un ensemble. |
srandmember [clé] [compte] |
Retourne un ou plusieurs membres aléatoires d'un ensemble. |
srem [clé] [membre1] ... |
Supprime un ou plusieurs membres d'un ensemble. |
sunion [clé1] [clé2] ... |
Retourne l'union de plusieurs ensembles. |
sscan [clé] [curseur] [MATCH motif] [COUNT nombre] |
Itère sur les membres d'un ensemble. |
6. Ensembles Ordonnés (Sorted Sets)
| Commande | Description |
|---|---|
zadd [clé] [score1] [membre1] ... |
Ajoute ou met à jour un membre avec son score dans un ensemble ordonné. |
zcard [clé] |
Retourne le nombre de membres dans un ensemble ordonné. |
zcount [clé] [min] [max] |
Compte les membres dans un intervalle de scores donné. |
zincrby [clé] [incrément] [membre] |
Incrémente le score d'un membre dans un ensemble ordonné. |
zrange [clé] [début] [fin] [WITHSCORES] |
Récupère les membres d'un ensemble ordonné dans une plage d'index donnée. |
zrank [clé] [membre] |
Retourne l'index d'un membre dans un ensemble ordonné (du plus petit score au plus grand). |
zrevrank [clé] [membre] |
Retourne l'index d'un membre dans un ensemble ordonné (du plus grand score au plus petit). |
zrem [clé] [membre1] ... |
Supprime un ou plusieurs membres d'un ensemble ordonné. |
zremrangebyrank [clé] [début] [fin] |
Supprime les membres d'un ensemble ordonné dans une plage d'index donnée. |
zrangebyscore [clé] [min] [max] [WITHSCORES] |
Récupère les membres d'un ensemble ordonné dans une plage de scores donnée. |
III. Persistance des Données
Redis offre deux mécanismes principaux pour la persistance des données : RDB et AOF.
1. RDB (Redis Database Backup)
Avantages : Fichier binaire compact, idéal pour les sauvegardes et la réplication, performances élevées lors du fork du processus fils.
Inconvénients : Peut entraîner une perte de données entre les snapshots.
Configuration : Modifiez le fichier 6379.conf pour définir les règles de sauvegarde automatique.
# save <secondes> <changements>
save 900 1 # Sauvegarde si au moins 1 clé change en 15 minutes
save 300 10 # Sauvegarde si au moins 10 clés changent en 5 minutes
save 60 10000 # Sauvegarde si au moins 10000 clés changent en 1 minute
</changements></secondes>
Pour déclencher manuellement une sauvegarde RDB :
redis-cli bgsave
2. AOF (Append Only File)
Avantages : Enregistre toutes les commandes d'écriture, garantissant une perte de données minimale (maximum 1 seconde avec everysec).
Inconvénients : Fichiers potentiellement volumineux, performances légèrement inférieures à RDB pour l'écriture.
Configuration : Modifiez le fichier 6379.conf.
appendonly yes # Active la persistance AOF
appendfilename "redis.aof" # Nom du fichier AOF
appendfsync everysec # Synchronisation des écritures : une fois par seconde
3. Comparaison RDB vs AOF
- RDB : Snapshot d'un moment T, compression binaire. Rapide pour la récupération. Peut perdre des données entre les snapshots.
- AOF : Journal des commandes d'écriture. Perte de données plus faible. Peut être plus volumineux.
Scénarios d'application :
- Bases de données critiques : RDB + AOF pour une durabilité maximale.
- Cache : RDB seul pour de hautes performances, tolérant une perte de données.
- Restauration : Privilégiez AOF si les deux sont activés pour une restauration plus complète.
4. Redémarrage après configuration
Après modification des fichiers de configuration, redémarrez Redis.
redis-cli shutdown
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
IV. Réplication Maître-Esclave
La réplication permet de créer des copies d'une instance Redis maître sur une ou plusieurs instances esclaves, améliorant la disponibilité et la tolérance aux pannes.
1. Configuration de l'esclave
Sur l'instance esclave, modifiez le fichier de configuration pour spécifier l'adresse et le port du maître.
# Fichier de configuration de l'esclave (ex: 6379.conf)
bind 127.0.0.1 192.168.2.2 # IP de l'esclave
slaveof 192.168.2.1 6379 # IP et port du maître
2. Démarrage de l'esclave
Démarrez l'instance Redis avec la configuration d'esclave.
redis-server /chemin/vers/conf/esclave.conf
3. Synchronisation et test
Les données du maître seront automatiquement répliquées sur l'esclave. Les modifications manuelles sur l'esclave sont interdites en mode réplication.
4. Arrêter la réplication
Pour rendre un esclave autonome (par exemple, pour le transformer en maître) :
redis-cli slaveof no one
V. Cluster Redis
Redis Cluster permet de répartir les données sur plusieurs nœuds Redis, offrant scalabilité et haute disponibilité.
1. Concepts
- Partitionnement des données : Les données sont divisées en 16384 "slots" (emplacements) qui sont assignés aux différents nœuds du cluster.
- Haute disponibilité : Le cluster peut continuer à fonctionner même si certains nœuds tombent en panne, grâce à la redondance des données.
- Limitations : Certaines commandes nécessitant l'accès à plusieurs clés simultanément peuvent ne pas être supportées ou avoir des performances réduites.
2. Déploiement manuel d'un cluster
Cette section décrit comment configurer un cluster manuellement, étape par étape, sur plusieurs nœuds.
a. Préparation des nœuds
Pour chaque nœud du cluster (ex: 192.168.2.1, 192.168.2.2, 192.168.2.3), préparez des répertoires de configuration et de données pour différents ports (ex: 6380, 6381).
# Exemple pour 192.168.2.1 avec ports 6380 et 6381
mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{6380,6381}
# Création du fichier de conf pour 6380
cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.2.1
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
# Copie et adaptation pour 6381
cp /opt/redis_cluster/redis_6380/conf/redis_6380.conf /opt/redis_cluster/redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' /opt/redis_cluster/redis_6381/conf/redis_6381.conf
Démarrez les instances Redis sur chaque nœud.
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
b. Découverte des nœuds (CLUSTER MEET)
Depuis un nœud, utilisez la commande cluster meet pour connecter les nœuds entre eux.
# Exécuter depuis 192.168.2.1:6380
redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6381
redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6380
redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6381
redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6380
redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6381
# Vérifier la liste des nœuds
redis-cli -h 192.168.2.1 -p 6380 cluster nodes
Protocole Gossip : Les nœuds communiquent via le protocole Gossip pour échanger des informations sur l'état du cluster (messages ping, pong, meet, fail).
c. Attribution des slots (CLUSTER ADDSLOTS)
Attribuez les 16384 slots aux nœuds maîtres.
# Attribuer les slots 0-5460 au nœud 192.168.2.1:6380
redis-cli -h 192.168.2.1 -p 6380 cluster addslots {0..5460}
# Attribuer les slots 5461-10922 au nœud 192.168.2.2:6380
redis-cli -h 192.168.2.2 -p 6380 cluster addslots {5461..10922}
# Attribuer les slots 10923-16383 au nœud 192.168.2.3:6380
redis-cli -h 192.168.2.3 -p 6380 cluster addslots {10923..16383}
# Vérifier l'attribution des slots
redis-cli -h 192.168.2.1 -p 6380 cluster nodes
d. Configuration de la haute disponibilité (Réplicasion des maîtres)
Configurez les nœuds esclaves pour qu'ils répliquent les maîtres correspondants afin d'assurer la redondance.
# Configurer 192.168.2.1:6381 comme esclave de 192.168.2.1:6380 (ID: 9f48a4...)
redis-cli -h 192.168.2.1 -p 6381 cluster replicate 9f48a4262474744dc22524b28096ccba111d236d
# Configurer 192.168.2.2:6381 comme esclave de 192.168.2.2:6380 (ID: d9ea4f...)
redis-cli -h 192.168.2.2 -p 6381 cluster replicate d9ea4f26b2221a5497d78326a7c1aff828e98426
# Configurer 192.168.2.3:6381 comme esclave de 192.168.2.3:6380 (ID: b6f47e...)
redis-cli -h 192.168.2.3 -p 6381 cluster replicate b6f47e859ad6a3b9b238778d1cf0df4f95710a1f
e. Routage ASK
Lorsqu'un client envoie une commande à un nœud qui ne possède pas le slot correspondant, Redis renvoie une erreur MOVED pour rediriger le client vers le nœud approprié. L'option -c de redis-cli gère automatiquement ces redirections.
Test avec script :
#!/bin/bash
for i in {1..10000}; do
redis-cli -c -h 192.168.2.1 -p 6380 set k_$i v_$i && echo "set k_$i is ok"
done
Interroger une clé peut montrer la redirection :
192.168.2.1:6380> get k_10000
-> Redirected to slot [12695] located at 192.168.2.3:6380
"v_10000"
3. Déploiement automatique avec redis-trib.rb (Versions plus anciennes)
L'outil redis-trib.rb (écrit en Ruby) simplifie la création de clusters Redis. Notez que les versions plus récentes de Redis n'en ont plus besoin pour la création de cluster.
Prérequis : Installer Ruby et le gem redis.
# Installer Ruby (si nécessaire)
yum makecache fast
yum install rubygems
gem sources --remove https://rubygems.org/
gem sources -a http://mirrors.aliyun.com/rubygems/
gem update –system
gem install redis -v 3.3.5 # Utiliser une version compatible
Étapes :
- Arrêtez toutes les instances Redis en cours.
- Supprimez les données des anciens clusters :
rm -rf /data/redis_cluster/redis_*/\* - Redémarrez toutes les instances Redis avec leur configuration cluster activée.
- Utilisez
redis-trib.rbpour créer le cluster. La syntaxe exacte dépend de la version. Généralement :
# Exemple pour créer un cluster avec 6 nœuds (3 maîtres, 3 esclaves)
# Assurez-vous que les instances Redis sont démarrées sur tous les nœuds
# ruby /chemin/vers/redis/src/redis-trib.rb create --replicas 1 192.168.2.1:6380 192.168.2.1:6381 192.168.2.2:6380 192.168.2.2:6381 192.168.2.3:6380 192.168.2.3:6381
4. Basculement en cas de défaillance (Failover)
Lorsqu'un nœud maître tombe en panne, ses esclaves sont promus pour le remplacer afin d'assurer la continuité du service.
Simulation de panne :
# Arrêter le nœud maître 192.168.2.2:6380
redis-cli -h 192.168.2.2 -p 6380 shutdown
Après un certain temps (défini par cluster-node-timeout), un esclave devrait être promu maître. Vérifiez l'état du cluster :
redis-cli -h 192.168.2.1 -p 6380 cluster nodes
Pour rétablir le nœud défaillant et le faire reprendre son rôle (éventuellement comme esclave) :
- Redémarrez l'instance Redis du nœud défaillant (ex: 192.168.2.2:6380).
- Forcez le basculement si nécessaire ou laissez le cluster se réorganiser.