一致性哈希算法的思考

可能的实现:服务器ip经过hash后对2^32求余,服务器在hash环上的散列通过hash函数实现。缓存对象或者一个请求(请求的源地址)经过hash对2^32求余落在hash环上,顺时针寻找第一个可用服务器。

可能的java代码实现:用数组存ip地址,下标为ip hash求余后的数。

一致性哈希算法的用处“负载均衡”。这里的负载均衡可以是:

1.数据库横向切割。

2.缓存(如Redis),的负载均衡

3.服务器的负载均衡

思考1:为什么使用一致性哈希算法。(而不用普通的hash然后求余)

答:假设有5个Redis实例,某个对象hash以后为13,则求余以后分配到第3个Redis实例中,当为了增加Redis的容量而将Redis扩展到6个实例的时候,原来的对象hash13对6求余会落在第2个实例上,导致缓存失效解决缓存失效的办法就是对全局的数据进行重hash,但是这个代价太大。如果使用一致性hash,那么只需要对映射到新增节点到上一个节点之间的数据重新分配。对数据库的横向切割是用一个道理,对服务器来说没有影响(请求第二个服务器和第三个没有区别)

思考2:虚拟节点的作用

答:

1.如果集群中的节点数量太少,有可能所有的数据都在一个节点上。例如只有两个节点,均分的情况下,很有可能会所有的数据都存到一个节点上(有节点未使用)。通过增加虚拟节点,对环上的大块的段进行分割,一个大块的段上的数据可以映射到不同的Redis实例上。

2.假设使用三个节点,每个节点的计算机资源(内存,cpu等)使用情况都为K/2。那么当第1个节点失效以后,它的数据会重新分配在顺时针的下个节点(第二个节点上),第二个节点的计算机的资源使用量会达到上限K从而很有可能down掉,依次影响下一个节点导致整个集群宕机(缓存雪崩)。解决的办法是增加虚拟节点:具体就是在第1个节点和第2个间增加第3个节点的虚拟节点,这样当第1个节点宕掉以后,第1个节点到虚拟节点的数据会被映射到第3个节点,虚拟节点到第2个节点的数据会被映射到第2个节点。即第2和第3个节点分摊了第1个节点的压力。

 

原文地址:https://www.cnblogs.com/coderlynn/p/9313736.html