Redis Sentinel – Haute disponibilité : Tout ce que vous devez savoir de DEV à PROD: Guide complet

Que signifie réellement le terme  » Redis » ?

Cela signifie Serveur de dictionnaire distant.

D’accord! Il existe de nombreux articles Redis différents, mais je voulais partager mon expérience en tant que développeur avec Redis en créant un « article tout-en-un » couvrant les éléments les plus essentiels et les plus importants nécessaires et utiles pour un développeur ou un ingénieur devops pour créer un cluster Redis hautement disponible avec Sentinel.

Commençons donc

Redis, qui est un magasin de structure de données en mémoire open source, est une sélection très populaire parmi les développeurs utilisés à des fins de mise en cache, en tant que courtier de messages et également principalement utilisé comme base de données Clé-valeur NoSQL pour différents cas d’utilisation.

Dans cet article, je vais spécifiquement discuter et faire une démonstration de Redis avec la réplication Maître / esclave, la haute disponibilité (Sentinelle Redis), le Basculement automatique, certains conseils d’optimisation du niveau de production et les aspects de surveillance. De plus, parallèlement à ces sujets, je mentionnerai les problèmes et les erreurs auxquels j’ai été confronté lors de la mise en œuvre de Redis Sentinel avec Ubuntu. Voici les détails de la version du système d’exploitation et de la version Redis.

OS version: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Redis Version: 4.0.9

De plus, je tiens à souligner que la documentation Redis est très informative et qu’elle est « la destination » si vous avez besoin de plus de précisions sur Redis.

Aller de l’avant vers les bases de Redis; Redis est une base de données en mémoire, ce qui signifie simplement que Redis fonctionne sur la RAM. Vous devez également savoir que Redis prend en charge plusieurs structures de données telles que des chaînes, des hachages, des listes, des ensembles, des ensembles triés avec des requêtes de plage, des bitmaps. En outre, il prend également en charge les opérations atomiques telles que l’ajout à une chaîne, l’incrémentation de la valeur dans un hachage, le fait de pousser un élément vers une liste, etc.

Eh bien, commençons les choses avec la haute disponibilité Redis.

Redis sentinel est la solution haute disponibilité proposée par Redis. En cas de défaillance de votre cluster Redis, Sentinel détecte automatiquement le point de défaillance et ramène le cluster en mode stable sans aucune intervention humaine.

Que se passe-t-il vraiment à l’intérieur de Redis Sentinel ?

Sentinel vérifie toujours les instances MAÎTRE et ESCLAVE dans le cluster Redis, vérifiant si elles fonctionnent comme prévu. Si sentinel détecte une défaillance dans le nœud MAÎTRE d’un cluster donné, Sentinel lancera un processus de basculement. En conséquence, Sentinel choisira une instance ESCLAVE et la promouvra en MASTER. En fin de compte, les autres instances ESCLAVES restantes seront automatiquement reconfigurées pour utiliser la nouvelle instance MAÎTRE.

Sentinel agit en tant que fournisseur de configuration ou source d’autorité pour la découverte du service client.

Qu’est-ce que cela signifie? Simplement, les clients d’application se connectent aux Sentinelles et les Sentinelles leur fournissent la dernière adresse MAÎTRE Redis.

De plus, Sentinel est un système distribué robuste, où plusieurs sentinelles doivent s’entendre sur le fait qu’un maître donné n’est plus disponible. Ensuite, seul le processus de basculement démarre une sélection d’un nouveau nœud MAÎTRE. Cet accord sentinelle se fait en fonction de la valeur du quorum.

Qu’est-ce que le quorum ?

La valeur de quorum est le nombre de sentinelles qui doivent s’entendre sur le fait que le maître n’est pas joignable. Cependant, le quorum n’est utilisé que pour détecter l’échec. Afin d’effectuer réellement un basculement, l’une des Sentinelles doit être élue leader pour le basculement et être autorisée à procéder. Cela ne se produit qu’avec le vote de la majorité des processus Sentinelles.

Salissons-nous les mains avec Redis Sentinel.

Nous allons nous en tenir à la configuration de base avec 3 instances de serveur.

Veuillez vous référer au diagramme ci-dessus qui illustre la configuration de base des 3 instances du serveur. Tout d’abord, assurez-vous que vos instances Ubuntu sont à jour avec les dépendances de construction pertinentes. Parfois, vous pourriez aussi avoir besoin de jemalloc. Voici les étapes à suivre pour installer Redis sur vos instances de serveur.

sudo apt-get update 
sudo apt-get install build-essential tcl
sudo apt-get install libjemalloc-dev (Optional)curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install

Maintenant, dans le répertoire redis, vous devriez pouvoir voir les deux redis.conf et sentinelle.fichiers de configuration conf.

Avant d’exécuter Redis, effectuons les configurations de base nécessaires pour exécuter un cluster Redis. Voici les adresses IP de cette configuration.

10.52.209.46 (Initial Master Node)
10.52.209.47 (Initial Slave Node)
10.52.209.49 (Initial Slave Node)

Le port par défaut du serveur Redis est 6379 et Sentinel est 26379. Assurez-vous donc d’ouvrir ces ports en utilisant,

sudo ufw allow 6379
sudo ufw allow 26379

Les configurations Redis (toutes deux dans redis.conf et sentinelle.conf) dans les serveurs ci-dessus doivent être configurés comme suit.

Pour la configuration de base ci-dessus, les configurations seront suffisantes, mais pour le niveau de production, veuillez considérer les conseils mentionnés dans la dernière partie de cet article. La seule différence dans redis.les fichiers de configuration dans 3 serveurs sont que tous les esclaves doivent avoir la configuration suivante. 10.52.209.46 est l’adresse IP principale.

slaveof 10.52.209.46 6379

slaveof indique au cluster Redis de faire de cette instance de serveur particulière une instance ESCLAVE du nœud MAÎTRE donné (10.52.209.46).

En sentinelle.conf, config suivant notifie les Sentinelles pour démarrer la surveillance du cluster avec les paramètres initiaux suivants. Ensuite, ce paramètre de configuration peut être automatiquement mis à jour en conséquence.

sentinel monitor mymaster 10.52.209.46 6379 2
(This tells sentinel to monitor the master node. And the last argument which is 2 is the quorum value)

Plus loin, sentinelle.conf inclut également les valeurs de configuration suivantes.

sentinel down-after-milliseconds mymaster 5000
(Means server will unresponsive for 5 seconds before being classified as +down and consequently activating a +vote to elect a new master node.)sentinel failover-timeout mymaster 10000
(Specifies the failover timeout in milliseconds.)

Okie Dokie! Maintenant run courons Redis.

Il existe de nombreuses façons d’exécuter Redis. Dans cette démo, je vais m’en tenir à la commande suivante.

(Go to src folder.)
cd src/ && redis-server ../redis.conf &
cd src/ && redis-server ../sentinel.conf — sentinel &(Or else you can simply use cd utils && ./install_server.sh.)

Après cela, vous pouvez simplement vérifier les processus Redis via la commande ps-ef | grep redis. Chaque instance de serveur doit exécuter à la fois un processus Redis et un processus Sentinel. Si tout va au plan, il devrait y avoir 2 processus qui s’exécutent comme suit.

Connectez-vous maintenant au client Redis via l’une des commandes suivantes et testez si Redis fonctionne correctement.

redis-cli ping
or
redis-cli -h IP_Address pingYou should get a output of PONG.

Génial! Maintenant, vous avez Redis opérationnel. Concentrons-nous sur la réplication Maître / Esclave.

Réplication maître / esclave

Maintenant, si vous vérifiez le redis.log (qui est situé à l’endroit que nous avons défini dans le redis.conf) de chaque instance, vous pouvez voir la synchronisation Maître-esclave s’être produite.

Nœud maître – redis.log

Nœud esclave – redis.log

Vérification de l’état de la réplication

Vous pouvez également vérifier les informations de réplication via la commande info replication dans Redis CLI. Sous l’attribut role, il indique si ce nœud particulier est un MAÎTRE ou un ESCLAVE (boîte jaune). De plus, dans le nœud Maître, il affiche les détails de tous les esclaves connectés. (boîte verte)

Examinons maintenant quelle sentinelle.le journal indique. (qui est situé à l’endroit que nous avons défini dans la sentinelle.conf)

De plus, si vous vérifiez la sentinelle.fichier conf, vous pouvez voir que le fichier conf est automatiquement mis à jour avec les dernières configurations, y compris les valeurs sentinel known-slave et sentinel known-sentinel.

Cool! Créons maintenant un exemple de valeur dans tous les nœuds.

127.0.0.1:6739> set demokey "Amila"

Comme vous pouvez le voir dans le diagramme ci-dessus, les ESCLAVES sont EN LECTURE SEULE, vous ne pouvez donc écrire que des données à maîtriser. Étant donné que Redis se réplique de manière asynchrone avec tous les esclaves restants, vous pouvez récupérer la valeur insérée à partir de tous les esclaves Redis en utilisant la même clé donnée. En outre via, KEYS* vous pouvez lister toutes les clés insérées. Le diagramme ci-dessus décrit clairement ce dont nous venons de parler.

Voyons maintenant comment fonctionne le basculement automatique de Redis Sentinel.

Basculement automatique Redis Sentinel

Okiee! Simulons un scénario de basculement automatique. Afin de simuler un scénario de basculement, vous pouvez simplement arrêter le serveur Redis ou tuer le processus Redis dans l’instance PRINCIPALE. Même vous pouvez également dormir le processus Redis. Vous pouvez choisir la façon dont vous le désirez.

kill -9 <process id>
or
redis-cli -p 6379 DEBUG sleep 30
or
redis-cli -p 6379 DEBUG SEGFAULT

Comme illustré dans le diagramme ci-dessus, dans un scénario de basculement, si le nœud MAÎTRE échoue, les 2 Sentinelles restantes détermineront le basculement et si les deux sont d’accord (puisque la valeur de quorum est de 2), un nouveau MAÎTRE sera élu parmi ces 2 nœuds restants.

Ci-dessous montre la queue du journal pour ce scénario de basculement.

redis.journal des nœuds esclaves.

sentinelle.journal des nœuds esclaves

Vérifions maintenant l’état de la réplication via la commande info replication.

Elaboration de la queue de bûche,

Chaque Sentinelle détecte que le maître est en panne avec un événement +sdown. (+sdown signifie que l’instance spécifiée est maintenant dans un état subjectivement bas.)

+ new-epoch signifie que l’époque actuelle a été mise à jour.L’événement

+sdown est ensuite escaladé à +odown, ce qui signifie que plusieurs Sentinelles sont d’accord sur le fait que le maître n’est pas accessible. (+ odown signifie que l’instance spécifiée est maintenant dans un état objectivement bas.)

Sentinelles + votez une Sentinelle qui lancera la première tentative de basculement.

Le basculement se produit.

Plus loin, la suite affiche les tâches arrivantes.

Arrivée pour Redis

description "Redis Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../redis.conf"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Arrivée pour Sentinel

description "Redis Sentinel Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../sentinel.conf --sentinel"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Félicitations! C’est tout simplement ça. C’est ainsi que Redis gère la Haute disponibilité et le Basculement automatique. Voyons maintenant quelques faits intéressants de Redis avant de passer à des trucs et astuces d’optimisation.

Faits intéressants sur Redis.

Référence de l’Image: http://download.redis.io/logocontest/

Redis peut gérer jusqu’à 2 32 clés et a été testé en pratique pour gérer au moins 250 millions de clés par instance.

Une instance vide utilise ~3 Mo de mémoire.

1 Million de petites touches – > Les paires de valeurs de chaîne utilisent ~ 85 Mo de mémoire.

1 Million de clés – > Valeur de hachage, représentant un objet à 5 champs, utilise ~ 160 Mo de mémoire.

Redis est à filetage unique. Comment puis-je exploiter plusieurs CPU / cœurs?

Il n’est pas très fréquent que le processeur devienne votre goulot d’étranglement avec Redis, car Redis est généralement lié à la mémoire ou au réseau. Si c’est le cas, la mise à l’échelle horizontale ou verticale des instances Redis aidera à réduire les goulots d’étranglement liés au PROCESSEUR.

Redis est une base de données en mémoire mais persistante sur disque.

Persistance Redis – > RDB : instantanés ponctuels de votre ensemble de données à des intervalles spécifiés. (Sauvegarde des données) / AOF : enregistre chaque opération d’écriture reçue par le serveur. (Plus durable)

Si vous utilisez Java, vous pouvez utiliser Jedis qui est un client java, pour connecter votre application Java à Redis. Remarque : Jedis utilise le pool Apache Commons pour la mise en commun des connexions (GenericObjectPool). A single Jedis instance is not threadsafe! Pour éviter ces problèmes, vous devez utiliser JedisPool, qui est un pool de connexions réseau threadsafe. La taille maximale par défaut du pool de connexions est de 8.

Concentrons-nous maintenant sur les problèmes / erreurs que vous pourriez rencontrer et quelques conseils et astuces d’optimisation des performances de production pour Redis.

Problèmes / erreurs que vous pourriez obtenir & Trucs et astuces d’optimisation des performances de production

Tout d’abord, dans le redis.conf et sentinelle.conf, toutes les configurations sont dans un ordre, alors ne gâchez pas l’ordre. Sinon, vous obtiendrez des erreurs de configuration comme suit.

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 98
>>> 'sentinel down-after-milliseconds mymaster 5000'
No such master with specified name.

Du point de vue de la sécurité, configurez un mot de passe pour vous authentifier auprès du maître et des esclaves. Pour cela, vous pouvez facilement changer le redis.conf et sentinelle.conf en conséquence avec la valeur de configuration suivante.

In sentinel.conf
sentinel auth-pass <master-name> <password>In redis.conf
masterauth <master-password>

Fait que le paramètre de backlog TCP (connexions max) est 511. Vous pouvez définir cette valeur en conséquence (en tenant compte des spécifications de votre serveur) en procédant comme suit.

sudo nano /etc/rc.local
Add this:
sysctl -w net.core.somaxconn=65535When you reboot the next time, the new setting will be to allow 65535 connections instead of 128 as before. When you add the line to rc.local make sure it's before the exit 0.

Certains des avertissements que vous pourriez rencontrer du redis.log pourrait être,

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.You can add this via following command as well as using a cat command you can makesure whether the value is set properly.echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
cat /etc/sysctl.conf

Vous devrez peut-être désactiver THP ou une Énorme page transparente.

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.Fixsudo nano /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled

L’utilisation d’un socket UNIX au lieu du port TCP 6379 contribuera également au gain de performances de Redis.

Référence: https://redis.io/topics/benchmarks

Pour y parvenir, redis.conf doit être changé en paramètre suivant.

unixsocket /var/run/redis.sock
unixsocketperm 777# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0

De plus, selon votre cas d’utilisation, vous pouvez également configurer l’option de persistance Redis.

Si vous le souhaitez, vous pouvez désactiver la persistance du tout, si vous souhaitez que vos données existent tant que le serveur est en cours d’exécution. Remarque : vous pouvez désactiver la persistance RDB en commentant toutes les lignes « enregistrer » dans redis.conf comme suit.

Comment out these 3 values in redis.conf
save 900 1
save 300 10
save 60 10000rdbcompression no
rdbchecksum no

La persistance AOF (Ajouter uniquement un fichier) est désactivée par défaut dans redis.conf.

appendonly no

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Surveillance Redis

Du point de vue de la surveillance, il existe plusieurs outils pour surveiller Redis. NewRelic fournit des fonctionnalités avancées pour surveiller et analyser Redis, y compris « La plupart des opérations de base de données consommées en temps », « opérations par débit », « opérations par temps de requête », etc.

Plus d’informations sur New Relic Redis sont mentionnées ici. De plus, Redis-stat est également un bon outil de surveillance open source Redis.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

AWS ElasticCache

AWS propose également un service de cloud cache en mémoire nommé  » ElastiCache « , qui est également livré avec Redis inclus. Il peut être spécifié comme un service cloud efficace et facile à utiliser, qui décharge la plupart des configurations manuelles et des tâches administratives.

ElastiCache est un service Web qui facilite le lancement, la gestion et la mise à l’échelle d’un cache en mémoire distribué dans le cloud.

Fait intéressant, il est livré avec de fabuleuses fonctionnalités avancées telles que le mode Cluster avec partage en quelques clics, le Multi-AZ avec basculement automatique, le cryptage au repos, le cryptage en transit, l’importation de fichiers RDB vers S3, l’activation des sauvegardes automatiques et bien d’autres.

La caractéristique la plus intéressante d’AWS ElastichCache est qu’il offre un tableau de bord de surveillance complet pour votre cluster Redis, y compris des aspects de surveillance tels que l’utilisation du PROCESSEUR / de la mémoire (Échange et mémoire libre), le nombre de connexions, le nombre d’éléments, les Expulsions, la Chaîne; Clé; Le nombre de commandes basé sur le hachage, le retard de réplication et bien d’autres.

Eh bien That C’est à peu près tout pour ce post!

Comme je l’ai mentionné au début de cet article, il existe de nombreux articles Redis différents, mais je voulais créer un « article tout-en-un » couvrant les faits et conseils les plus essentiels nécessaires et utiles pour un développeur ou un ingénieur devops pour construire un cluster Redis hautement disponible avec Sentinel.

Avant de terminer ce post, l’un des articles intéressants que j’ai trouvés était la façon dont Flickr a implémenté Redis Sentinel. Assurez-vous également de vérifier ce message.

OK. Alors merci beaucoup d’avoir lu cet article et j’ai hâte de proposer bientôt un autre article intéressant, partageant mon expérience en tant que développeur. D’ici là, Santé! et Bon Codage!