浅谈一致性哈希算法 consistent hashing

        接触过分布式的小伙伴一定对一致性哈希算法这个词语不陌生,那么到底什么是一致性哈希算法呢?

        了解一致性哈希算法之前我们先了解下哈希取模

        假设我们有三台服务器,缓存3万张图片。当然我们可以均匀的分配到每个服务器,即每个服务器1万张图片。但是如果这样操作,当我们访问缓存项时我们就要遍历三台服务器,这样也就失去了缓存的意义。那么我们该怎么解决这个问题呢?我们假设每张图片的名称不一致,将图片的名称当作这个图片的key,对缓存项的key进行哈希,将hash后的结果对缓存服务器的数量进行取模操作,通过取模后的结果,决定缓存项将会缓存在哪一台服务器上,由于我们只有3台服务器,所以我们对3取模余数分别是0,1,2,正好代表了我们的服务器的编号。如下图:

         浅谈一致性哈希算法 consistent hashing_第1张图片

         但是通过上述方法存在一定的缺陷,假如有一台服务器宕机或者我们加入一台新的服务器后,取模的余数将发生变化,原来为3现在变成了2或者4,此时,如果仍然使用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同,因为除数由3变为了4,被除数不变的情况下,余数肯定不同,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变,换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的。为了解决上述方法,一致性哈希算法诞生了。

        一致性哈希算法也是使用取模的方法,但是上述描述的取模法是对服务器的数量进行取模,而一致性哈希算法是对2^32取模。然后我们把2^32次方分别均匀分布在一个圆环上,12点位置为0,顺时针排布,0的右侧为1,0的左侧为2^32-1,

        浅谈一致性哈希算法 consistent hashing_第2张图片

         我们对服务器的IP进行取模,那么结果就是0到2^32-1之间,所以我们对A,B,D服务器进行取模后,三台服务器将位于圆环上的对应位置。例如:

        浅谈一致性哈希算法 consistent hashing_第3张图片

         然后对需要缓存的图片进行hash(图片名称)% 2^32,假设图片1,2,3,4

浅谈一致性哈希算法 consistent hashing_第4张图片

         然后沿顺时针方向遇到的第一个服务器,就是当前对象将要缓存于的服务器

浅谈一致性哈希算法 consistent hashing_第5张图片

        如果图片将被保存到B服务器,图片2将被保存到 D服务器,图片3和图片4将被缓存到A服务器。

        如上图假设我们的服务器B宕机,图片1将顺延到服务器D上,此时服务器B宕机对其他服务器并没有影响。

        但是我们假设如下情况:

        浅谈一致性哈希算法 consistent hashing_第6张图片

        服务器ABD在hash环上分布比较集中,就会出现大量缓存数据分布在A上而B和D分布较少的情况产生。

        为了解决上述问题一致性哈希算法将创建多个虚拟节点分布在hash环上。

        浅谈一致性哈希算法 consistent hashing_第7张图片

        这样数据就会相对均匀的分布到各个服务器上。 当然虚拟节点越多,分配也就越均匀。

你可能感兴趣的:(算法)