AccueilInformatique Distribuée & ParallèleHachage Cohérent — L'Anneau de Hachage

💍 Hachage Cohérent — L'Anneau de Hachage

Placez clés et serveurs sur un anneau de hachage afin que l'ajout ou la suppression d'un nœud ne remappe qu'une petite fraction des clés. Les nœuds virtuels lissent la charge — la technique derrière les caches distribués et les DHT.

Informatique Distribuée & Parallèle3DModérée60 FPS
consistent-hashing ↗ Ouvrir en autonome

À propos du Hachage Cohérent

Le hachage cohérent résout un problème critique des systèmes distribués : comment attribuer des clés de données à des serveurs de sorte que l'ajout ou la suppression d'un nœud rebrasse le moins de clés possible. La technique place à la fois les clés et les serveurs à des positions sur un anneau de hachage circulaire de taille 2^32. Chaque clé appartient au premier serveur trouvé dans le sens horaire à partir de sa position. Avec l'approche naïve du modulo (hash(clé) mod N), changer N d'un nombre de serveurs à un autre peut remapper presque toutes les clés — catastrophique pour un cache en production. Le hachage cohérent limite la perturbation à environ 1/N des clés en moyenne, car seul l'arc de l'anneau adjacent au serveur ajouté ou supprimé change de propriétaire.

Les nœuds virtuels (aussi appelés répliques) sont le raffinement pratique : chaque serveur physique est placé à V positions sur l'anneau au lieu d'une seule, divisant sa possession en de nombreux petits arcs. Cela lisse considérablement la distribution de charge — sans nœuds virtuels, un seul serveur pourrait par hasard s'accaparer 40 % des clés ; avec 100+ nœuds virtuels, la distribution converge vers l'idéal de 1/N par serveur. Ajustez les serveurs, le nombre de nœuds virtuels et l'ensemble de clés avec les curseurs, puis ajoutez ou supprimez des serveurs pour observer combien peu de clés (surlignées en blanc) doivent se déplacer.

Questions fréquentes

Pourquoi le hachage par modulo provoque-t-il une redistribution massive des clés lorsque les serveurs changent ?

Avec hash(clé) mod N, l'emplacement auquel chaque clé est associée dépend de N. Quand N change — disons de 4 à 5 — le modulo change pour pratiquement chaque clé, remappant environ (N−1)/N ≈ 80 % d'entre elles. Le hachage cohérent élimine ce problème en découplant les positions des clés du nombre de serveurs : chaque clé correspond toujours à la même position sur l'anneau, et seule la recherche dans le sens horaire change lors de l'ajout ou de la suppression d'un serveur.

Combien de clés se déplacent exactement lors de l'ajout d'un serveur à l'anneau ?

Lorsqu'un nouveau serveur S est placé à la position p sur l'anneau, il s'approprie l'arc allant du serveur précédent (dans le sens horaire) jusqu'à p. Seules les clés situées dans cet arc se déplacent — elles passent de leur ancien propriétaire à S. En moyenne, cela représente 1/N de toutes les clés, où N est le nouveau nombre de serveurs. Toutes les autres clés restent avec leurs propriétaires existants.

Quel problème les nœuds virtuels résolvent-ils, et combien devrait-on en utiliser ?

Avec une seule position par serveur, un placement aléatoire sur l'anneau produit des longueurs d'arc très inégales : certains serveurs peuvent recevoir 3 fois la charge moyenne. Placer chaque serveur physique à V positions de nœuds virtuels divise l'anneau en V×N segments, moyennant le déséquilibre. Les systèmes en production (Amazon Dynamo, Cassandra) utilisent couramment 100 à 200 nœuds virtuels par serveur, où l'écart-type de la charge tombe sous 10 % de la moyenne.

Comment fonctionne une recherche de clé en temps constant ?

Les positions des nœuds virtuels sont stockées dans un tableau trié ou un arbre binaire de recherche équilibré. Pour trouver le propriétaire d'une clé, on hache la clé pour obtenir sa position sur l'anneau, puis on effectue une recherche binaire de la plus petite position de nœud virtuel supérieure ou égale à la position de la clé (en revenant à la position 0 si aucune n'est trouvée). Cette recherche s'exécute en O(log(V×N)) — effectivement constante pour V et N fixés.

Quels systèmes réels utilisent le hachage cohérent ?

Amazon Dynamo (2007) a popularisé le hachage cohérent avec nœuds virtuels pour sa base clé-valeur ; Cassandra a hérité de la même architecture. Les bibliothèques clientes memcached (par exemple l'algorithme ketama) l'utilisent pour partitionner les clés de cache sur un ensemble de serveurs. Les réseaux de diffusion de contenu et les tables de hachage distribuées pair-à-pair (DHT) telles que Chord et Kademlia reposent aussi sur le hachage en anneau.

Que deviennent les données lorsqu'un serveur tombe en panne et est supprimé ?

Si le serveur S tombe en panne, ses positions de nœuds virtuels deviennent vacantes. Les clés que S possédait appartiennent désormais au serveur suivant dans le sens horaire pour chaque arc. Si la réplication est configurée (typiquement 3 répliques dans Cassandra), les données existent déjà sur les N−1 serveurs suivants dans le sens horaire, si bien que le cluster continue à servir les lectures sans perte de données. Les quorums d'écriture assurent la cohérence pendant le basculement.

Quel est le rapport entre le hachage cohérent et la DHT Chord ?

Chord (Stoica et al., 2001) est un protocole de recherche pair-à-pair construit directement sur le hachage cohérent. Chaque pair se voit attribuer une position sur un anneau SHA-1 de 160 bits. Chord ajoute une « table de doigts » (finger table) de O(log N) raccourcis par nœud afin que toute clé puisse être localisée en O(log N) sauts — combinant le hachage cohérent avec une structure de routage distribuée efficace.

Le hachage cohérent peut-il gérer des serveurs de capacités différentes ?

Oui. En attribuant davantage de nœuds virtuels à un serveur de plus grande capacité — disons 200 nœuds virtuels pour une machine avec le double de RAM contre 100 pour un nœud standard — sa part de l'anneau augmente proportionnellement à sa capacité. Ce hachage cohérent pondéré est utilisé par l'allocation de jetons de Cassandra et par les répartiteurs de charge cloud pour acheminer plus de trafic vers les instances plus grandes.

Qu'est-ce que le hachage cohérent à « charge bornée » ?

En 2017, Google a publié « Consistent Hashing with Bounded Loads », qui ajoute une contrainte de capacité : aucun serveur ne peut détenir plus de (1 + ε) fois le nombre moyen de clés. Lorsqu'un serveur cible est surchargé, la clé est attribuée au serveur suivant dans le sens horaire à la place, répartissant la charge plus uniformément. Cette variante est utilisée dans les répartiteurs de charge en production de Google.

Comment le choix de la fonction de hachage affecte-t-il la distribution sur l'anneau ?

Une bonne fonction de hachage doit distribuer à la fois les clés et les étiquettes de nœuds virtuels uniformément sur l'anneau de 2^32 bits. Les fonctions de hachage médiocres produisent des regroupements, ce qui fait que certains arcs sont bien plus longs que la moyenne même avec de nombreux nœuds virtuels. En pratique, FNV-1a, MurmurHash3 et xxHash sont des choix populaires pour leur rapidité et leurs propriétés de distribution uniforme.

⚙ Sous le capot

Placez clés et serveurs sur un anneau de hachage afin que l'ajout ou la suppression d'un nœud ne remappe qu'une petite fraction des clés. Les nœuds virtuels lissent la charge — la technique derrière les caches distribués et les DHT.

hachage cohérentanneau de hachagenœuds virtuelséquilibrage de chargeCanvas 2D

3D · Moteur de rendu Three.js / WebGL · Cible 60 FPS · fonctionne entièrement côté client, sans installation

Qu'avez-vous trouvé ?

Ajouter les étapes de reproduction (facultatif)