深入理解一致性Hash和虚拟节点

news2024/12/26 0:13:03

在分布式系统中架构中我们经常提到一致性哈希算法,那么什么是一致性哈希算法,为什么需要一致性哈希算法呢?

1、为什么需要一致性哈希算法

    假设现在有三台缓存服务器(缓存服务器A、缓存服务器B、缓存服务器C),现在将数据预热到这三台服务器,我们可以使用负载均衡的方法将数据缓存到服务器上,如下图所示:

图片

    通过负载均衡的方式可以把数据均匀的分发到三台缓存服务器上,在读取缓存的热点数据就存在一定的困难(因为不清楚数据被缓存在那台服务器上),读取数据的过程如下所示:

图片

    通过轮询缓存服务器的方式读取缓存的热点数据,此时效率就非常的低了,接口的响应时间也会变长,从而导致用户的体验非常差。

    负载均衡的方案致命的缺点是无法快速的定位数据在哪台服务器上,导致需要轮询服务器来获取数据,为了解决这个痛点便提出使用Hash算法。Hash算法的预热数据的流程如下图:

图片

    将数据的key计算一个hash值,然后将这个hash值和服务器的台数取模,取模之后的结果就决定当前的数据存放在哪台服务器上。获取数据的流程如下:

图片

    读取数据的时候,将数据key同样方式获取hash值,然后将hash值与服务器的台数取模来定位数据在哪台服务器上。但是hash法也存在一个严重的缺陷,假设现在增加/减少服务器数据量,如下图所示:

图片

    我们继续使用:hash(key)% 服务器数量,来定位数据在哪台服务器就存在问题了,因为服务器数量变化导致原先数据定位不准,如下所示:

图片

    假设现在有大量的请求打进来,由于命中缓存服务上没有数据,请求都落到了资源服务器上,由于资源服务器瞬间压力过大可能会导致服务崩溃。

    hash随着服务器的数量变化(增加或减少),定位服务上的缓存的数据位置也会变动,就会导致无法获取数据的问题。为了解决这个问题便提出了一致性hash算法。

2、一致性hash和虚拟节点

图片

    一致性hash算法是对2^32方取模,从0-2^32方计数形成一个圆环,我们称这个圆环为hash环。

    通过hash(服务器的ip) % 2^32 = X;通过这个X值可以定位服务器在圆环上的位置。

    如何确定数据存放在哪个服务器上呢?如下图所示:

图片

    如上的数据A,我们可以使用hash(数据A) % 2^32 = LA;通过LA可以定位数据A在圆环上的位置,然后顺时针方便找距离数据A最近的服务器,发现是服务器A,那么我们将数据A存放到服务器A上。同理数据B也是存放在服务器上A上。

    读取数据也是同样按照hash算法取模的方式来定位服务器,通过这样的方式可以很快地定位数据在哪台服务器上。如下所示:

图片

    假设现在服务器C下线了,如下所示:

图片

    此时数据A定位是没有问题,数据C从原先的服务器C上定位到服务器A上,数据C是无法获取到的。换句话讲,虽然服务器C下线了,但是只是部分数据异常,不会使得整个服务集群数据错乱,数据异常的部分如下所示:

图片

    假设现在增加了一台机器D,那么也只会导致部分数据出现错乱,如下图所示:

图片

    此时我们只需要将错乱的这一部分数据迁移到服务器D上可以实现数据的同步了。理想状态下,一致性hash是很完美的,但是在极端的情况下由于离散型差的问题导致服务器都集中分布在一起,如下图所示:

图片

此时数据又刚好落在服务器C和服务器A之间的区域上,如下图所示:

图片

    这样就导致所有的数据压力都到了服务器A上,服务器B和服务器C就是一个摆设了作用了。如果服务器A挂了,那么整个缓存就失效了,这个就是hash环的倾斜问题。为了解决hash环倾斜问题,于是便引入了虚拟节点,也就是把真实的服务器通过虚拟化的方式复制一些节点出来成为虚拟虚拟节点。如下图所示:

图片

    通过虚拟节点的加入就不会导致所有的数据都到一台机器中,同时虚拟节点越多,缓存数据越均匀。

总结:

(1)一致性hash常用于负载均衡、分布式缓存分区、数据库分库分表等场景。

(2)为防止服务器上的数据倾斜问题,通常增加虚拟节点的方式来让数据更加均匀的分布在机器上。

https://blog.csdn.net/lxy1290439047/article/details/140066853?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22140066853%22%2C%22source%22%3A%22lxy1290439047%22%7D

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

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

相关文章

每日一题——Python实现PAT乙级1059 C语言竞赛(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 代码优化建议 总结 我要更强 优化方法…

fastadmin selectpage下拉框默认选中

修改 /public/assets/libs/fastadmin-selectpage/selectpage.js

C++【引用】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探:了解它的基本概念与用途,需要具体代码示例 随着互联网的快速发展,获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫(Web Scraping)作为一种自动化的数据获取方法,不仅能够快速…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据,能够有效揭示变量之间的关系,为进一步研究和决策提供有力支持。在实际应用中,应结合业务背景、数据特性和统计原则,谨慎解释和应用相关…

基于知识图谱的医药问答系统实战

数据及代码地址见文末 1.项目配置 (1)Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量 启动:neo4j.bat console 第一次启动有默认用户名和密…

数字信号处理教程(1)——简介

考了几天试,终于有时间来继续写了,接下来,我们主要对数字信号处理和通信原理这两本偏于理论书记录自己的简单看法。当然其他大家讲的比较好的地方,我也会摘录下来。 先来看数字信号处理的内容,数字信号处理中有…

Gradio 4.37.1官方教程二:Blocks

文章目录 一、Blocks及事件监听器1.1 Blocks结构1.2 事件监听器的类型1.3 多数据流1.4 多输入组件1.5 多输出组件1.6 更新组件配置1.7 添加示例1.8 连续运行事件1.9 持续运行事件1.9.1 every参数1.9.2 load方法1.9.3 change方法 1.10 收集事件数据1.11 绑定多个触发器到同一函数…

【ai】trition:tritonclient yolov4:ubuntu18.04部署python client成功

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行 client代码远程部署在ubuntu18.0…

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计(AI与学术的交响:ChatGPT辅助下的实验设计新篇章)。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…

如何修改PDF文档的作者名称?

要修改一个 PDF 文档的作者名称,你可以按照以下步骤进行操作: 1. **使用 Adobe Acrobat**(如果有): - Adobe Acrobat 是一个功能强大的 PDF 编辑工具,支持修改文档属性信息,包括作者名称。打开…

SSRF一篇文章实战举例全面学懂

前言 Gopher协议在SSRF漏洞中的深入研究(附视频讲解) - 知乎 (zhihu.com) 上面这篇文章真的写的很好,是目前看过最好的将SSRF(服务端请求伪造)和Gopher协议的内容。 然后这种题型,我记得在之前的文章,金砖里有个云启…

Python 面试【★★★】

欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的?

第二十一课,列表的操作函数

一,len(列表):求列表的长度 当你需要知道一个列表中含有多少个元素时,可以使用len()函数,将列表的变量名放入len()函数的括号中,它将告诉你这个列表中有多少个元素,也就是它的长度! 需要注意的是&#xf…

电脑文件夹里的表格删除了怎样恢复?别急,可这样做

在日常工作中,我们经常会使用到各种电子表格来记录、整理和分析数据。然而,有时由于操作失误或其他原因,我们可能会不小心将电脑文件夹中的重要表格删除。面对这种情况,许多人可能会感到惊慌失措,担心数据丢失会给工作…

试析C#编程语言的特点及功能

行步骤,而不必创建新方法。其声明方法是在实例化委托基础上,加一对花括号以代表执行范围,再加一个分号终止语句。 2.3.3 工作原理 C#编译器在“匿名”委托时会自动把执行代码转换成惟一命名类里的惟一命名函数。再对存储代码块的委托进行设…

吉时利 Keithley2470 图形数字源表

Keithley2470吉时利图形SMU数字源表 2470 型图形化高压 SourceMeter SMU 2470 高压 SMU 凭借其 1100V 和 10fA 能力,经优化用于检定和测试高电压、低泄漏器件、材料和模块,如碳化硅 (SiC)、氮化镓(GaN)、功率 MOSFET、瞬态抑制器件、电路保护器件、功率…

5个大气的wordpress付费主题

Sesko赛斯科wordpress外贸主题 适合用于重型机械设备公司建外贸官方网站的橙红色wordpress外贸主题。 https://www.jianzhanpress.com/?p5886 Polar钋啦wordpress外贸主题 制造业wordpress网站模板,适合生产制造企业官方网站使用的wordpress外贸主题。 https:/…