一致性哈希算法解析

news2024/11/24 14:42:44

1. 哈希算法

想象我们的网络世界是一个巨大的环形摩天轮,上面有无数的座位,每个座位都代表了一个存储空间。现在,我们需要将三万张照片安排到这个摩天轮的三台机器上。这些机器我们可以想象成三个大车厢,每个车厢可以装载一部分照片。

在简单的哈希算法中,我们通过计算每张照片的哈希值来决定它应该放在哪个车厢。但如果我们决定在摩天轮上增加一个新的车厢,这时问题就来了。原本均匀分布的照片因为新车厢的加入,许多照片需要被重新分配到不同的车厢中,这就像是你已经坐好了,突然被告知要换一个座位,造成了大混乱。

(如果有三万张图片需要缓存到三台机器上,保证均匀分布,那么可以使用哈希算法来进行。通过对 key 值变为 hash 值后,取机器数余数,如图中所示,机器数量为 3,则可以保证在 key 一致的情况下,再次寻找该图片时可以找到对应的服务器上。

但是这种情况下有一种缺点,就是如果我们新增一台服务器,服务器数量由3 变为 4后,那么在相同 key 的情况下,取得的余数不同,例如 

5 余 3 = 2 (存放到服务器 2)

5 余 4 = 1(存放到服务器 1)

 导致无法找到对应的图片,缓存失效,客户端会向后端请求,导致后端雪崩。

这里需要注意的是,所有的图片的地址都发生了错误。)

2. 一致性哈希算法

那么为了解决这个问题,就要使用一致性哈希算法。

一致性哈希算法将哈希值组织在一个环形结构中,所有的服务器和数据项都映射到这个环上。哈希函数的选择需要保证均匀性,避免哈希碰撞。对于每一个数据项,通过其键值计算哈希值,然后沿环顺时针查找,将数据项分配到遇到的第一个服务器上。这保证了数据分布的均匀性和平衡性。为了进一步优化负载均衡,每个实际服务器可以在哈希环上分配多个虚拟节点。这样做可以在物理服务器较少时,通过增加虚拟节点的数量来模拟大规模分布式环境,从而优化数据的均匀分布。

有一个环为 2 的 32 次方,把服务器 ABC的哈希值取 2 的 32 次方的余数,那么结果必然会分布在这个圆环上,同时对想要存放的图片 a 的哈希值取余数,那么 a 也会在这个圆环上,这是如果要想知道 a 应该被存放在哪一台服务器,顺时针寻找服务器,那么找到的第一个服务器就是 a 应该被存放的服务器。

本图中,a 应该被存在 B服务器中。

那么,如果新增一台服务器 D,那么本来应该存放在 A 中都图片 c 就会被存放在 D 中,所以我们需要知道的是, 一致性哈希算法并不能解决所有的问题,仍会导致部分失效。但这样仍然比哈希算法好太多了。

我们可以推断出来,想让一致性哈希算法失效的情况减少,本质上减少每个服务器之间的间隔就好,就是服务器越多,失效的可能性越小。

想象一个极端情况,如果服务器 ABC 离的很近,同样也会导致大量的缓存失效。

但是如果我们只有三台服务器应该怎么办呢。答案是设置虚拟节点,一台服务器 A 可以对应虚拟节点 A1,A2,A3......这样,当图片遇到 A1时,就被存储到 A 中,每个服务器的间隔变小,实现了准确率较高的一致性哈希算法。

2. 参考

好刚: 7分钟视频详解一致性hash 算法

【好刚: 7分钟视频详解一致性hash 算法】 https://www.bilibili.com/video/BV1Hs411j73w/?share_source=copy_web&vd_source=94e7fb54e1e56a78eb4917d7e5240a87

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GIS专业的就业前景

地理信息系统(GIS)作为一门跨学科的领域,随着技术的发展和应用领域的拓宽,其就业前景日益广阔。GIS专业毕业生可以在多个行业中找到合适的职位,并且随着经验的积累,薪资和职业发展空间都相当可观。 1. 就业…

怎么把图片压缩小一点?几个小技巧帮助你轻松压缩图片大小

怎么把图片压缩小一点?几个小技巧帮助你轻松压缩图片大小 压缩图片大小是许多用户在处理照片时的常见需求,特别是在需要上传图片到网页、发送电子邮件或储存时,减小文件大小可以大大提高效率。以下是五款可以帮助你轻松压缩图片大小的软件&a…

能不能给我讲讲redis中的列表

写在文章开头 本文将从redis源码的角度直接分析列表操作指令,因为大部分指令操作细节区别不是很大,同时为了更专注于列表逻辑的分析,所以本文笔者将以双向链表这个数据结构为核心对lrange、lindex、llen、rpush、lpop几个操作展开介绍,希望对你有帮助。 Hi,我是 sharkChi…

泛微OA设置多个人力资源审批人员

泛微OA设置节点审批人员在不同条件下必须都审批才能过流程 在泛微OA中设置审批人员可以有多个设置方式,大部分情况可以根据会签和非会签控制是否需要所有人都审批,例如: 这里选择的会签就是需要这四个人都必须审批流程,这个流程…

台灯哪种灯光对眼睛好?保护眼睛要选央视公认最好的护眼灯

根据最新的文献当中的近视人群的数据我们发现,亚洲人的近视患病率更高,为70-90%,而美国人和欧洲人的近视患病率为30-40%,也就是说,近视的发病率与种族有关。其次跟近视相关的环境因素有很多,主要有近距离工…

微服务架构Gin-etcd-gRPC接合的入门实践

最近在学习微服务,先后学习gRPC、etcd。学习过这两个技术之后,结合Gin框架,简单实现了一个微服务的小demo了。 以下是各技术在微服务架构中的功能。 Gin框架作为网关,外部请求的统一出口。负责将外部的HTTP请求转化为RPC请求&…

伦敦金实时行情决策辅助!

在伦敦金实时交易的过程中,投资者主要依赖技术分析来辅助自己的投资决策。与基本面分析不同,技术分析侧重于研究金价的走势和市场行为,通过图表和技术指标来预测未来的市场走势。常用的技术分析方法包括: 趋势线和支撑阻力位&…

使用AutoDL安装Mamba官方代码

使用AutoDL安装Mamba 租界的云服务器使用环境ubuntu22.04, cuda 11.8, cudnn8.9 python 3.10 torch2.10 远程连接验证安装条件 使用Pycharm连接远程的云GPU服务器 使用nvidia-smi 和 nvcc -V python conda info-e来验证云主机是否具有安装的条件。 conda创建虚拟环境并安装pyt…

MATLAB - 浮动基座机器人的逆运动学

系列文章目录 前言 本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体&#xff0…

鸿蒙开发之ArkUI 界面篇 二十二 层叠布局 Stack

Stack语法格式如下,其实鸿蒙的容器组件的语法都是一样的,只是实现效果和和容器组件的名字不一样而已。 与绝对定位相比,实现更简单些,绝地定位更灵活,如果需要调整子组件的对其方式,需要这样添 加&#xf…

如何使用 WSL 在 Windows 上安装 Linux

如何使用 WSL 在 Windows 上安装 Linux 文章目录 如何使用 WSL 在 Windows 上安装 Linux前言安装WSL命令修改DNS网络右键打开网络和internet设置更改适配器选项属性 前言 在Windows计算机上同时访问Windows和Linux系统的功能,有利于大家学习Linux系统。 版本要求Wi…

Rethinking the Localization in Weakly Supervised ObjectLocalization

论文名称:Rethinking the Localization in Weakly Supervised Object Localization 论文地址:Rethinking the Localization in Weakly Supervised Object Localization (arxiv.org) 1.背景 最近,将WSOL分成两部分(与类无关的对象定位和对象…

Ansible 工具从入门到使用

1. Ansible概述 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

恶意软件基础知识——恶意软件命名

计算机病毒(Computer Virus)指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码。 ——《中华人民共和国计算机信息系统安全保护条例》 恶意软件的定义 恶意软件是一个用来描述恶意应用程序…

SQL进阶技巧:如何优化NULL值引发的数据倾斜问题?

目录 0 场景描述 1 问题分析 1.1 问题剖析 1.2 解决方案 2 小结 0 场景描述 实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数…

动态代理有用吗?一文了解靠谱的动态代理有哪些标准

在当今互联网时代中,从网络安全、隐私保护、市场调研和互联网营销到软件测试、缓存管理和数据库连接,用户为了更好地完成此类工作,往往会使用动态代理,那么进一步了解动态代理、明确动态代理的使用场景和选择标准则是十分有必要的…

MatrixVT: Efficient Multi-Camera to BEV Transformation for 3D Perception

本文提出了一种高效的多摄像头到鸟瞰图 (BEV) 视图转换方法,用于 3D 感知,称为 MatrixVT。现有的视图转换器要么转换效率低下,要么依赖于特定于设备的操作符,阻碍了 BEV 模型的广泛应用。相比之下,我们的方法仅使用卷积…

QT-空窗口主窗口对话框

1. QMainWindow QMainWindow 用来创建主窗口 主窗口包含: 标题栏(Window title)、菜单栏(MenuBar)、工具栏(ToolBar)、状态栏(StatusBar)、停靠部件(DockWid…

你真的了解ChatGPT吗?深度解读Chat GPT背后的数据风险

随着人工智能技术的快速发展,像ChatGPT这样的语言模型已经成为了我们生活和工作的得力助手。从撰写文章、回答问题到辅助编程,ChatGPT正逐渐改变着人们与科技互动的方式。然而,随着AI的广泛应用,数据安全也成为了不可忽视的重要议…

Maven 父子模块的 pom.xml 文件编写

今天在写课内的实验作业的时候&#xff0c;三个内容要使用的依赖是一样的&#xff0c;于是想使用父子模块来玩玩。 父模块 pom.xml 书写 打包方式 <packaging>pom</packaging> 聚合子模块 <!-- 聚合子模块 --> <modules><module>../one</…