Ces articles expliquent à merveille l’algorithme de Consistent Hashing. En substance, il s’appuie sue les deux principes suivants :
Source : http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/
Ainsi, IP2-1 est responsable des ressources ayant un hash compris entre celui de IP3-1 et IP2-1 (donc la ResourceA), etc…Dès lors, si vous ajouter ou supprimer une instance (par exemple IP2-2), seules les données qui étaient sur la zone comprise entre « 0 IP1-1 » et « IP2-2 » seront perturbées…leur hash n’a pas changé mais elles ne seront plus servi par IP2-2 mais par IP3-1, la machine suivante sur le cercle.
Pour ceux qui aiment les mathématiques et les formules complexes, je vous laisse découvrir ce PDF
Côté Java (et oui j’avais envie de coder un peu…), il existe l’API cliente spymemcached qui permet de s’interfacer avec des instances memcached et fournit en prime une implémentation du Consistent Hashing. Le code suivant insert différentes données dans 10 instances memcached (sur les ports 11211 à 11221)
List< inetsocketaddress > memCachedServers = new ArrayList>< inetsocketaddress >();
for (int port = 11211; port < 11221; port++) {
memCachedServers.add(new InetSocketAddress("localhost", port));
}
try {
ConnectionFactory connectionFactory = new DefaultConnectionFactory(
DefaultConnectionFactory.DEFAULT_OP_QUEUE_LEN,
DefaultConnectionFactory.DEFAULT_READ_BUFFER_SIZE,
HashAlgorithm.KETAMA_HASH) {
public NodeLocator createLocator(List< MemcachedNode > list) {
KetamaNodeLocator locator = new KetamaNodeLocator(list,
HashAlgorithm.KETAMA_HASH);
return locator;
}
};
MemcachedClient client = new MemcachedClient(connectionFactory,memCachedServers);
client.set(key, 3600, value);
Object obj = client.get(key);
En répétant la même expérience que précédemment, on note que la répartition initiale des objets sur les différentes instances est légèrement différente et de prime abord moins uniforme
Instance curr_items 127.0.0.1:11215 104667 127.0.0.1:11218 85582 127.0.0.1:11213 91505 127.0.0.1:11220 101675 127.0.0.1:11216 99267 127.0.0.1:11214 109958 127.0.0.1:11217 97039 127.0.0.1:11212 103810 127.0.0.1:11211 100676 127.0.0.1:11219 105821
En revanche, suite au démarrage de la 11° instance et à la lecture du million d’objets insérés, seule 88138 instances manquent. Autrement dit, cet algorithme permet de limiter la perturbation du cache à moins de 10% !
Le consistent hashing permet donc de répartir des données en assurant un maximum de résilience. On retrouve son utilisation dans des solutions de cache type memcached, des caches de ressources Web ou également des stockages distribués type Dynamo. Autrement dit, à chaque fois que l’on commande un article sur Amazon…