CARP

一致性哈希算法

一致性哈希算法是麻省理工学院在1997年提出的一种分布式哈希实现算法,主要为解决因特网中的热点问题。判定哈希算法在动态变化的cache环境中好坏的标准——平衡性、单调性、分散性和负载
设有2^32个桶空间(整数),将其首尾相连。一致性哈希算法大致流程如下:
(1) 将机器根据hash函数映射到环上,根据服务器的ip地址或者主机名;
(2) 将数据桶根据hash函数映射到环上;
(3) 据数据映射到桶的位置顺时针找到第一台机器将该桶放到该机器上;
(4) 当某台机器坏掉时,类似(3)将存储在该机器上的数据顺时针找到下一台机器;
(5) 当增加机器时,将该机器与前一台机器(逆时针)之间的桶存储在新增机器上并从原来机器上移除。

评判的标准:

1、平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
2、单调性(Monotonicity): 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
3、分散性(Spread): 在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
4、负载(Load): 负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

服务器的增减:

服务器的增加:根据服务器的hash值将服务器加入到环中,这时影响的也就是只有一部分原本hash值在本服务器之前的数据,将承担下一个服务的一部分压力。
服务器的删除:将原本的本服务器的数据处理工作将会交给环上的下一个服务器。
存在的问题:新加入的服务器仅仅能够分担环上的压力,其他服务器的压力不能够缓解。解决的方法:将引入虚拟节点的方法解决,将一台服务器虚拟成一组服务器,将虚拟服务器放入到环上。