一致性hash算法的介绍
在分布式系统中,对服务的请求进行负载均衡,让请求能够均匀的分发到每一台服务器上,是最常见的应用场景。
而一致性hash算法就是一种分布式算法,常用于负载均衡。它将整个哈希值空间组织成一个虚拟的哈希环,hash值的空间范围为:0到(2^32) - 1,它俩位置重合,如图1所示:
分析哈希环上的节点和数据分布情况
我们分析下服务器节点和访问服务器的数据分别是如何在哈希环上分布的。
- 服务器节点
该哈希环上散列分布着各个服务器节点的hash值,这个hash值以顺时针的顺序,从0开始,0、1、2、3直到(2^32) - 1,最后散列分布在哈希环上。hash值是由服务器节点的ip或者服务器名这种唯一的关键标识作为key进行hash(key)计算,从而得到hash值。如图2所示:
- 访问服务器的数据
然后使用同样的hash(key)函数,将访问服务器的数据作为key计算出hash值,散列分布在哈希环上。以顺时针的方向,数据的hash值找到距离最近的服务器节点的hash位置,那么此服务器节点就是被数据访问的位置。如图3所示:
一致性hash算法的容错性和扩展性
- 容错性指的是,比如某台服务器宕机了,对外不提供能力的时候,也能够不影响整体的服务运行。如图4所示:
服务器ip1宕机了,那么根据顺时针方向,数据A就会定位到服务器ip2上,很好的保证了容错性。
- 扩展性指的是,新增一台或多台服务器节点ip4,那么数据C就会定位到距离它更近这台新增加的服务器ip4上面,体现了其扩展性能高的特点。如图5所示:
虚拟节点
概念:虚拟节点是在服务器数量较少的情况下,通过虚拟节点变相的增加服务器节点,使得请求访问更加均衡。
当服务器节点数量非常少的情况下,数据的访问容易出现数据倾斜,导致请求访问不均匀。如图6所示:
只有两台服务器ip1和ip2,如果数据的hash值大量分布在0到hash(ip1)之间,这些数据都会去访问服务器ip1,服务器ip1的承受的压力可想而知。
导致这种请求访问不均匀的根本原因就是服务器数量太少,解决这种服务器数量少的方式就是将现有的物理节点通过虚拟的方式复制出来,从而让hash环上的服务器节点更加均匀的分布,同时更加均匀的被数据请求访问。
总结
融会贯通才是王道。在面试中能够以这样的知识面来答复面试官的提问,拿到入职offer不成问题。加油吧!
作者:杨工,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。