Guide Complet sur Redis : Configuration Cluster, Persistance et Réplication Maître-Esclave

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 :

  1. Arrêtez toutes les instances Redis en cours.
  2. Supprimez les données des anciens clusters : rm -rf /data/redis_cluster/redis_*/\*
  3. Redémarrez toutes les instances Redis avec leur configuration cluster activée.
  4. Utilisez redis-trib.rb pour 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) :

  1. Redémarrez l'instance Redis du nœud défaillant (ex: 192.168.2.2:6380).
  2. Forcez le basculement si nécessaire ou laissez le cluster se réorganiser.

Étiquettes: Redis Cluster persistance RDB AOF

Publié le 9 août à 12h11