一致性Hash

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 凡是涉及到分布式的系统,就会有负载均衡和数据分布的问题。为了让连接(或者数据)能够分布得更均匀,很多时候会使用到Hash算法。

Hash算法


凡是涉及到分布式的系统,就会有负载均衡和数据分布的问题。为了让连接(或者数据)能够分布得更均匀,很多时候会使用到Hash算法。

那什么是Hash算法呢?

把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值。哈希值的空间远小于输入的空间,所以可能会发生“哈希碰撞”,即两个不同的输入,产生了同一个输出。

Hash算法只是一个定义,并没有规定具体的实现

具体有什么应用场景?

Hash算法常用于消息摘要的场景,开发者们或多或少听说过的MD5、SHA都属于Hash算法的实现。

在Java语言里,每个Object对象都有一个hashCode方法,它默认是根据对象的内存地址计算的Hash值。当然我们可以覆盖这个方法,用自己的方法去计算得出一个Hash值。


Hash取模


先Hash再取模的场景,在负载均衡中十分常见。

hash(request) % n

假设我们现在有3个服务器,想要做负载均衡,就可以对请求的ip地址或者用户的id等使用Hash函数,然后将计算得出的Hash值对3取模,余数为几,就把请求分配到相应的服务器上。如图:

这里为了演示方便,直接模拟用的hash后的值。


弊端?

那上述方法有什么弊端呢?

在分布式场景下,横向伸缩缩是一个很正常的需求。试想一下,当上述的3台服务器需要扩展到4台服务器时,那绝大多数请求基本上都需要重新映射到另一个节点。因为Hash值没变,除数变了,余数必然会变。如图:

这种变动有时候是不能接受的。比如在Web负载均衡的场景下,session会保存在每个节点里。当然,如果你是“无状态”的服务,那不会存在这个问题。但如果是数据持久化场景,比如前面的文章里提到的MySQL分库分表,这样大的变动显然是不能接受的。因为如果增加或者删除了一个节点,就会导致几乎所有的数据都需要重新迁移。

无状态服务指的是,应用不保存任何状态。比如不用session,或者session保存在第三方缓存的节点里。


一致性Hash


使用一致性Hash可以解决因为横向伸缩导致的大规模数据变动。它是怎么解决的呢?

前面说到用节点的数量作为除数去求余。而一致性Hash的除数是2^32^。从0到2^32^ - 1,首尾相连构成了一个环。我们先对服务器节点的IP进行Hash,然后除以2^32^得到服务器节点在这个Hash环中的位置:

现在有请求进来了,同样进行Hash然后处于2^32^求余。如果落在Hash环上,然后顺时针找到第一个节点,这个节点就负责处理这个请求。如图所示:


一致性Hash分布不均匀的问题

细心的读者可能发现,一致性Hash算法在节点数量较少的时候,会出现分布不均匀的问题。如图所示:

这个时候,绝大多数请求都分配到了A节点,而B节点和C节点分配到的请求很少。解决这个问题的方案就是在Hash环上增加虚拟节点。实现方式也有很多种,比如:

hash(“SERVER_IP_A#1”) % 2^32^

hash(“SERVER_IP_A#2”) % 2^32^

hash(“SERVER_IP_A#3”) % 2^32^


一致性Hash的应用场景?

讲了这么多,一致性Hash到底有什么用?

除了前面提到的负载均衡、Web session和数据库分库分表可以应用外,其实一致性Hash应用得最多的领域是分布式缓存

分布式缓存系统一般是对Key进行Hash的。试想一下,如果直接对节点数量取模,一旦节点数量发生变化,比如新增一个节点或者删除一个节点,那将使得几乎所有结点的缓存失效。而如果使用一致性Hash,就只有Hash环上相邻的节点缓存受到影响。

从Hash环和顺时针查找原理不难发现,在增加一个节点后,一些原来被分配到下一个节点的请求,被分配到了新的节点。在减少一个节点后,一些原来本分配到这个节点的请求,被分配到了下一个节点。

所以无论是增加还是减少一个节点,都只有下一个相邻的节点会被影响而已。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
存储 负载均衡 算法
一致性哈希汇总
本文介绍了多种一致性哈希算法,包括Consistent Hashing Ring、Rendezvous、Jump、Multi-probe、Maglev、Anchor和Dx。这些算法各有特点,如Jump Hash实现了完美的key分布,而DxHash结合了多种算法的优点,支持动态扩缩容。文章还分析了各算法的性能指标,如内存使用、初始化时间、查询时间和调整集群大小的效率,以及均衡性和单调性。最后讨论了副本、权重和负载均衡策略的应用。
86 5
一致性哈希汇总
|
3月前
|
存储 缓存 运维
一致性哈希算法的缺点是什么?
【10月更文挑战第25天】虽然一致性哈希算法具有一些优点,如在节点变化时数据迁移量相对较小等,但也存在数据倾斜、虚拟节点复杂、节点数量少性能受限、数据迁移代价以及哈希函数选择等多方面的缺点。在实际应用中,需要根据具体的业务场景和系统需求,综合考虑这些因素,采取相应的优化措施来克服其缺点,充分发挥一致性哈希算法的优势。
|
缓存 算法
【分布式系统】一致性哈希算法
一致性哈希算法在1997年由[麻省理工学院](https://baike.baidu.com/item/%E9%BA%BB%E7%9C%81%E7%90%86%E5%B7%A5%E5%AD%A6%E9%99%A2/117999 "麻省理工学院")提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式[哈希表](https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E8%A1%A8/5981869 "哈希表")(
299 0
|
9月前
|
存储 缓存 负载均衡
一文理解一致性哈希算法
一文理解一致性哈希算法
165 0
|
9月前
|
算法
一致性哈希算法
一致性哈希算法
61 0
|
存储 缓存 算法
五分钟看懂一致性哈希算法
五分钟看懂一致性哈希算法
80 0
|
存储 人工智能 缓存
什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?
什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?
什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?
|
存储 算法
一致性hash算法
1.业务场景 假设有30000张图片需要存放到编号为1、2、3的3台服务器上。
82 0
|
存储 缓存 算法
一致性哈希算法的应用及实现
一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法, 由MIT的Karger及其合作者提出,现在这一思想已经扩展到其它领域。 1997年发表的学术论文中介绍了“一致性哈希”如何应用于用户易变的分布式Web服务中。
5792 0
|
存储 缓存 负载均衡
一致性哈希
图片分库存储时,每一张图片都可以定位到特上图中,假设我们查找的是”a.png”,由于有4台服务器(排除从库),因此公式为hash(a.png) % 4 = 2 ,可知定位到了第2号服务器,这样的话就不会遍历所有的服务器,大大提升了性能!定的服务器
693 0
一致性哈希