Cet article vous apporte des connaissances pertinentes sur Redis, qui introduit principalement des problèmes liés au hachage cohérent et aux emplacements de hachage. Si une expansion se produit ou des nœuds sont perdus, vous rencontrerez un grand nombre de problèmes de migration de données et de cohérence. évitez ce problème. J'espère que cela sera utile à tout le monde.
Apprentissage recommandé : Tutoriel d'apprentissage Redis
Si nous avons maintenant x périphériques de cache, nous pouvons saisir%x pour décider sur quel périphérique de cache placer les données, mais si une expansion se produit ou si le nœud est perdu, vous Vous avez besoin de key% (x±y), vous rencontrerez donc de nombreux problèmes de migration de données. Un hachage et des emplacements de hachage cohérents peuvent éviter ce problème.
Le hachage ordinaire consiste à prendre le reste du nombre de serveurs. Le hachage cohérent consiste à prendre le reste d'un nombre spécifique (2 ^ 32). , on compare l'IP du serveur ou autre. Le reste de l'identifiant unique est utilisé pour obtenir une valeur. Cette valeur est la position du serveur sur l'anneau de hachage. Ensuite l'objet à placer dans le serveur est haché pour obtenir une valeur. Modifiez le hachage pour trouver le serveur correspondant. S'il n'y a pas de serveur à l'emplacement où se trouve la valeur, jetez un œil à un emplacement où les serveurs savent où trouver le stockage.
Hashez la clé correspondante dans un espace de 2 à la puissance 32 nœuds selon l'algorithme de hachage couramment utilisé, c'est-à-dire un espace numérique de 0 ~ (2 à 32)-1 . Nous pouvons imaginer cette chose se mordant la queue, formant une boucle fermée.
Maintenant que l'anneau est là, nous devons mettre le serveur sur l'anneau. Nous pouvons obtenir le numéro et d'autres identifiants uniques basés sur l'adresse IP du serveur. , prenez le hash et mettez-le sur l'anneau.
Lorsque nous devons mettre une donnée sur le serveur, nous devons d'abord calculer la valeur de hachage des données, puis prendre le reste si la valeur restante a une valeur correspondante. sur l'anneau Le serveur le mettra directement s'il n'existe pas, il effectuera une recherche en arrière.
Donc finalement data1 est dans redis1 et data2 est dans redis2. Lorsque nous obtenons des données, nous effectuons également le même processus, calculons la valeur de hachage de la clé, puis obtenons le serveur stocké selon les mêmes règles.
Si un nœud Redis raccroche maintenant, les données des autres nœuds seront toujours là et les données du nœud d'origine seront redistribuées au nœud suivant.
Si vous ajoutez un nouveau serveur RedisNeo à l'environnement, mappez RedisNeo à l'anneau via l'algorithme de hachage et suivez les règles de migration dans le sens des aiguilles d'une montre, alors les données avec la valeur de hachage précédente entre Redis2 et RedisNeo seront migrées vers RedisNeo (dans la figure ci-dessous) RedisNeo est à côté de Redis2), et les autres objets conservent leurs emplacements de stockage d'origine. Grâce à l'analyse de l'ajout et de la suppression de nœuds, l'algorithme de hachage cohérent maintient la monotonie tout en minimisant la migration des données. Un tel algorithme est très adapté aux clusters distribués et évite une grande quantité de migration de données, réduisant ainsi la pression sur le serveur.
Ainsi, après l'ajout de redisNeo, data3 entre dans redisNeo.
Jusqu'à présent, un hachage cohérent peut être considéré comme terminé, mais il y a un problème qui doit encore être résolu, et c'est l'équilibre. D'après la figure ci-dessous, nous pouvons voir que lorsqu'il y a relativement peu de nœuds de serveur, un problème surviendra, c'est-à-dire qu'une grande quantité de données sera inévitablement concentrée sur un seul nœud. Par exemple, si vous n'avez que deux nœuds, un sur un. 1 et l'autre à 10, alors ce sera très difficile Évidemment la pression sur le nœud 1 est infinie, car seuls ceux avec des valeurs de hachage entre [2,10] iront au nœud 10, et les autres iront tous au nœud 10. nœud 1. Afin de résoudre ce problème de biais de données, l'algorithme de hachage cohérent introduit un mécanisme de nœud virtuel, c'est-à-dire que plusieurs hachages sont calculés pour chaque nœud de service et qu'un nœud de service est placé à chaque position de résultat de calcul, appelée un nœud virtuel. La méthode spécifique peut consister à déterminer d'abord le nombre de nœuds virtuels associés à chaque nœud physique, puis à ajouter le numéro après l'adresse IP ou le nom d'hôte. Dans le même temps, l'algorithme de positionnement des données reste inchangé, à l'exception du mappage des nœuds virtuels. aux nœuds réels.
L'emplacement de hachage est utilisé dans le schéma de cluster de cluster Redis. Le cluster de cluster Redis n'utilise pas de schéma de hachage cohérent, mais utilise l'emplacement de hachage dans le partage de données pour le stockage et la lecture des données. Le cluster Redis utilise des emplacements de hachage de fragments de données pour le stockage et la lecture des données. Le cluster Redis a un total de 2 ^ 14 (16 384) emplacements. Tous les nœuds maîtres auront une zone d'emplacement telle que 0 ~ 1 000. Le nombre d'emplacements peut être migré. Le nœud esclave du nœud maître n'attribue pas d'emplacements et dispose uniquement d'autorisations de lecture. Mais notez que dans le code, le cluster redis effectue des opérations de lecture et d'écriture sur le nœud maître. Ce n'est pas le nœud esclave pour la lecture et le nœud maître pour l'écriture. Lorsqu'un cluster Redis est créé pour la première fois, 16 384 emplacements sont répartis uniformément par le nœud maître.
Par rapport au hachage cohérent, vous devez allouer manuellement des emplacements de hachage lors de l'expansion et de la réduction, et lors de la suppression du nœud maître, vous devez donner ses nœuds esclaves et ses emplacements de hachage à d'autres nœuds maîtres. Déterminez à quel emplacement il appartient ; à basé sur la valeur de CRC-16(key)%16384.
Apprentissage recommandé : Tutoriel Redis
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!