
Comment démarrer rapidement avec VUE3.0 : apprenons
à utiliser la fonction de cluster redis dans nodejs . Je n'ai pas trouvé d'article relativement complet et facile à comprendre, j'ai donc également fait beaucoup de détours lors du développement et du débogage. processus.
Cet article présentera en détail comment créer un cluster Redis localement, comment utiliser le cluster sur le client, résumera et expliquera les problèmes et les erreurs rencontrés lors du processus de construction pour éviter les détours la prochaine fois et améliorer le développement et l'efficacité du travail.
Le contexte de l'utilisation du cluster est le suivant : en mode singleton Redis, avec l'augmentation du nombre d'utilisateurs et de visites, la valeur qps augmente fortement ??, un grand nombre d'opérations io provoquent cpu(100%) à un certain temps, et il peut y avoir des temps d'arrêt à tout moment. En même temps, le traitement par lots redis et d'autres méthodes ne traitent que les symptômes mais pas la cause première, et ne peuvent pas surmonter le goulot d'étranglement des performances du serveur . Il est donc impératif d’utiliser une solution cluster ou d’ajouter des instances Redis.
cluster fait généralement référence à un cluster de serveurs, qui est différent d'un système distribué. Il rassemble de nombreux serveurs pour exécuter le même service. Du point de vue du client, il semble qu'il n'y ait qu'un seul serveur. Un cluster peut utiliser plusieurs ordinateurs pour le calcul parallèle afin d'atteindre une vitesse de calcul élevée. Il peut également utiliser plusieurs ordinateurs pour la sauvegarde, de sorte qu'en cas de panne d'une machine, l'ensemble du système puisse toujours fonctionner normalement. ( Avant redis3.0, le mode sentinelle était généralement utilisé, mais la configuration de la sentinelle est légèrement compliquée et les performances et la haute disponibilité sont moyennes .)
qu'en raison du mécanisme de tolérance aux pannes de vote, plus de la moitié des Les nœuds pensent qu'un certain nœud est en panne. Le nœud est en panne, donc 2 nœuds ne peuvent pas former un cluster, donc le cluster Redis nécessite au moins 3 nœuds.
Pour garantir la haute disponibilité du cluster, chaque nœud doit disposer d'un nœud esclave (c'est-à-dire un nœud de sauvegarde), Redis nécessite donc au moins 6 serveurs. (Trois maîtres et trois esclaves, trois dépôts et trois récupérations, haute disponibilité et sauvegarde)
Bien sûr, il nous est impossible d'utiliser autant de serveurs lors du débogage local, nous pouvons donc simuler l'exécution de 6 instances redis localement. Cluster Redis dans l'environnement de production La construction est fondamentalement la même qu'ici.
Vous pouvez choisir de l'installer sur le site officiel, ou vous pouvez l'installer avec la ligne nommée
#install Brew Install Redis. #Démarrer le serveur Redis #Entrez le client Redis redis-cli
vous devez d'abord trouver l'emplacement du fichier de configuration Redis
brew list redis # Vérifiez l'emplacement ducd /opt/homebrew/Cellar/redis/6.2.4 # Entrez la version en fonction de l'emplacement Le dossier où se trouve le numéroopen . # Ouvrez le dossierXcode.app pour ouvrir homebrew.mxcl.redis.plist pour trouver l'emplacement de redis.conf , comme indiqué. ci-dessous:

Créez six fichiers de configuration de service
cd /opt/homebrew/etc/ (le répertoire des fichiers de configuration trouvé à l'étape précédente)
# Doit être dans le chemin /opt/homebrew/etc/ mkdir -p redis/cluster/7000 mkdir -p redis/cluster/7001 mkdir -p redis/cluster/7002 mkdir -p redis/cluster/7003 mkdir -p redis/cluster/7004 mkdir -p redis/cluster/7005
Modifier le fichier de configuration
Le fichier de configuration sous le chemin /opt/homebrew/etc/redis.conf n'a pas besoin d'être modifié, copiez-le simplement dans le répertoire redis/cluster/7000 créé ci-dessus, puis. modifiez-le Les étapes sont les suivantes :
cd /opt/homebrew/etc/ # Entrez le répertoire du fichier de configuration cp redis.conf redis/cluster/7000/7000.conf. code redis/cluster/7000/7000.conf # Ouvrez le fichier de configuration avec un éditeur ou vim pour le modifier
7000.conf , modifiez les propriétés suivantes# Numéro de port Redis (chaque fichier de configuration 7000-7005 doit être modifié) port 7000 # Activer le mode cluster et exécuter le cluster activé oui # Chemin du fichier de configuration interne du cluster, nodes-6379.conf par défaut (chaque fichier de configuration 7000-7005 doit être modifié) fichier de configuration du cluster nodes-7000.conf # Délai d'expiration de la communication inter-nœuds cluster-node-timeout 5000 # Persistance des données en annexe oui
cd /opt/homebrew/etc/redis/cluster # Entrez le répertoire du fichier de configuration cp 7000/7000.conf 7001/7001.conf cp 7000/7000.conf 7002/7002.conf cp 7000/7000.conf 7003/7003.conf cp 7000/7000.conf 7004/7004.conf cp 7000/7000.conf 7005/7005.conf
7001.conf-7005.confRemarque : Chaque fichier de configuration doit configurer port和cluster-config-file différents. valeur port和cluster-config-file (sinon le cluster ne prendra pas effet), qui se distingue par le port.
Le répertoire du fichier de configuration peut être trouvé via la commande find /opt/homebrew -name nodes-7000.conf .
Puisque nous avons configuré 6 services, il est impossible de les démarrer ou de les arrêter un par un. Vous devez utiliser un script shell pour
entrer dans le répertoire /opt/homebrew/etc/redis/cluster et créer. start.sh et arrêtez le fichier .sh
# start.sh file#!/bin/sh. serveur redis /opt/homebrew/etc/redis/cluster/7000/7000.conf & serveur redis /opt/homebrew/etc/redis/cluster/7001/7001.conf & serveur redis /opt/homebrew/etc/redis/cluster/7002/7002.conf & serveur redis /opt/homebrew/etc/redis/cluster/7003/7003.conf & serveur redis /opt/homebrew/etc/redis/cluster/7004/7004.conf & serveur redis /opt/homebrew/etc/redis/cluster/7005/7005.conf & # fichier stop.sh #!/bin/sh redis-cli -p 7000 arrêt & redis-cli -p 7001 arrêt & redis-cli -p 7002 arrêt & redis-cli -p 7003 arrêt & redis-cli -p 7004 arrêt & redis-cli -p 7005 shutdown et
exécutez ./start.sh ou ./stop.sh pour démarrer et arrêter le service
Exécutez ps -ef |grep redis pour afficher le service redis démarré.
Remarque : il est nécessaire d'exécuter ./. start.sh pour la première fois. Autorisez les autorisations d'exécution via sudo chmod +x start.sh
redis-cli -p 7000 # Démarrer un seul client redis-server 7000/7000.conf # Démarrer un seul serveur redis-cli -p 7000 shutdown # Arrêter le serveur sudo chmod +x start.sh # Activer l'autorisation d'exécution du script # Définir la relation maître-esclave Redis (trois maîtres et trois esclaves) redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 nœuds de cluster #Afficher l'état du nœud de cluster (entrez un client à exécuter) informations sur le cluster #Afficher les informations sur le cluster (entrez un client à exécuter) Afficher toutes les valeurs clés : clés * Supprimer la valeur à l'index spécifié : del key Effacer les données de l'intégralité du serveur Redis : flushall Effacer toutes les clés de la bibliothèque actuelle : le
Redis.Cluster fournit la fonction de sharding automatique sur plusieurs nœuds Redis. Utilisez les six serveurs redis construits précédemment, puis démarrez node redis.js , vous pouvez tester l'effet du cluster. ioredis
// redis.js
const Redis = require("ioredis");
const cluster = nouveau Redis.Cluster([
{
port : 7000,
hôte : "127.0.0.1",
},
{
port : 7001,
hôte : "127.0.0.1",
},
]);
cluster.set("foo", "bar");
cluster.get("foo", (err, res) => {
// res === 'barre'
}); pour importer la file d'attente depuis 'bull'
// Créer une instance de file d'attente Redis const instance = new Queue('custom', {
préfixe : '{monpréfixe}',
créerClient(type) {
// L'instance de cluster de cluster est la même que ci-dessus return cluster
}
})
//Ajouter des données à la file d'attente Redis (producteur)
instance.ajouter(
'demande',
{
...paramètres
},
{
supprimerOnComplete : faux
}
).catch(e => {
console.erreur(e)
})
// Rappel du consommateur instance.process('request', 5, async (job, done) => {
console.log('Obtenir les données actuellement consommées :', job.data)
//Effectuer une opération asynchrone en attendant une nouvelle promesse((resolve)=>resolve())
fait()
}) Il y a un problème lors de l'utilisation du framework bull pour se connecter au cluster ioredis : chaque fois que des données push vers la file d'attente redis , la fonction de rappel correspondante peut être déclenchée plusieurs fois. Il est actuellement impossible de déterminer s'il s'agit d'un problème. l'utilisation ou un problème avec le framework lui-même (si vous en savez plus, bienvenue à tous. Laissez un message pour informer).
Alternative au clustering : si la synchronisation et la migration des données ne sont pas requises, plusieurs instances redis peuvent être utilisées sur le client, combinées avec Math.random() pour diviser les données de manière égale dans l'un des redis , résolvant ainsi le problème du matériel à instance unique. ( cpu etc.) problème de goulot d'étranglement.
1. Une erreur se produit lors de la connexion à Redis sous le système Mac ?
Message d'erreur de la console : Impossible de se connecter à Redis à 127.0.0.1:6379 : Connexion refusée
Raison : Le serveur n'est pas démarré ou ne parvient pas à démarrer
Solution : Vous devez d'abord démarrer le serveur Redis,
lien de référence
du serveur Redishttps://blog. csdn.net/qq_23347459/article/details/104257529
2. Lors du démarrage du client, signale-t-il une erreur lors de la lecture ou de l'écriture ?
Message d'erreur : ClusterAllFailedError : échec de l'actualisation du cache des emplacements.
Raison : les attributs du fichier de configuration du cluster dans les fichiers de configuration sous chaque service sont cohérents.
Traitement : modifier en valeur d'attribut unique
Lien de référence 1
https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache
Référence 2
https://github.com/luin/ioredis/ issues /711
3. Vous n'avez pas réussi à exécuter l'instruction redis de création maître-esclave ?
Exécuter l'instruction : redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
Erreur d'invite : [ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
: lors de l'exécution de l'instruction de création, les données ne sont pas effacées et le cluster n'est pas réinitialisé. .
Traitement : Effacement des données Et réinitialisez le cluster, effacez les fichiers rdb et aof,
reportez-vous à l'effacement des données redis
https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working
# Prenez le service du port 7000. à titre d'exemple, répétez les opérations suivantes pour 7001-7005 $redis-cli -p 7000 127.0.0.1:7000> tout à fait 127.0.0.1:7000> réinitialisation du cluster 127.0.0.1:7000>sortie # Utilisez find pour trouver les fichiers rdb et aof (également dans le répertoire rdb) trouver /opt/homebrew -name dump.rdb # Réexécutez l'instruction create avec succès redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1 : 7005
L'utilisation du cluster redis sur le client est très simple, en comparaison, la configuration sur le serveur sera plus lourde.
L'utilisation spécifique du client n'est que brièvement expliquée. Lors de l'utilisation, il convient de prêter attention à des problèmes tels que la synchronisation et la migration des données Redis.
Bien que l'utilisation d'un cluster puisse améliorer les capacités du service, prendre en charge la réplication maître-esclave, le mode sentinelle, la séparation lecture-écriture et répartir uniformément la pression sur le serveur, etc. Cependant, il ne dispose pas de fonctions automatiques de tolérance aux pannes et de récupération. Si un temps d'arrêt se produit, certaines demandes de lecture et d'écriture échoueront, réduisant ainsi la disponibilité du système. Lors de l'utilisation, analysez et choisissez différentes solutions en fonction des conditions commerciales.
Cet article est reproduit à partir de : https://juejin.cn/post/7079928963107127327
Auteur : tager