一致性Hash算法原理,没想到竟如此简单,几张图简单明了

一致性hash的特性

单调性(Monotonicity): 单调性是指如果已经有一些请求通过哈希分派到了相应的服务器进行处理,又有新的服务器加入到系统中时候,应保证原有的请求可以被映射到原有的或者新的服务器中去,而不会被映射到原来的其它服务器上去。 这个通过上面新增服务器ip5可以证明,新增ip5后,原来被ip1处理的user6现在还是被ip1处理,原来被ip1处理的user5现在被新增的ip5处理。

分散性(Spread): 分布式环境中,客户端请求时候可能不知道所有服务器的存在,可能只知道其中一部分服务器,在客户端看来他看到的部分服务器会形成一个完整的hash环。如果多个客户端都把部分服务器作为一个完整hash环,那么可能会导致,同一个用户的请求被路由到不同的服务器进行处理。这种情况显然是应该避免的,因为它不能保证同一个用户的请求落到同一个服务器。所谓分散性是指上述情况发生的严重程度。好的哈希算法应尽量避免尽量降低分散性。 一致性hash具有很低的分散性

平衡性(Balance): 平衡性也就是说负载均衡,是指客户端hash后的请求应该能够分散到不同的服务器上去。一致性hash可以做到每个服务器都进行处理请求,但是不能保证每个服务器处理的请求的数量大致相同,如下图

一致性Hash算法原理,没想到竟如此简单,几张图简单明了

为什么是一致性Hash,一致性Hash的作用是什么

一致性Hash算法的作用是解决分布式系统中让一部分固定的请求落到同一台服务器上,这样每台机器处理一部分的请求,达到负载均衡的作用

其实除去一致性Hash 使用一个请求中的固定字段与上分布式中的机器数,也能确定使用哪台服务器,但是伸缩性太差。新增或者下线服务器的时候,映射关系会大量失效

一致性Hash算法原理

一致性Hash 是将整个哈希值空间组织成一个虚拟的圆环,比如我们先设定好Hash值空间是0到max_int的值,
一致性Hash算法原理,没想到竟如此简单,几张图简单明了

然后将拥有的服务器通过Ip或者服务器名称进行Hash 操作,确定了在hash 环上的位置
一致性Hash算法原理,没想到竟如此简单,几张图简单明了
这样就确定了服务器在整个Hash 值范围空间的一个位置,将整个环划分成了四部分

这时候数据请求过来之后,我们同样进行 Hash 操作,使得请求数据落在了 ObjectA,B,C,D的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器
一致性Hash算法原理,没想到竟如此简单,几张图简单明了
由此看见 ObjectB 应该是分发到 Node B机器上,其他同理

那这样就能保证伸缩性了嘛?

确实是的,比如机器Node C下线了,只有Object C数据会受到影响,会被分配到 NodeD机器上,增加机器也是同理

一致性Hash算法原理,没想到竟如此简单,几张图简单明了

综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

另外,一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。例如系统中只有两台服务器,其环分布如下,
一致性Hash算法原理,没想到竟如此简单,几张图简单明了

此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:这就是我们上面所说的平衡性

一致性Hash 的原理大致也就是如此


参考博客:
https://www.cnblogs.com/lpfuture/p/5796398.html
https://www.jianshu.com/p/e968c081f563