哈希表—【一致性哈希】
目录
一致性哈希
1、概念性质
一致性哈希也是哈希的一种,现在在解决动态变化的Cache(服务器)环境中普通哈希运用存在的问题,但现在一致性hash算法在分布式系统中也得到了广泛应用,一致性哈希算法应该满足的如下个适应条件。
1.平衡性(Balance)
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
2.单调性(Monotonicity)
调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。(这段翻译信息有负面价值的,当缓冲区大小变化时一致性哈希(Consistent hashing)尽量保护已分配的内容不会被重新映射到新缓冲区。)
简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希
3.分散性(Spread)
在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
4..负载(Load)
负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
5.平滑性(Smoothness)
平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致的。
2、理解
结合例子来理解:
我们假想一个环境,我们要在服务器上存储,我们用台服务器存储3万张图片,为了减少服务器的缓存压力,我们用3台服务器分别存储1万张图片。(每张图片名称都不同)
利用hash(图片名称)%服务器台数映射的的形式可以将图片分别存储在3个服务器上,假入要查找其中一张图片时可以输入图片名称利用用映射的公式(hash(图片名称)%服务器台数)来在3个服务器上查找这张图片,但是会遇到这几个问题:
1.假如数据太多导致服务器内放不下时,需要增加几台服务器时,由于映射公式的改变,导致所有图片都需要重新映射存储。
2.此时要原有将众多的图片按照新的映射形式存储在服务器上开销十分巨大,对于后台服务器来说就会带来巨大的影响。
如何解决这样的问题呢,就要用到一致性哈希了
映射方式
我们将哈希值用一个虚拟的圆环来表示(0—2^23-1)个值,最大值与最小值在一个点相交。如图:
由我们之前的设想除法,我们将这个圆环(哈希值)分别用3台服务器(利用服务器的ip或其它),分为3部分。
利用hash(图片名称)%2^23的映射,按顺序存储的方式来存放图片。如下图
经过映射关系处理后,在服务器3——服务器1之间的的存储在服务器1上,在服务器1——服务器2上之间的存储在服务区2上,一次类推。
那如何解决普通哈希在解决上述情况时遇到的问题呢?
当需要增加一个服务器存储图片时,假设那个服务器在哈希环上的位置是在服务器3和服务器1直接之间时,只有在服务器3和新服务器(服务器4)之间按映射公式存放的图片会存储到新服务器(服务器4)上去。如下图:
即指增加一台服务器,只需将服务器3和新服务器(服务器4)直接的图片转存到服务器4上去,极大减少了服务器的缓存压力。对服务器的影响较小。
虚拟节点
但是假如服务器服务器在哈希环上映射的位置不是均匀的分布在环上时,就会造成哈希环偏斜。即映射在哈希环上的图片在每个服务器存储的数量不均匀,导致服务器缓存均衡的问题。如下图:
如何解决这种缓存分配不均匀的问题呢?
既然真实的服务器只有3台,那么我们可以利用虚拟复制服务器的物理节点。称为”虚拟节点“来解决这个问题。
实际上一个服务器的物理节点可以对应多个虚拟节点,利用虚拟节点分别虚拟出3个虚拟节点(A,B,C),在虚拟节点内缓存的图片就会被缓存在真实的服务器当中。A->服务器1,B->服务器2,C->服务器3。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。如下图:
3、查阅内容
此篇博客是在搜索查阅一致性哈希相关知识、博客后,自己总结而成。
其中借鉴了如在内容在此声明:
https://www.cnblogs.com/lpfuture/p/5796398.html 一致性哈希算法理解
https://baike.baidu.com/item/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C/2460889?fr=aladdin
http://www.zsythink.net/archives/1182 白话解析:一致性哈希算法