【分布式】一致性哈希和哈希槽

news2024/11/25 0:48:11

当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢?

1. 普通哈希取模法

1.1 直接哈希取模

这是一种最容易想到的方法,使用取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的结果对3取模,得到的结果一定是0、1或者2,正好对应服务器node0、node1、node2,存取数据直接找对应的服务器即可,简单粗暴,完全可以解决上述的问题

在这里插入图片描述

1.2 普通哈希取模法缺陷

取模算法虽然使用简单,但对机器数量取模,在集群扩容和收缩时却有一定的局限性,因为在生产环境中根据业务量的大小,调整服务器数量是常有的事;而服务器数量N发生变化后hash(key)% N计算的结果也会随之变化。

比如:一个服务器节点挂了,计算公式从hash(key)% 3变成了hash(key)% 2,结果会发生变化,此时想要访问一个key,这个key的缓存位置大概率会发生改变,那么之前缓存key的数据也会失去作用与意义,大量缓存在同一时间失效,造成缓存的雪崩,进而导致整个缓存系统的不可用,这基本上是不能接受的。

2. 一致性哈希算法

一致性哈希的出现就是为了解决上面的问题:

一致性hash算法本质上也是一种取模算法,不过,不同于上边按服务器数量取模,一致性hash是对固定值2^32取模。

2.1 Hash环

我们可以将这2 ^ 32个值抽象成一个圆环,圆环的正上方的点代表0,顺时针排列,以此类推,1、2、3、4、5、6……直到2^32-1,而这个由2的32次方个点组成的圆环统称为hash环.

在这里插入图片描述
那么这个hash环和一致性hash算法又有什么关系嘞?我们以三台服务器编号0、1、2为例:

2.2 服务器映射到 Hash环

这个时候计算公式就从hash(key)% N 变成了hash(服务器ip)% 232,使用服务器IP地址进行hash计算,用哈希后的结果对232取模,结果一定是一个0到2^32-1之间的整数,而这个整数映射在hash环上的位置代表了一个服务器,依次将node0、node1、node2三个服务器映射到hash环上

在这里插入图片描述

2.3 key值映射到Hash环

接着在将需要缓存的key对象也映射到hash环上,hash(key)% 2^32

在这里插入图片描述

2.4 对象key映射到服务器

服务器节点和要缓存的key对象都映射到了hash环,那对象key具体应该缓存到哪个服务器上呢?

key->server映射规则:从缓存对象key的位置开始,沿顺时针方向遇到的第一个服务器,便是当前对象将要缓存到的服务器

在这里插入图片描述

2.5 一致性哈希应对扩容与缩容

我们简单了解了一致性hash的原理,那它又是如何优化集群中添加节点和缩减节点,普通取模算法导致的缓存服务,大面积不可用的问题呢?

2.5.1 集群添加节点

先来看看扩容的场景,假如业务量激增,系统需要进行扩容增加一台服务器node-4,刚好node-4被映射到node-1和node-2之间。

此时key1 按照映射规则被重定向到node_4节点,其他节点的映射服务器不发生变化
在这里插入图片描述

2.5.1 集群缩减节点

与增加节点基本一致,假设缩减掉node_0,此时key_3被重定向到node_2,其他key不受影响
在这里插入图片描述
从上边的两种情况发现,当集群中服务器的数量发生改变时,一致性hash算只会影响少部分的数据,保证了缓存系统整体还可以对外提供服务的。

2.6 数据偏斜问题

在服务器节点数量太少的情况下,很容易因为节点分布不均匀而造成数据倾斜问题,如下图被存储的对象大部分在node-1服务器上,导致其他节点资源浪费,系统压力大部分集中在node-4节点上,这样的集群是非常不健康的
在这里插入图片描述
解决数据倾斜的办法也简单,我们就要想办法让节点映射到hash环上时,相对分布均匀一点。

一致性Hash算法引入了一个虚拟节点机制,即对每个服务器节点计算出多个hash值,它们都会映射到hash环上,映射到这些虚拟节点的对象key,最终会缓存在真实的节点上。

虚拟节点的hash计算通常可以采用,对应节点的IP地址加数字编号后缀 hash(i+10.24.23.227) 的方式,举个例子,node-1节点IP为10.24.23.227,计算node-1的hash值

  • hash(110.24.23.227)% 2^32

假设我们给node-1设置三个虚拟节点,node-1#1、node-1#2、node-1#3,对它们进行hash后取模。

  • hash(110.24.23.227)% 2^32

  • hash(210.24.23.227)% 2^32

  • hash(310.24.23.227)% 2^32

需要注意一点,分配的虚拟节点个数越多,映射在hash环上才会越趋于均匀,节点太少的话很难看出效果

2.7 一致哈希的应用

一致性hash在分布式系统中应该是实现负载均衡的首选算法,它的实现比较灵活,既可以在客户端实现,也可以在中间件上实现,比如日常使用较多的缓存中间件memcached和redis集群都有用到它


  • 练习题:基于上文讲解的一致性哈希原理,实现一套一致性哈希方法

3. 哈希槽

3.1 哈希槽定义

学习完哈希槽,我们会发现,一致性哈希算法的缺点在于对于数据分布,节点位置控制并不友好。

因此有人又提出了 “哈希槽”的概念,我们平时经常接触的Redis cluster就选择了哈希槽(slot)来实现流量分发。

同样,Dsjourney提供的分布式系统中,也是选择了这一方案,同学们可以在体验页面进行自己的哈希槽配置:
这里是引用
为了简化同学们的操作,我们在DsJourney中预定义定义了15个槽,槽中的数字代表了存储服务器组(分片服务器组)的组号(gid)。

首先哈希槽其实是两个概念,第一个是哈希算法。redis cluster 的 hash 算法不是简单的 hash(),而是 crc16 算法,一种校验算法。另外一个就是槽位的概念,空间分配的规则。其实哈希槽的本质和一致性哈希算法非常相似,不同点就是对于哈希空间的定义。一致性哈希的空间是一个圆环,节点分布是基于圆环的,无法很好的控制数据分布。而 redis cluster 的槽位空间是自定义分配的,类似于 windows 盘分区的概念。这种分区是可以自定义大小,自定义位置的。

3.2 哈希槽在实际生产中的应用—Redis Cluster

redis cluster 包含了16384个哈希槽,每个 key 通过计算后都会落在具体一个槽位上,而这个槽位是属于哪个存储节点的,则由用户自己定义分配。例如机器硬盘小的,可以分配少一点槽位,硬盘大的可以分配多一点。如果节点硬盘都差不多则可以平均分配。所以哈希槽这种概念很好地解决了一致性哈希的弊端

另外在容错性和扩展性上,表象与一致性哈希一样,都是对受影响的数据进行转移。而哈希槽本质上是对槽位的转移,把故障节点负责的槽位转移到其他正常的节点上。扩展节点也是一样,把其他节点上的槽位转移到新的节点上。

但一定要注意的是,对于槽位的转移和分派,redis 集群是不会自动进行的,而是需要人工配置的。所以 redis 集群的高可用是依赖于节点的主从复制与主从间的自动故障转移。


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

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

相关文章

前端三剑客React框架第一课入门的学习

前端三大框架React框架第一课入门的学习 前端三大框架的介绍 React:由facebook贡献,是一个基于javascript的前端库。它主要关注ui组件的构建,通过virtual dom等技术手段实现高效的渲染优化,可以与各种其他库和框架搭配使用,也有…

作为一个C++新手,我感兴趣的C++开源项目

2023年4月30日,周日晚上。 昨天完成了一个C项目后,想再开始一个C项目,但不知道做什么,于是决定看看有什么好的C开源项目。 今晚在网上逛了一圈后,发现了好多有趣的C开源项目。 参考文章: GitHub Top 10 …

【MySQL】十二,索引的概念

为什么使用索引 提高数据查询的效率。 定义 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取的数据的数据结构。 使用索引的优点 提高数据检索的效率,降低数据库的IO成本。通过创建唯一索引,可以保证数据…

科研闭环指南|学术论文撰写经验总结

前言:最近完成了自己人生中第一篇学术论文长文的撰写,从2023年4月12日完成初稿到2023年4月30日完成终稿这半个多月的时间里,在多位老师与师兄的帮助下,前前后后改了六七个版本,才改到大致满意的最终版(在此…

设计模式——模板模式

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 模板模式 1、基本介绍 2、模板模式解决豆浆制作问题 3、钩子方法 4、Spring 框架AbstractApplicationContext抽象类 模板模式 …

C语言从入门到精通第16天(指针的定义与基本使用)

指针的定义与基本使用 什么是指针?指针变量的定义指针变量的基本使用 什么是指针? 在使用指针之前我们需要对指针进行初步的了解,首先我们要知道什么是指针? 通过前面的学习我们已经知道了内存的存储方式,他是通过一…

【LeetCode股票买卖系列:121. 买卖股票的最佳时机 | 一次遍历 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

在群晖NAS上快速搭建属于自己的Git Server

群晖NAS套件中心是有Git Server套件的,只要在套件中心安装即可。但是需要注意的是: git 相关的命令需要使用 SSH 客户端连接到NAS上进操作。配置git时需要使用 管理员权限账户,而 push / fetch 使用的账户一般都为普通用户,一定要…

ChatGPT提示词工程(一):Guidelines

目录 一、说明二、安装环境三、Guidelines准则一:写出明确而具体的说明方法1:使用分隔符清楚地表示输入的不同部分方法2:用结构化输出:如直接要求它以HTML或者JSON格式输出方法3:请模型检查是否满足条件方法4&#xff…

01-环境搭建 尚筹网

环境搭建 一、项目结构搭建 ​ 模块关系 ​ parent模块仅仅用来确定各个Maven依赖的版本 ​ webui、component、entity模块继承自parent模块 ​ util、reverse模块属于独立工程,不参与继承与聚合 ​ 且webui依赖于component,component依赖于entity…

Cont. TF-IDF (BigData Data Mining)

Cont. 举例 例1 词频 (TF) 是一词语出现的次数除以该文件的总词语数。 假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/1000.03。 一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多…

一些关于单链表的操作

思维导图: 一, 链表 1.1节点的结构 链表是啥样的啊?顾名思义链表就是一种用链子链接起来的表。那这种表是怎么样的啊? 这样的呗: 现在,我们知道了链表的形状了。那我们该如何用编程语言来形成这一种形状…

mysql 安装全过程(linux上二进制包安装)

介绍 mysql 是一种RDBMS 关系型数据库管理系统 Relational Database Management System 关系型数据库将数据保存在不同的表中,而不是放在一个大仓库内,增加了速度,提高了灵活性。 . mysql版本 5.7.x 和 8.0.x 是目前主流。2个…

RT-Thread 在线软件包改为本地软件包的方法

问题描述 RT-Thread 的软件包,使用时,需要手动通过 ENV 工具 更新到 本地的 packages 目录,并且 packages 目录默认不参与 Git 工程管理,软件包多了,并且偶尔需要更改软件包本身的一些代码,这就造成了软件项…

Spring 依赖注入源码

文章目录 依赖注入原始依赖注入方式注解方式寻找注入点注入点进行注入 从BeanFactory中找注入对象总结 依赖注入 具体代码是在AbstractAutowireCapableBeanFactory类的populateBean()方法,此方法中主要做的事情如下: 实例化之后,调用Instan…

【Java校招面试】基础知识(二)——Spring Framework AOP

目录 前言一、Spring Framewwork基础知识二、Spring AOP基础概念1. 切面(Aspect)2. 织入(Weaving)3. 增强(Advice)4. 动态代理 三、JDK动态代理1. 基本用法2. 原理分析 四、CGLib动态代理1. 基本用法2. 原理…

【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(二)

使用Resnet残差网络对图像进行分类 (猫十二分类,模型定义、训练、保存、预测)(二) 目录 (6)、数据集划分 (7)、训练集增强 (8)、装载数据集 &#xff08…

山东专升本计算机第十一章-新一代信息技术

新一代信息技术 物联网 概念 物联网就是物物相连的互联网,其核心和基础仍然是互联网 计算机,互联网之后信息产业发展的第三次浪潮 推入人类进入智能时代,又称物联时代 三大特征 全面感知 可靠传递 智能处理 • 物联网的最核心 技术架…

阿里云g8i服务器ECS通用型服务器CPU处理器性能测评

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器,3.2 GHz睿频,g8i实例采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…

JavaScript 入门(1)

script 标签 <scrtipt> 标签可以插入到HTML中的任何位置在很老的代码中需使用type属性&#xff0c;但是现在的代码中不需要 <script type"text/javascript"><!-- ... //--></script>外部脚本 通过src 属性将脚本添加到HTML中 <script …