Rendezvous hashing算法介绍

简介: 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。

参考

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
存储 人工智能 城市大脑
阿里云OpenTrek,七年封装再开放
七年砥砺琢磨的产业智能技术,一朝全部输出。2022阿里云合作伙伴大会上,产业智能OpenTrek平台的“行业数据平台能力”和“行业智能引擎能力”面向合作伙伴全面开放,至此,阿里云补上了产业数字化的又一块关键拼图——OpenTrek。
阿里云OpenTrek,七年封装再开放
|
存储 负载均衡 算法
一致性哈希汇总
本文介绍了多种一致性哈希算法,包括Consistent Hashing Ring、Rendezvous、Jump、Multi-probe、Maglev、Anchor和Dx。这些算法各有特点,如Jump Hash实现了完美的key分布,而DxHash结合了多种算法的优点,支持动态扩缩容。文章还分析了各算法的性能指标,如内存使用、初始化时间、查询时间和调整集群大小的效率,以及均衡性和单调性。最后讨论了副本、权重和负载均衡策略的应用。
595 62
一致性哈希汇总
|
4月前
|
文字识别 算法 语音技术
基于模型蒸馏的大模型文案生成最佳实践
本文介绍了基于模型蒸馏技术优化大语言模型在文案生成中的应用。针对大模型资源消耗高、部署困难的问题,采用EasyDistill算法框架与PAI产品,通过SFT和DPO算法将知识从大型教师模型迁移至轻量级学生模型,在保证生成质量的同时显著降低计算成本。内容涵盖教师模型部署、训练数据构建及学生模型蒸馏优化全过程,助力企业在资源受限场景下实现高效文案生成,提升用户体验与业务增长。
621 23
|
12月前
|
存储 消息中间件 SQL
流存储Fluss:迈向湖流一体架构
本文整理自阿里云高级开发工程师罗宇侠在Flink Forward Asia 2024上海站的分享,介绍了湖流割裂的现状与挑战,Fluss湖流一体架构的设计与优势,以及未来规划。内容涵盖湖流割裂的现状、Fluss架构详解、湖流一体带来的收益,以及未来的生态扩展和技术优化。
1051 11
流存储Fluss:迈向湖流一体架构
|
Cloud Native 持续交付 云计算
云计算的未来:云原生技术引领数字化转型新篇章####
本文旨在探讨云原生技术如何重塑云计算领域,推动企业实现前所未有的敏捷性、可扩展性和效率。我们将深入分析云原生的核心概念、关键技术组件(如容器化、微服务、持续集成/持续部署CI/CD),并通过实际案例展示其在不同行业中的应用成效。此外,还将探讨云原生面临的挑战及未来发展趋势,为读者提供全面而深入的理解。 ####
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
839 1
|
消息中间件 存储 Java
Kafka 如何避免重复消费?
在Apache Kafka中,避免消息的重复消费是确保数据准确处理的关键。本文详细介绍了七种避免重复消费的方法:使用消费者组、幂等生产者、事务性生产者与消费者、手动提交偏移量、外部存储管理偏移量、去重逻辑及幂等消息处理逻辑。每种方法均有其优缺点,可根据实际需求选择合适方案。结合消费者组、手动提交偏移量和幂等处理逻辑通常是有效策略,而对于高一致性要求,则可考虑使用事务性消息。
2255 0
|
存储 JSON Prometheus
SpringBoot动态修改日志级别
SpringBoot动态修改日志级别
1052 0
SpringBoot动态修改日志级别
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
26611 66
图解一致性哈希算法,看这一篇就够了!
|
监控 NoSQL 测试技术
MongoDB性能最佳实践:如何制定更有效的基准测试?
感谢你与我们一起走过这段MongoDB性能最佳实践之旅,希望你能从中获取一些有用的信息。
MongoDB性能最佳实践:如何制定更有效的基准测试?

热门文章

最新文章