1.基本概念

一致性哈希算法在很多领域有应用,例如分布式缓存领域的 MemCache,Redis,负载均衡领域的 Nginx,各类 RPC 框架。在移除或者添加一个服务器时,一致性哈希算法能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表中存在的动态伸缩等问题。

2.特点

一致性哈希算法有以下的特点:

  • 1.均衡性。均衡性是指哈希的结果能够尽可能分布到所有的缓冲节点中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
  • 2.单调性。单调性是指当缓冲区大小变化时一致性哈希尽量保护已分配的内容不会被重新映射到新缓存区,来减少大量的重新hash提高性能。
  • 3.分散性。在分布式环境中,终端有可能看不到所有的缓存,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓存上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓存中去,降低了系统存储的效率。
  • 4.负载。好的哈希算法应能够尽量降低缓冲的负荷。

3.分布式缓存应用

我们从一个具体场景来看:redis 是如何使用一致性 hash 算法保证缓存命中率、容错性和可扩展性的。

  • 1.首先求出 redis 服务器(节点)的哈希值,并将其配置到 0 ~ 2的32次方 的圆(continuum)上。
  • 2.然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
  • 3.然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过 2的32次方 仍然找不到服务器,就会保存到第一台 redis 服务器上。

一致性哈希算法
从上图的状态中添加一台 redis 服务器。采用余数分布式算法,会由于保存键的缓存实例发生变化而影响缓存的命中率。但一致性hash算法中,只有在增加节点(node5)的逆时针的一小部分hash会受到影响,如下图所示:
一致性哈希算法
这种方式很好的解决了缓存命中率、容错性和可扩展性,但是当服务节点很少的时候,这时候会带来另外一个问题,就是“数据倾斜”,也就是很多 key 被分配到同一个服务实例上。为避免这样的问题,大多数一致性哈希算法的实现都引入了虚拟节点的概念。
例如我们的系统中有两台服务器,其环分布如下:
一致性哈希算法
此时必然造成大量数据集中到 Redis2 上,而只有极少量会定位到 Redis1 上。为了解决这种数据倾斜问题,一致性 hash 算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器 ip 或主机名的后面增加编号来实现。
一致性哈希算法
同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Redis2#1”、“Redis2#2” 两个虚拟节点的数据均定位到 Redis2 上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置得更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

4.一致性哈希负载均衡应用

负载均衡这个概念可以抽象为:从n 个候选服务器中选择一个进行通信的过程。负载均衡算法有多种多样的实现方式:随机、轮询、最小负载优先等,其中也包括了今天的主角:一致性哈希负载均衡。一致性哈希负载均衡需要保证的是“相同的请求尽可能落到同一个服务器上”。
“尽可能” —为什么不是一定?
因为服务器可能发生上下线,所以少数服务器的变化不应该影响大多数的请求。这也呼应了算法名称中的“一致性”。
同时,一个优秀的负载均衡算法还有一个隐性要求:流量尽可能均匀分布。
综上所述,我们可以概括出一致性哈希负载均衡算法的设计思路:

  • 1.尽可能保证每个服务器节点均匀的分摊流量
  • 2.尽可能保证服务器节点的上下线不影响流量的变更

实现原理:
一致性哈希算法
简单介绍下这个负载均衡中的一致性哈希环,首先将服务器(ip+端口号)进行哈希,映射成环上的一个节点,在请求到来时,根据指定的 hash key 同样映射到环上,并顺时针选取最近的一个服务器节点进行请求(在本图中,使用的是 userId 作为 hash key)。
当环上的服务器较少时,即使哈希算法选择得当,依旧会遇到大量请求落到同一个节点的问题,为避免这样的问题,大多数一致性哈希算法的实现度引入了虚拟节点的概念。
一致性哈希算法
在上图中,只有两台物理服务器节点:11.1.121.1 和 11.1.121.2,我们通过添加后缀的方式,克隆出了另外三份节点,使得环上的节点分布的均匀。一般来说,物理节点越多,所需的虚拟节点就越少。

相关文章:

  • 2021-12-29
猜你喜欢
  • 2021-05-20
  • 2021-06-21
相关资源
相似解决方案