Rendezvous hashing算法介绍

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Rendezvous hashing算法介绍

Rendezvous hashing

Rendezvous hashing用于解决分布式系统中的分布式哈希问题,该问题包括三部分:

  1. Keys:数据或负载的唯一标识
  2. Values:消耗资源的数据或负载
  3. Servers:管理数据或负载的实体

例如,在一个分布式系统中,key可能是一个文件名,value是文件数据,servers是连接网络的数据服务器,用于保存所有文件。假设给定一组动态服务器,下面需要将keys映射到服务器,并提供如下功能:

  1. Load Balancing: 每个服务器负责(近乎)同等数量的负载
  2. Scalability: 添加或删除服务器时不会造成大量计算
  3. Lookup Speed: 给定一个key,可以快速确定所需的服务器

动态服务器是指在系统运行的任意时间都可能会添加或删除服务器。

Rendezvous Hashing算法

Rendezvous Hashing算法的历史可以参见原文


rendezvous hashing算法的目的是获得更好的负载均衡性能。我们希望每个服务器都能负责同等数量的key-value。一种合理的方式是和普通的哈希表一样,让每个key都随机均匀地选择一个服务器。这样做的原因是,如果只是对服务器ID进行哈希,那么当修改服务器的数量时,所有的哈希值都会发生变化。当对目标服务器的选择和服务器的数量没有直接关系时,就可以避免服务器的增删带来的影响。

Rendezvous hashing提供了一种聪明的解决方式。相比于选择一个特定的服务器,它会为每个key生成一个随机有序的服务器列表,并选择列表中的第一个作为目标服务器。为了保证查找成功,我们需要保证每个key-value对都由key选择的第一台服务器保管。


如果选择的第一台服务器下线时,只需要将key转移到列表中的第二台服务器即可(作为新的第一台服务器)。可以看出,这种情况下只需要转移下线的服务器上的keys即可,无需变动其他服务器的keys。如下面例子,当删除S2服务器时,S2中的数据会转移到新的第一台服务器:即S1和S3,其他服务器的数据无需变动(S2不是它们的第一台服务器)。

哈希技巧

从上面例子可以看出,使用rendezvous hashing时,需要确保每个key都能有其特定的服务器优先列表,这样才能保证数据分布均匀。那如何为每个key生成随机排列的服务器列表呢?


可以使用常见的哈希技术来解决该问题。首先,对每个服务器进行哈希来生成一组整数哈希值,然后基于该哈希值对服务器进行排序,这样就得到了一个随机排列的服务器列表。为了保证每个key都能得到唯一的排列,需要在哈希函数中引入key。方式是将key和各个服务器(或服务器ID)作为哈希种子来生成哈希值。

最终的rendezvous hashing算法为:

  1. 使用随机哈希函数来计算所有key-server的哈希值
  2. 将key分配给具有最大哈希值的服务器
  3. 当添加和移除服务器时维护"第一台服务器"

Rendezvous Hashing的优势

级联故障转移:当一台服务器故障后,很多负载均衡算法会将所有负载转移到某一台服务器上,如果该故障转移的服务器无法处理新的负载,就会导致级联故障。在Rendezvous Hashing中,由于每个key都有不同的第二选择服务器,因此Rendezvous hashing可以避免该问题。使用好的哈希函数可以将负载从故障服务器均匀分布到剩余的服务器上。


基于权重的服务器:在一些场景下,我们期望基于负载均衡而非均匀随机key来分配负载。例如,需要给具有较大容量的服务器分配更多的负载。相比基于哈希值的排序,我们可以选择基于如下公式进行排序,其中x为key, wi为服务器i的权重, hi(x)为哈希值(通常为[0,1])。更多细节,参见这里

image.png

更少的内存:由于可以本地计算所有的哈希函数值,因此只需要一组服务器ID列表来对应管理key-value的服务器。在实际使用中,一致性哈希之类的算法要求更多的内存(但计算量也更少)。

Rendezvous Hashing的劣势

添加服务器:在添加服务器时,由于新的服务器可能会成为系统中已存在的key的第一选择,因此很难维护"第一选择"不变性。为了维护该不变性,我们需要校验系统中服务器管理的所有keys,这会给分布式存储和pub/sub系统带来严重的问题,但着对缓存系统来说并不是一个问题。在缓存系统中,缓存服务器会共享一个中央数据存储库。当用户请求缓存系统时,如果缓存不存在,则从中央库中获取数据并缓存起来,等待下次使用。


当给缓存添加服务器时,系统会最终达成"第一选择"不变性。如果添加的服务器成为一个已存在的key的第一选择,则只会在第一次请求时会导致缓存miss。在新服务器负责该key之后,老的服务器将不会再接收到该key的请求,老数据最终会通过LRU之类的方式清理掉。


请求时间:如果有N台服务器,由于需要校验所有的key-server组合,因此查找算法为O(N)。而一致性哈希为O(logN),当N足够大时,其查询速度也更快。

总结

Rendezvous hashing适于在中小型分布式缓存中做分布式负载均衡。如果一个系统无法满足"第一选择"不变性,则需要谨慎选择rendezvous hashing。

参考

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
8月前
|
算法 搜索推荐 大数据
算法(Algorithm)
算法(Algorithm)
108 0
|
算法 C++
【Hello Algorithm】链表相关算法题
【Hello Algorithm】链表相关算法题
55 0
|
算法 C++
【Hello Algorithm】基础数据结构
【Hello Algorithm】基础数据结构
55 0
|
存储 算法 安全
Hash 算法详细介绍与实现 (二)
书接上回,昨天写了第一部分,《Hash 算法详细介绍与实现 (一)》详细介绍了Hash表和Hash算法的相关概念以及算法的基本原理。同时简单介绍几种hash算法的实现:直接取余法和乘法取整法;本文接着详细唠唠Hash算法和Hash表这个数据结构的具体实现以及Hash算法和Hash表常见问题的解决方案,比如解决Hash表的冲突问题等等.相关的理论知识已在上篇文章详细介绍,这里就不再赘述,多的不说少的不唠,直接进入今天的主题:利用Hash算法实现Hash表
512 1
|
算法
【Hello Algorithm】贪心算法
【Hello Algorithm】贪心算法
82 0
|
存储 算法 安全
什么是 Hash 算法?
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
什么是 Hash 算法?
|
存储 算法
Hash 算法有哪些?
Hash 算法有哪些?
210 0
Hash 算法有哪些?
【1078】Hashing (25 分)
【1078】Hashing (25 分) 【1078】Hashing (25 分)
96 0
|
存储 搜索推荐 算法
algorithm中的排序算法详解
algorithm中的排序算法详解
189 0