分布式环境下的哈希函数标准与一致性哈希算法
Posted Alpha智能工业大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式环境下的哈希函数标准与一致性哈希算法相关的知识,希望对你有一定的参考价值。
当数据处理量很大,我们往往采取增加机器数量横向扩展的策略。而这些数据要怎样分配到各个节点?这里介绍一下 hash 算法的使用。
假如要在 n 台 cache 服务器上做数据散列,普通的哈希算法是采用简单取模的方式。在n不变时能够得到不错的效果,但一旦环境变动,增加或减少 cache 服务器时就会出现问题,而实际情况下在分布式系统中,节点的宕机、某个节点加入或者移出集群是常事。在这样的环境下我们判定一种哈希算法通常有4个标准:
1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
可以看出,普通哈希算法不满足单调性的标准,一旦节点数量改变,那么原有数据的映射位置都需要重新计算。
一致性哈希算法(Consistent Hashing)是1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,可以很好的解决分布式环境下的数据散列问题。一致性哈希算法的基本实现原理是将机器节点和key值都按照一样的哈希算法映射到一个0~2^32的圆环上。当有一个写入cache服务器的请求到来时,计算 Key 值k对应的哈希值Hash(k),如果该值正好对应之前某个机器节点的 Hash 值,则直接写入该机器节点,如果没有对应的机器节点,则顺时针查找下一个节点,进行写入,如果超过2^32还没找到对应节点,则从0开始查找(因为是环状结构)。如下所示
图中 Key K 的哈希值在 A 与 B 之间,于是 K 就由节点 B 来处理。
经过一致性哈希算法散列之后,当有新的机器加入时,将只影响一台机器的存储情况,例如新加入的节点 H 的散列在 B 与 C 之间,则原先由 C 处理的一些数据可能将移至H处理,而其他所有节点的处理情况都将保持不变,因此表现出很好的单调性。而如果删除一台机器,例如删除 C 节点,此时原来由 C 处理的数据将移至 D 节点,而其它节点的处理情况仍然不变。而由于在机器节点散列和缓冲内容散列时都采用了同一种散列算法,因此也很好得改善了分散性和负载。
但是一致性哈希没有考虑到每台 cache 服务器的性能差异,不能很好实现负载均衡,在环上节点的分布也有可能会出现某几个节点在一个位置很密集而另外某些节点却很稀疏。那么要如何满足平衡性呢?
使用虚拟节点的思想,为每个物理节点(cache服务器)在圆上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。用户数据映射在虚拟节点上,就表示用户数据真正存储位置是在该虚拟节点代表的实际物理服务器上。
下面有一个图描述了需要为每台 cache 服务器赠的虚拟节点数量。
x轴表示的是需要为每台物理服务器扩展的虚拟节点倍数(scale),y轴是实际物理服务器数,可以看出,当物理服务器的数量很小时,需要更多的虚拟节点,反之则需要更少的节点。在物理服务器有10台时,使用一致性哈希算法,需要为每台服务器增加100~200个虚拟节点才能达到真正的负载均衡。
更多关于智能制造、工业互联网及工业大数据及工业大数据前沿咨询和原创观点请关注:
好数道官方微信
以上是关于分布式环境下的哈希函数标准与一致性哈希算法的主要内容,如果未能解决你的问题,请参考以下文章